支付宝人脸实名认证

/ 代码

支付宝人脸认证

Maven引入jar

        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>${alipay.version}</version>
        </dependency>

代码集成

创建AliFace.java

    /**
     * 获取certifyId,后续通过次ID进行一系列操作
     *
     * @param certNo   身份证号码
     * @param name   真实姓名
     */
    public static String get(String certNo,String name) {
        AlipayClient alipayClient = new DefaultAlipayClient(
                properties.getGatewayUrl(),
                properties.getAppId(),
                properties.getMerchantPrivateKey(),
                properties.getFormat(),
                properties.getCharset(),
                properties.getAlipayPublicKey(),
                properties.getSignSype());
        AlipayUserCertifyOpenInitializeRequest request = new AlipayUserCertifyOpenInitializeRequest();
        //构造身份信息json对象
        JSONObject identityObj = new JSONObject();
        //身份类型,必填,详细取值范围请参考接口文档说明
        identityObj.put("identity_type", "CERT_INFO");
        //证件类型,必填,详细取值范围请参考接口文档说明
        identityObj.put("cert_type", "IDENTITY_CARD");
        //真实姓名,必填
        identityObj.put("cert_name", apiRequest.getName());
        //证件号码,必填
        identityObj.put("cert_no", apiRequest.getCertNo());
        //构造商户配置json对象
        JSONObject merchantConfigObj = new JSONObject();
        // 设置回调地址,必填. 如果需要直接在支付宝APP里面打开回调地址使用alipay协议,参考下面的案例:appId用固定值 20000067,url替换为urlEncode后的业务回跳地址
        // alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fapp.cqkqinfo.com%2Fcertify%2FzmxyBackNew.do
        merchantConfigObj.put("return_url", properties.getFaceUrl());
        //构造身份认证初始化服务业务参数数据
        JSONObject bizContentObj = new JSONObject();
        //商户请求的唯一标识,推荐为uuid,必填
        String uuid = RandomUtil.randomString(26);
        bizContentObj.put("outer_order_no", uuid);
        bizContentObj.put("biz_code", "FACE");
        bizContentObj.put("identity_param", identityObj);
        bizContentObj.put("merchant_config", merchantConfigObj);
        request.setBizContent(bizContentObj.toString());
        //发起请求
        AlipayUserCertifyOpenInitializeResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        if (response.isSuccess()) {
            System.out.println("调用成功");
            //接口调用成功,从返回对象中获取certify_id
            String certifyId = response.getCertifyId();
            return certifyId;
            //执行后续流程...
        } else {
            System.out.println("调用失败");
            return null;
        }

    }

    /**
     * 生成认证URL
     * @param certifyId  上一步获取的ID
     */
    public static String faceyAliPay(String certifyId) {
        try {
            //AlipayUserCertifyOpenInitializeResponse aoResponse = this.get(faceRequest);
            //获取alipay client
            AlipayClient alipayClient = new DefaultAlipayClient(
                    properties.getGatewayUrl(),
                    properties.getAppId(),
                    properties.getMerchantPrivateKey(),
                    properties.getFormat(),
                    properties.getCharset(),
                    properties.getAlipayPublicKey(),
                    properties.getSignSype());
            AlipayUserCertifyOpenCertifyRequest request = new AlipayUserCertifyOpenCertifyRequest();
            //设置certifyId
            JSONObject bizContentObj = new JSONObject();
            bizContentObj.put("certify_id", certifyId);
            request.setBizContent(bizContentObj.toString());
            //生成请求链接,这里一定要使用GET模式
            AlipayUserCertifyOpenCertifyResponse response = alipayClient.pageExecute(request, "GET");
            String certifyUrl = null;
            if(response.isSuccess()){
                System.out.println("开始认证服务调用成功");
                certifyUrl = response.getBody();
                return certifyUrl;
                //执行后续流程...
            } else {
                System.out.println("调用失败");
            }
       } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 查询是否认证成功
     * @param certifyId  上一步获取的ID
     */
    public static AlipayUserCertifyOpenQueryResponse isAuth(String certifyId) {
        AlipayClient alipayClient = new DefaultAlipayClient(
                properties.getGatewayUrl(),
                properties.getAppId(),
                properties.getMerchantPrivateKey(),
                properties.getFormat(),
                properties.getCharset(),
                properties.getAlipayPublicKey(),
                properties.getSignSype());
        AlipayUserCertifyOpenQueryRequest request = new AlipayUserCertifyOpenQueryRequest();
        request.setBizContent("{" +
                "\"certify_id\":\""+certifyId+"\"" +
                "  }");
        AlipayUserCertifyOpenQueryResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        if(response.isSuccess()){
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return response;
    }

注意:通过支付宝扫码进行认证过后,需要掉用查询是否认证成功接口返回的passed参数进行判断是否认证成功,若成功则执行业务代码。

接口文档地址:https://docs.open.alipay.com/api_2/alipay.user.certify.open.certify/#

前端

PC端支付宝认证

  1. 通过【个人信息(如姓名、身份证号 等)】获取【支付宝认证流水号
  2. 通过【支付宝认证流水号】生成【支付宝认证二维码
  3. 通过【支付宝认证流水号】查询认证结果

如支付宝回调发生变化可相应优化认证逻辑;主流程:用户信息换取用于认证的二维码

外部 H5 唤起支付宝认证

  1. 通过【个人信息(如姓名、身份证号 等)】获取【支付宝认证流水号
  2. 通过【支付宝认证流水号】获取【支付宝实名认证的 url
  3. 通过拼接【支付宝实名认证的 url】 唤起支付宝并进入实名认证流程
//**url**为通过流水号获取的实名认证url
 const certifyUrl = alipays://platformapi/startapp?appId=20000067&url=encodeURIComponent(**url**);
  1. 通过【支付宝认证流水号】查询认证结果

支付宝内部 H5 唤起支付宝认证

function ready(callback) {
  // 如果jsbridge已经注入则直接调用
  if (window.AlipayJSBridge) {
    callback && callback();
  } else {
    // 如果没有注入则监听注入的事件
    document.addEventListener('AlipayJSBridgeReady', callback, false);
  }
}

// startBizService 接口仅在支付宝 10.0.15 及以上支持
// 需要接入者自行做下版本兼容处理 !!
function startAPVerify(options, callback) {
  AlipayJSBridge.call('startBizService', {
    name: 'open-certify',
    param: JSON.stringify(options),
  }, callback);
}

/**
 * 唤起认证流程
 * 参数: certifyId、url 需要通过支付宝 openapi 开放平台网关接口获取
 * 详细说明可查看文档下方的参数说明
 **/
ready(() => {
  // 需要确保在 AlipayJSBridge ready 之后才调用
  startAPVerify({ certifyId, url }, verifyResult => {
    // 认证结果回调触发, 以下处理逻辑为示例代码,开发者可根据自身业务特性来自行处理
    if (verifyResult.resultStatus === '9000') {
      // 验证成功,接入方在此处处理后续的业务逻辑
      // ...
      return;
    }
    
    // 用户主动取消认证
    if (verifyResult.resultStatus === '6001') {
      // 可做下 toast 弱提示
      return;
    }
    
    const errorCode = verifyResult.result && verifyResult.result.errorCode;
    // 其他结果状态码判断和处理 ...
  });
});

支付宝认证成功后会拉起手机浏览器访问配置的回调网址,请配置相应地址