本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
在H5页面接入金融级实人认证方案时,开发者需要在后端服务器集成SDK,以便调用InitFaceVerify接口获取用于浏览器进行实人认证的认证链接CertifyUrl。本文将详细介绍服务端SDK的安装方式、所调接口的参数说明以及实际调用接口示例说明。
集成须知
服务接入点
目前支持的接入地域如下表所示。
建议您参考本文示例代码,配置主备地域Endpoint。在主Endpoint发生故障时可以自动切换到备用Endpoint,保证系统的持续可用性。
地域 | 服务地址 | VPC地址 | 全局接入地址 |
华东2(上海) | IPv4:cloudauth.cn-shanghai.aliyuncs.com | cloudauth-vpc.cn-shanghai.aliyuncs.com |
|
IPv6:cloudauth-dualstack.aliyuncs.com | |||
华北2(北京) | IPv4:cloudauth.cn-beijing.aliyuncs.com | cloudauth-vpc.cn-beijing.aliyuncs.com | |
IPv6:cloudauth-dualstack.cn-beijing.aliyuncs.com |
SDK安装与源码下载
您可根据业务实际的技术选型,选择合适的SDK语言进行集成。
支持语言 | SDK下载地址 | Github源码地址 |
Java | ||
Python | ||
Typescript | ||
Go | ||
PHP | ||
C# | ||
C++ |
QPS限量
API独享QPS限量,详情请参见服务端接口QPS限量说明。
服务端需要集成的两个接口
InitFaceVerify-发起认证请求
每次开始认证前通过调用本接口获取用于浏览器进行实人认证的认证链接CertifyUrl
和每次认证的唯一CertifyId
。
须将此接口的请求封装为开始认证的业务接口,供网页端调用。
请求参数
名称 | 类型 | 是否必选 | 描述 | 示例值 |
SceneId | Long | 是 | 要接入的认证场景ID。该ID在控制台创建认证场景后自动生成。 | 1000000006 |
OuterOrderNo | String | 是 | 您自定义的业务唯一标识,用于后续定位和排查问题使用。 支持长度为32位的字母和数字组合,请确保唯一。 | e0c34a77f5ac40a5aa5e6ed20c353888 |
ProductCode | String | 是 | 要接入的认证方案。 唯一取值:ID_PRO。 | ID_PRO |
Model | String | 是 | 活体检测类型,取值: 说明 活体检测类型仅支持下列取值,暂不支持自定义动作或组合。
| PHOTINUS_LIVENESS |
CertType | String | 是 | 不同证件类型,取值均为IDENTITY_CARD。 | IDENTITY_CARD |
CertName | String | 是 | 您的终端用户的真实姓名。 | 张三 |
CertNo | String | 是 | 您的终端用户的证件号码。 | 330103xxxxxxxxxxxx |
ReturnUrl | String | 是 | 认证结束后回跳页面的链接地址。 | https://www.aliyun.com |
MetaInfo | String | 是 | MetaInfo环境参数。实际环境需要通过JS文件,调用函数 |
警告 该示例仅供参考,实际集成中不能直接应用,否则会导致无法正常获取到CertifyUrl。 |
Mobile | String | 否 | 您终端用户的手机号码。 | 130xxxxxxxx |
Ip | String | 否 | 您终端用户的IP。 | 47.100.XX.XX |
UserId | String | 否 | 您自定义的用户ID(最长100个字符),请保持唯一。 | 123456789 |
CallbackUrl | String | 否 | 认证结果的回调通知地址,回调请求方式默认为GET,回调地址必须以 重要
| https://www.aliyun.com |
CallbackToken | CallbackToken | 否 | 安全Token,由您自行生成,用于防重复、防篡改校验。 如果设置了该值,会在回调地址中显示CallbackToken字段。 | NMjvQanQgplBSaEI0sL86WnQplB |
CertifyUrlType | String | 否 | Web SDK设备类型。取值WEB或者H5。 说明 只支持Web SDK设备类型。 | WEB |
CertifyUrlStyle | String | 否 | 返回CertifyUrl类型,包括:
| L |
AuthId | String | 否 | 用户授权ID,最大长度为64位字符。 | 92d46b9e9e2d703f2897f350d5bd4149 |
EncryptType | String | 否 | 加密类型。为空表示不加密。 如开启加密传输,需传入加密算法。目前仅支持SM2国密算法。 如需传入加密算法,需对CertName和CertNo进行加密,并传入加密后的密文。 有关参数加密的更多信息,请参见参数加密说明。 | SM2 |
ProcedurePriority | String | 否 | 移动端H5方式认证出现WebRTC或者Webassembly不兼容时的降级配置。
| url |
FaceGuardOutput | String | 否 | 设备助手标签种类,取值:DeviceRisk。 说明
| DeviceRisk |
RarelyCharacters | String | 否 | 是否开启生僻字模式:
| Y |
uiCustomUrl | String | 否 | UI配置文件URL。 您可以在Web SDK UI自定义配置说明中查看完整配置。 | www.aliyundoc.com |
VideoEvidence | String | 否 | 是否开启视频存证:
说明 因为视频文件较大,当网络不稳定时系统会丢弃视频文件优先保障认证必要图片传输,建议您业务上设置为弱依赖视频。 | false |
CameraSelection | String | 否 | 是否开启摄像头选择功能:
说明 该功能仅针对PC端集成模式生效,开启后支持用户自主选择摄像头认证。 | N |
SuitableType | String | 否 | 适老化配置参数,针对每笔认证请求生效,您可以根据自有App的业务属性、客群分布、操作特性等条件对于每笔认证请求选择不同的参数,包括以下选项,默认为0。
说明
| 0 |
needMultiFaceCheck | String | 否 | 终端检测到多人脸时是否拦截,取值:
| Y |
返回数据
名称 | 类型 | 描述 | 示例值 |
RequestId | String | 请求ID。 | 130A2C10-B9EE-4D84-88E3-5384FF039795 |
Code | String | 返回码,200 指接口响应成功。 您可以在返回Code和Message说明中查看不同 Code 的详细描述。 | 200 |
Message | String | 请求信息的响应消息,对 Code(返回码)的简短描述。 | success |
ResultObject.CertifyId | String | 实人认证唯一标识。 重要 CertifyId字段为计费统计字段,为了方便后续核对账单,请您在本地留存该字段信息。 初始化接口返回的认证CertifyId在30分钟有效且仅能认证提交一次,请您在有效期内使用,避免重复使用。 | 91707dc296d469ad38e4c5efa6a0f24b |
ResultObject.CertifyUrl | String | Web浏览器进行实人认证的URL,认证结束后根据入参ReturnUrl进行跳转。 警告
| https://t.aliyun.com/**** |
DescribeFaceVerify-获取认证详细数据
当您收到回调通知之后,可以在服务端通过该接口获取相应的认证状态和认证资料。
虽然InitFaceVerify在认证结束后跳转ReturnUrl时会携带认证结果,但考虑到浏览器的安全性,建议调用此接口进行认证结果的二次验证。
请求参数
名称 | 类型 | 是否必选 | 描述 | 示例值 |
SceneId | Long | 是 | 认证场景ID。 | 1000000006 |
CertifyId | String | 是 | 实人认证唯一标识。 | 91707dc296d469ad38e4c5efa6a0f24b |
返回数据
名称 | 类型 | 描述 | 示例值 |
RequestId | String | 请求ID。 | 130A2C10-B9EE-4D84-88E3-5384FF039795 |
Code | String | 返回码,200 指接口响应成功。 您可以在Code中查看不同 Code 的详细描述。 | 200 |
Message | String | 请求信息的响应消息,对 Code(返回码)的简短描述。 | success |
ResultObject.Passed | String | 认证结果:
重要 认证结果判定以此字段为准。 | T |
ResultObject.SubCode | String | 认证结果描述。 您可以在ResultObject.SubCode错误码说明中查看不同状态码的描述和处理建议。 说明 判断认证结果请以 ResultObject.Passed 字段为准。 | 200 |
ResultObject.IdentityInfo | String | 认证的主体信息,一般的认证场景返回为空。 | null |
ResultObject.DeviceToken | String | 设备Token。 | McozS1ZWRcRZStlERcZZo_QOytx5jcgZoZJEoRLOxxxxxxx |
ResultObject.DeviceRisk | String | 设备风险标签。 | VirtualBrowser 说明 多个设备风险标签以半角逗号(,)分隔。 您可以通过设备风险标签了解所有标签及其含义。 |
ResultObject.MaterialInfo | String | 人脸认证主体附件信息,包含人脸质量、人脸攻击、人脸或OCR图片以及意愿认证等数据信息。 | |
ResultObject.UserInfo | String | 记录在生僻字模式下用户输入的身份信息与对应编码。返回数据为JSON格式字符串,姓名中无生僻字返回为空字符串。
|
|
判断认证结果请以ResultObject.Passed字段为准。
SDK调用示例
阿里云提供了OpenAPI门户,可以使用网页或命令行方式预先验证接口,您可以通过下面的链接进入调试:
在集成操作前,默认您已经开通了服务并获取了AccessKey和认证场景ID,这两个参数是调用接口所必需的。如果没有,请参考前提条件获取。
SDK集成
Java语言为例,要求JDK 1.8及以上版本。
在pom.xml中添加如下依赖,即可在Maven工程中使用SDK。
Java SDK依赖。以下依赖版本仅供参考,建议在实际配置时获取最新依赖版本。
<dependency> <groupId>com.aliyun</groupId> <artifactId>cloudauth20190307</artifactId> <version>2.7.2</version> </dependency>
身份验证依赖。请查看ChangeLog.txt获取所有已发布的版本列表(建议使用最新的版本)。
<dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency>
说明本示例通过阿里云Credentials工具从环境变量中读取AccessKey,来实现API访问的身份验证。您需要提前在系统配置环境变量,具体操作,请参见身份验证配置。
接口调用示例。
调用示例中仅设定了必要参数,详细参数请参见InitFaceVerify-发起认证请求和DescribeFaceVerify-获取认证详细数据。
重要代码示例仅展示最基础的接口调用能力,实际使用时请根据业务需求情况加以优化和重构。
例如,代码中变量名为credentialClient、config、client等通用对象在实际使用时,建议根据业务需求情况优化为单例模式,以提升性能。这些对象在示例代码中标有建议使用单例模式的字样。
InitFaceVerify接口调用示例
import java.util.Arrays; import java.util.List; import com.aliyun.cloudauth20190307.Client; import com.aliyun.cloudauth20190307.models.*; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; public class InitFaceVerify { // 使用单例模式优化性能 private static com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(); public static void main(String[] args) throws Exception { InitFaceVerifyRequest request = new InitFaceVerifyRequest(); // 场景ID+L。 request.setSceneId(100000xxxxL); // 设置商户请求的唯一标识。 request.setOuterOrderNo("xxxx"); // 认证方案。 request.setProductCode("ID_PRO"); // 模式。 request.setModel("LIVENESS"); request.setCertType("IDENTITY_CARD"); request.setCertName("张先生"); request.setCertNo("xxxx"); // MetaInfo环境参数,此参数应由前端js获取并传入。 request.setMetaInfo("{}"); //业务页面回跳的目标地址。 request.setReturnUrl("https://www.aliyundoc.com"); InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request); response.getBody().getRequestId(); response.getBody().getResultObject().getCertifyId(); 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 lastResponse; }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。 // 建议使用单例模式 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); } }
DescribeFaceVerify接口调用示例
import java.util.Arrays; import java.util.List; 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; public class DescribeFaceVerify { // 使用单例模式优化性能 private static com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(); public static void main(String[] args) throws Exception { // 创建API请求并设置参数。 DescribeFaceVerifyRequest request = new DescribeFaceVerifyRequest(); // 场景ID+L。 request.setSceneId(0L); // CertifyId在InitFaceVerify接口的返回值中。 request.setCertifyId("xxxx"); DescribeFaceVerifyResponse response = describeFaceVerifyAutoRoute(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 lastResponse; } catch (Exception e) { 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。 // 建议使用单例模式 Config config = new Config(); config.setCredential(credentialClient); config.setEndpoint(endpoint); // 建议使用单例模式 Client client = new Client(config); RuntimeOptions runtime = new RuntimeOptions(); runtime.readTimeout = 10000; runtime.connectTimeout = 10000; return client.describeFaceVerifyWithOptions(request, runtime); } }