支付宝小程序人脸认证/支付宝身份验证

前言

人脸认证的有两个

image-20240923102607715

可以通过下面的链接查看开通的是哪个

https://b.alipay.com/page/product-workspace/all-product

两者的区别

https://opendocs.alipay.com/open/02zlo2

image-20240923105405455

文档上人脸认证是没有小程序端的,但是实际是有的,是官方后续添加支持的,文档没更新。

两者如果在小程序上用

认证的姓名和身份证号要求和登录的支付宝绑定的姓名和身份证保持一致。

人脸认证在移动应用和网页应用上使用时则没有上面的要求。

支付宝身份验证

https://opendocs.alipay.com/open/03oebe?pathHash=23ac7ae7&ref=api

这个和人脸识别在服务端调用是不一样的,在小程序端是一样的。

注意

认证的姓名和身份证号要求和登录的支付宝绑定的姓名和身份证保持一致。

服务端-初始化身份认证单据号

初始化身份认证单据号 返回certify_id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.domain.OpenCertifyMerchantConfig;
import com.alipay.api.domain.OpenCertifyIdentityParam;
import com.alipay.api.request.AlipayUserCertifyOpenInitializeRequest;
import com.alipay.api.response.AlipayUserCertifyOpenInitializeResponse;
import com.alipay.api.domain.AlipayUserCertifyOpenInitializeModel;

import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;

public class AlipayUserCertifyOpenInitialize {

public static void main(String[] args) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());

// 构造请求参数以调用接口
AlipayUserCertifyOpenInitializeRequest request = new AlipayUserCertifyOpenInitializeRequest();
AlipayUserCertifyOpenInitializeModel model = new AlipayUserCertifyOpenInitializeModel();

// 设置认证场景码
model.setBizCode("FACE");

// 设置身份信息
OpenCertifyIdentityParam identityParam = new OpenCertifyIdentityParam();
identityParam.setCertType("IDENTITY_CARD");
identityParam.setCertName("张三");
identityParam.setCertNo("260104197909275964");
identityParam.setIdentityType("CERT_INFO");
model.setIdentityParam(identityParam);

// 设置商户请求的唯一标识
model.setOuterOrderNo("ZGYD201809132323000001234");

// 设置商户个性化配置
OpenCertifyMerchantConfig merchantConfig = new OpenCertifyMerchantConfig();
merchantConfig.setFaceReserveStrategy("reserve");
merchantConfig.setReturnUrl("https://xxx");
model.setMerchantConfig(merchantConfig);

request.setBizModel(model);
// 第三方代调用模式下请设置app_auth_token
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");

AlipayUserCertifyOpenInitializeResponse response = alipayClient.execute(request);
System.out.println(response.getBody());

if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
}

private static AlipayConfig getAlipayConfig() {
String privateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->";
String alipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->";
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
return alipayConfig;
}
}

服务端-生成认证URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.response.AlipayUserCertifyOpenCertifyResponse;
import com.alipay.api.domain.AlipayUserCertifyOpenCertifyModel;
import com.alipay.api.request.AlipayUserCertifyOpenCertifyRequest;

import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;

public class AlipayUserCertifyOpenCertify {

public static void main(String[] args) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());

// 构造请求参数以调用接口
AlipayUserCertifyOpenCertifyRequest request = new AlipayUserCertifyOpenCertifyRequest();
AlipayUserCertifyOpenCertifyModel model = new AlipayUserCertifyOpenCertifyModel();

// 设置本次申请操作的唯一标识
model.setCertifyId("OC201809253000000393900404029253");

request.setBizModel(model);
// 第三方代调用模式下请设置app_auth_token
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");

AlipayUserCertifyOpenCertifyResponse response = alipayClient.pageExecute(request, "GET");
// 如果需要返回POST请求,请使用
//AlipayUserCertifyOpenCertifyResponse response = alipayClient.pageExecute(request, "POST");
String pageRedirectionData = response.getBody();
System.out.println(pageRedirectionData);

if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
}

private static AlipayConfig getAlipayConfig() {
String privateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->";
String alipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->";
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
return alipayConfig;
}
}

小程序-进行认证

根据第1步的certify_id和第2步的url,小程序上进行认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
my.startAPVerify({
url: this.certifyUrl,
certifyId: this.certifyId,
success: async (res) => {
if (res.resultStatus === '9000') {
uni.showToast({
title: '身份验证成功',
duration: 2000
});
}

// 用户主动取消认证
if (res.resultStatus === '6001') {
uni.showToast({
title: '用户取消身份验证',
duration: 2000
});
}
},
fail: (res) => {
uni.showToast({
title: '人像认证失败',
duration: 2000
});
},
complete: (res) => {}
});

小程序可以在本地提示成功后调用后台接口传入certifyId获取认证结果,后台返回成功才算认证成功。

服务端-查询认证结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.request.AlipayUserCertifyOpenQueryRequest;
import com.alipay.api.domain.AlipayUserCertifyOpenQueryModel;
import com.alipay.api.response.AlipayUserCertifyOpenQueryResponse;

import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;

public class AlipayUserCertifyOpenQuery {

public static void main(String[] args) throws AlipayApiException {
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());

// 构造请求参数以调用接口
AlipayUserCertifyOpenQueryRequest request = new AlipayUserCertifyOpenQueryRequest();
AlipayUserCertifyOpenQueryModel model = new AlipayUserCertifyOpenQueryModel();

// 设置本次申请操作的唯一标识
model.setCertifyId("OC201809253000000393900404029253");

request.setBizModel(model);
// 第三方代调用模式下请设置app_auth_token
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");

AlipayUserCertifyOpenQueryResponse response = alipayClient.execute(request);
System.out.println(response.getBody());

if (response.isSuccess()) {
System.out.println("调用成功");
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
}

private static AlipayConfig getAlipayConfig() {
String privateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->";
String alipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->";
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
return alipayConfig;
}
}

报错

接口调用权限不足,解决方案:https://open.alipay.com/api/errCheck?traceId=0b44da2d17274573282387437e9b16&source=openapi

调用权限不足 要么是没开通,要么就是余额不足 可以核实下账号是否有余额

人脸认证

https://opendocs.alipay.com/open/0dqjce?pathHash=1a3e70ce&ref=api

认证流程

1723451556382-28982043-f471-4145-b675-9ca7a1d5ea77

小程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 唤起认证流程
* 参数: certifyId、url 需要通过支付宝 openapi 开放平台网关接口获取
* 详细说明可查看文档下方的参数说明
**/

let url = '';
let certifyId = "";
my.startAPVerify({
url: url,
certifyId: certifyId,
success: function (res) {
console.log('success', res)
},
fail: function (res) {
console.log('fail', res)
},
complete: function (res) {
console.log('complete', res)
}
})