本文介绍在金融级实人认证方案纯服务端接入场景下,如何下载和集成适合不同编程语言的SDK,并调用OpenAPI的示例流程。
服务端需要集成的OpenAPI
金融级实人认证方案纯服务端接入场景,支持照片实人认证和视频实人认证,请您通过实际需求配置参数。
ContrastFaceVerify-照片实人认证:通过传入图片进行实人认证。
ContrastFaceVerify-视频实人认证:通过带眨眼动作的视频进行实人认证。
在基于阿里云OpenAPI进行二次开发前,您可以通过OpenAPI门户提供的网页或命令行方式,预先验证OpenAPI请求方式,入参和查看OpenAPI的返回结果。当调用出错时,OpenAPI 门户会提示您如何解决,帮助您快速了解OpenAPI功能及使用方法。
步骤一:开通服务
在使用金融级实人认证服务之前,您需要开通服务。具体操作,请参见开通金融级实人认证服务。
步骤二:创建RAM用户并授权
在集成SDK前,您需要创建一个用户调用SDK的用户身份,获取身份关联的OpenAPI访问凭据,并授予访问云上资源的访问权限。如何创建和授权RAM用户,以及如何生成用于调用服务的AccessKey,请参见授权RAM用户访问服务。
步骤三:添加认证场景
认证场景指您的用户使用金融级实人认证服务完成用户实人认证的不同场景,例如,登录、支付等。您可以添加一个或多个场景,并为不同的场景配置不同的认证方案。调用InitFaceVerify发起认证请求时,需要传输认证场景ID。如何添加认证场景并获取认证场景ID, 请参见添加认证场景。
在添加认证场景时,您可以授权阿里云访问指定OSS存储空间,用于存储认证的资料图片。具体操作,请参见授权金融级实人认证访问OSS存储空间。
步骤四:集成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语言进行集成。
支持语言 | Github源码地址 | SDK下载地址 |
Java | ||
Python | ||
Typescript | ||
Go | ||
PHP | ||
C# | ||
C++ |
编写代码(Java示例)
下面以Java语言为例介绍(要求JDK 1.8及以上版本)。
在pom.xml中添加如下依赖,即可在Maven工程中使用SDK。获取最新版本及其他安装方式信息,请参见下载Java SDK。
Java SDK依赖
<dependency> <groupId>com.aliyun</groupId> <artifactId>cloudauth20190307</artifactId> <version>2.1.1</version> </dependency>
身份验证依赖。请查看ChangeLog.txt获取所有已发布的版本列表(建议使用最新的版本)。
重要身份验证依赖可能会直接集成在SDK中,是否需要添加请参考SDK的使用方法,参见Java SDK。
<dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency>
说明本示例通过阿里云Credentials工具从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见身份验证配置。
示例代码。
照片实人认证调用实例
import com.aliyun.cloudauth20190307.Client; import com.aliyun.cloudauth20190307.models.ContrastFaceVerifyRequest; import com.aliyun.cloudauth20190307.models.ContrastFaceVerifyResponse; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; import java.util.Arrays; import java.util.List; public class ContrastFaceVerifyWithPicture { public static void main(String[] args) throws Exception { // 通过以下代码创建API请求并设置参数。 ContrastFaceVerifyRequest request = new ContrastFaceVerifyRequest(); // 固定值。 request.setProductCode("ID_MIN"); // 固定值。 request.setCertType("IDENTITY_CARD"); request.setCertName("姓名张先生"); request.setIp("用户IP地址"); request.setMobile("用户手机号"); request.setDeviceToken("通过设备指纹获取的deviceToken"); request.setUserId("用户ID"); request.setCertNo("18位身份证号"); request.setOuterOrderNo("商户请求的唯一标识"); // 请输入场景+L。 request.setSceneId(0L); request.setModel("FRONT_CAMERA_LIVENESS"); // 请在以下四种方式中选择其一。 // 1.照片Base64编码。 // 2.照片OSS bucket名和文件名。 // 3.照片OSS的URL地址。 // 4.已经实人认证通过的CertifyId。 // 方式一:照片Base64。 request.setFaceContrastPicture("人脸照片Base64编码"); // 方式二:照片OSS bucket名和文件名。 //request.setOssBucketName("cn-shanghai-aliyun-cloudauth-xxxxx"); //request.setOssObjectName("verify/xxxxx/xxxxxx.jpeg"); // 方式三:照片OSS的URL地址,公网可访问。 //request.setFaceContrastPictureUrl("https://cn-shanghai-aliyun-cloudauth-xxxxxx.oss-cn-shanghai.aliyuncs.com/verify/xxxxx/xxxxx.jpeg") // 方式四:已经实人认证通过的CertifyId。 //request.setCertifyId("0bfa7c493f850e5178b9f8613634c9xx"); // 如需开启个人信息加密传输。 // request.setEncryptType("SM2"); // request.setCertName("BCRD/7ZkNy7Q*****M1BMBezZe8GaYHrLwyJv558w=="); // request.setCertNo("BMjsstxK3S4b1YH*****Pet8ECObfxmLN92SLsNg=="); // 推荐,支持服务路由。 ContrastFaceVerifyResponse response = contrastFaceVerifyAutoRoute(request); // 不支持服务自动路由。 //ContrastFaceVerifyResponse response = contrastFaceVerify("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().getMaterialInfo()); } private static ContrastFaceVerifyResponse contrastFaceVerifyAutoRoute(ContrastFaceVerifyRequest request) { // 第一个为主区域Endpoint,第二个为备区域Endpoint。 List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com"); ContrastFaceVerifyResponse lastResponse = null; for (int i=0; i<endpoints.size(); i++) { try { ContrastFaceVerifyResponse response = contrastFaceVerify(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 ContrastFaceVerifyResponse contrastFaceVerify(String endpoint, ContrastFaceVerifyRequest 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.contrastFaceVerifyWithOptions(request, runtime); } }
视频实人认证调用实例
使用本地文件方式(推荐)
import com.aliyun.cloudauth20190307.Client; import com.aliyun.cloudauth20190307.models.ContrastFaceVerifyAdvanceRequest; import com.aliyun.cloudauth20190307.models.ContrastFaceVerifyResponse; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; import java.io.FileInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.List; public class ContrastFaceVerifyWithVideoFile { public static void main(String[] args) throws Exception { // 通过以下代码创建API请求并设置参数。 ContrastFaceVerifyAdvanceRequest request = new ContrastFaceVerifyAdvanceRequest(); // 请输入场景ID+L。 request.setSceneId(1L); request.setOuterOrderNo("商户请求的唯一标识"); request.setProductCode("ID_MIN_VIDEO"); // 卡证核身类型,固定值。 request.setModel("FRONT_CAMERA_LIVENESS"); // 证件类型,固定值。 request.setCertType("IDENTITY_CARD"); request.setCertName("张先生"); request.setCertNo("xxxx"); //request.setDeviceToken("xxxx"); //request.setMobile("130xxxxxxxx"); //request.setIp("114.xxx.xxx.xxx"); //request.setUserId("12345xxxx"); // 如需开启个人信息加密传输。 // request.setEncryptType("SM2"); // request.setCertName("BCRD/7ZkNy7Q*****M1BMBezZe8GaYHrLwyJv558w=="); // request.setCertNo("BMjsstxK3S4b1YH*****Pet8ECObfxmLN92SLsNg=="); InputStream inputStream = null; try { // 设置本地文件路径。 inputStream = new FileInputStream("test.mp4"); request.setFaceContrastFileObject(inputStream); // 推荐,支持服务路由。 ContrastFaceVerifyResponse response = contrastFaceVerifyAutoRoute(request); // 不支持服务自动路由。 //ContrastFaceVerifyResponse response = contrastFaceVerify("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().getMaterialInfo()); } finally { if(inputStream != null){ inputStream.close(); } } } private static ContrastFaceVerifyResponse contrastFaceVerifyAutoRoute(ContrastFaceVerifyAdvanceRequest request) { // 第一个为主区域Endpoint,第二个为备区域Endpoint。 List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com"); ContrastFaceVerifyResponse lastResponse = null; for (int i=0; i<endpoints.size(); i++) { try { ContrastFaceVerifyResponse response = contrastFaceVerify(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 ContrastFaceVerifyResponse contrastFaceVerify(String endpoint, ContrastFaceVerifyAdvanceRequest 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.contrastFaceVerifyAdvance(request, runtime); } }
使用OSS对象存储方式
import com.aliyun.cloudauth20190307.Client; import com.aliyun.cloudauth20190307.models.ContrastFaceVerifyRequest; import com.aliyun.cloudauth20190307.models.ContrastFaceVerifyResponse; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; import java.util.Arrays; import java.util.List; public class ContrastFaceVerifyWithVideoOSS { public static void main(String[] args) throws Exception { // 通过以下代码创建API请求并设置参数。 ContrastFaceVerifyRequest request = new ContrastFaceVerifyRequest(); // 请输入场景ID+L。 request.setSceneId(0L); request.setOuterOrderNo("商户请求的唯一标识"); request.setProductCode("ID_MIN_VIDEO"); // 卡证核身类型,固定值。 request.setModel("FRONT_CAMERA_LIVENESS"); // 证件类型,固定值。 request.setCertType("IDENTITY_CARD"); request.setCertName("张先生"); request.setCertNo("xxxx"); //request.setDeviceToken("xxxx"); //request.setMobile("130xxxxxxxx"); //request.setIp("114.xxx.xxx.xxx"); //request.setUserId("12345xxxx"); request.setOssBucketName("xxxxx"); request.setOssObjectName("xxxxx"); // 如需开启个人信息加密传输。 // request.setEncryptType("SM2"); // request.setCertName("BCRD/7ZkNy7Q*****M1BMBezZe8GaYHrLwyJv558w=="); // request.setCertNo("BMjsstxK3S4b1YH*****Pet8ECObfxmLN92SLsNg=="); // 推荐,支持服务路由。 ContrastFaceVerifyResponse response = contrastFaceVerifyAutoRoute(request); // 不支持服务自动路由。 //ContrastFaceVerifyResponse response = contrastFaceVerify("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().getMaterialInfo()); } private static ContrastFaceVerifyResponse contrastFaceVerifyAutoRoute(ContrastFaceVerifyRequest request) { // 第一个为主区域Endpoint,第二个为备区域Endpoint。 List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com"); ContrastFaceVerifyResponse lastResponse = null; for (int i=0; i<endpoints.size(); i++) { try { ContrastFaceVerifyResponse response = contrastFaceVerify(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 ContrastFaceVerifyResponse contrastFaceVerify(String endpoint, ContrastFaceVerifyRequest 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.contrastFaceVerifyWithOptions(request, runtime); } }