实现思路:
完成该实人认证需要前后端进行配合,首先前端发送请求到后端,由后端发送请求调用阿里云的InitFaceVerify接口,获取到CertifyId。将CertifyId传给前端,前端再将次发送请求(携带CertifyId)到后端,调用DescribeFaceVerify接口,查询验证结果
实现步骤(仅展示阿里云配置及java代码)
一:获取认证场景ID
(1):开通金融级实人认证服务
登录实人认证产品页面,单击立即开通金融级实人。
登录链接:实人认证_身份认证系统_身份验证平台_人脸识别技术-阿里云
在金融级实人认证(按量计费)页面,勾选金融级实人认证(按量计费)服务协议,单击立即开通。
(2):创建RAM用户,并授予对应权限
首先创建RAM用户
然后为RAM添加权限两个权限:AliyunYundunCloudAuthFullAccess和AliyunAntCloudAuthFullAccess(我这里省略了权限添加的详细步骤,不知道的老铁可以去官网自己摸索一下)
(3):添加认证场景,并获取认证场景ID
开通金融级实人认证服务后,就可以添加认证场景了
添加认证场景链接:https://yundun.console.aliyun.com/?spm=a2c4g.11186623.0.0.8b4e56bfzmVkmO&p=cloudauth#/overview
在这里获取认证场景ID
二:代码实现
1:导入maven依赖:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>cloudauth20190307</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.0</version>
</dependency>
2:调用InitFaceVerify接口(在参数正确且完整的情况下,下面的main方法可直接运行。可根据业务对main方法进行修改,然后获取CertifyId)
import com.aliyun.cloudauth20190307.Client;
import com.aliyun.cloudauth20190307.models.InitFaceVerifyRequest;
import com.aliyun.cloudauth20190307.models.InitFaceVerifyResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Arrays;
import java.util.List;
public class InitFaceVerify {
/**
* @param metaInfo:MetaInfo环境参数(通过客户端SDK获取)
* @return response.getBody().getRequestId():请求ID
* @return response.getBody().getCode():请求状态码(200代表成功)
* @return response.getBody().getMessage():请求信息
* @return response.getBody().getResultObject().getCertifyId():返回的唯一标识
*/
public static void main(String[] args) throws Exception {
InitFaceVerifyRequest request = new InitFaceVerifyRequest();
// 认证场景ID+L。
request.setSceneId(0L);
// 设置商户请求的唯一标识。(请自己生成一个不超过32位数的数字及字母字符串)
request.setOuterOrderNo("xxxx");
// 认证方案。(此处为固定值,不需要修改)
request.setProductCode("LR_FR");
//用户ID,根据业务自行填充
request.setUserId("12345xxxx");
// 模式。(LIVENESS(默认):眨眼动作活体检测。PHOTINUS_LIVENESS:眨眼动作活体+炫彩活体双重检测。MULTI_ACTION:多动作活体检测。当前为眨眼+任意摇头检测。)
request.setModel("LIVENESS");
//非必需值,证件类型,目前仅支持IDENTITY_CARD值(身份证)
//request.setCertType("IDENTITY_CARD");
//真实姓名
//request.setCertName("张三");
//真实身份证号码
//request.setCertNo("xxxx");
// MetaInfo环境参数(此参数由前端传入)
//可用“{"zimVer":"3.0.0","appVersion": "1","bioMetaInfo": "4.1.0:1150****,0","appName": "com.aliyun.antcloudauth","deviceType": "ios","osVersion": "iOS 10.3.2","apdidToken": "","deviceModel": "iPhone9,1"}”进行测试使用
request.setMetaInfo("xxxxxx");
// 推荐,支持服务路由。
InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request);
System.out.println(response.getBody().getRequestId());
System.out.println(response.getBody().getCode());
System.out.println(response.getBody().getMessage());
System.out.println(response.getBody().getResultObject() == null ? null
: response.getBody().getResultObject().getCertifyId());
}
private static InitFaceVerifyResponse initFaceVerifyAutoRoute(InitFaceVerifyRequest request) {
// 第一个为主区域Endpoint,第二个为备区域Endpoint。
List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com");
InitFaceVerifyResponse lastResponse = null;
for (int i=0; i<endpoints.size(); i++) {
try {
InitFaceVerifyResponse response = initFaceVerify(endpoints.get(i), request);
lastResponse = response;
// 服务端错误,切换到下个区域调用。
if(response != null){
if(500 == response.getStatusCode()){
continue;
}
if(response.getBody() != null){
if("500".equals(response.getBody().getCode())){
continue;
}
}
}
return response;
} catch (Exception e) {
e.printStackTrace();
if(i == endpoints.size()-1){
throw new RuntimeException(e);
}
}
}
return lastResponse;
}
private static InitFaceVerifyResponse initFaceVerify(String endpoint, InitFaceVerifyRequest request)
throws Exception {
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// 本示例通过阿里云Credentials工具从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/378657.html。
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
config.setEndpoint(endpoint);
// 设置http代理。
//config.setHttpProxy("http://xx.xx.xx.xx:xxxx");
// 设置https代理。
//config.setHttpsProxy("https://xx.xx.xx.xx:xxxx");
Client client = new Client(config);
// 创建RuntimeObject实例并设置运行参数。
RuntimeOptions runtime = new RuntimeOptions();
runtime.readTimeout = 10000;
runtime.connectTimeout = 10000;
return client.initFaceVerifyWithOptions(request, runtime);
}
}
3:调用DescribeFaceVerify接口查询验证结果(在参数正确且完整的情况下,下面的main方法可直接运行。可根据业务对main方法进行修改,然后获取查询验证结果)
import com.aliyun.cloudauth20190307.Client;
import com.aliyun.cloudauth20190307.models.DescribeFaceVerifyRequest;
import com.aliyun.cloudauth20190307.models.DescribeFaceVerifyResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Arrays;
import java.util.List;
public class DescribeFaceVerify {
public static void main(String[] args) throws Exception {
// 通过以下代码创建API请求并设置参数。
DescribeFaceVerifyRequest request = new DescribeFaceVerifyRequest();
// 请输入场景ID+L。
request.setSceneId(0L);
//由前端传入的certifyId
request.setCertifyId("xxxx");
// 推荐,支持服务路由。
DescribeFaceVerifyResponse response = describeFaceVerifyAutoRoute(request);
// 不支持服务自动路由。
//DescribeFaceVerifyResponse response = describeFaceVerify("cloudauth.cn-shanghai.aliyuncs.com", request);
System.out.println(response.getBody().getRequestId());
System.out.println(response.getBody().getCode());
System.out.println(response.getBody().getMessage());
System.out.println(
response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getPassed());
System.out.println(
response.getBody().getResultObject() == null ? null : response.getBody().getResultObject().getSubCode());
System.out.println(
response.getBody().getResultObject() == null ? null
: response.getBody().getResultObject().getIdentityInfo());
System.out.println(
response.getBody().getResultObject() == null ? null
: response.getBody().getResultObject().getDeviceToken());
System.out.println(
response.getBody().getResultObject() == null ? null
: response.getBody().getResultObject().getMaterialInfo());
}
private static DescribeFaceVerifyResponse describeFaceVerifyAutoRoute(DescribeFaceVerifyRequest request) {
// 第一个为主区域Endpoint,第二个为备区域Endpoint。
List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com");
DescribeFaceVerifyResponse lastResponse = null;
for (int i=0; i<endpoints.size(); i++) {
try {
DescribeFaceVerifyResponse response = describeFaceVerify(endpoints.get(i), request);
lastResponse = response;
// 服务端错误,切换到下个区域调用。
if(response != null){
if(500 == response.getStatusCode()){
continue;
}
if(response.getBody() != null){
if("500".equals(response.getBody().getCode())){
continue;
}
}
}
return response;
} catch (Exception e) {
e.printStackTrace();
if(i == endpoints.size()-1){
throw new RuntimeException(e);
}
}
}
return lastResponse;
}
private static DescribeFaceVerifyResponse describeFaceVerify(String endpoint, DescribeFaceVerifyRequest request)
throws Exception {
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
//本示例通过阿里云Credentials工具从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/378657.html。
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
config.setEndpoint(endpoint);
// 设置http代理。
//config.setHttpProxy("http://xx.xx.xx.xx:xxxx");
// 设置https代理。
//config.setHttpsProxy("http://xx.xx.xx.xx:xxxx");
Client client = new Client(config);
// 创建RuntimeObject实例并设置运行参数。
RuntimeOptions runtime = new RuntimeOptions();
runtime.readTimeout = 10000;
runtime.connectTimeout = 10000;
return client.describeFaceVerifyWithOptions(request, runtime);
}
}
到这里就结束了,最后需要提醒大家的是:在测试的时候可能会报RAM无权限,这是因为你在创建RAM的时候权限可能给错了对象