服务端集成

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

H5页面接入金融级实人认证方案时,开发者需要在后端服务器集成SDK,以便调用InitFaceVerify接口获取用于浏览器进行实人认证的认证链接CertifyUrl。本文将详细介绍服务端SDK的安装方式、所调接口的参数说明以及实际调用接口示例说明。

集成须知

服务接入点

目前支持的接入地域如下表所示。

重要

建议您参考本文示例代码,配置主备地域Endpoint。在主Endpoint发生故障时可以自动切换到备用Endpoint,保证系统的持续可用性。

地域

服务地址

VPC地址

全局接入地址

华东2(上海)

IPv4:cloudauth.cn-shanghai.aliyuncs.com

cloudauth-vpc.cn-shanghai.aliyuncs.com

  • IPv4:cloudauth.aliyuncs.com

  • IPv6:cloudauth-dualstack.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

QPS限量

API独享QPS限量,详情请参见服务端接口QPS限量说明

服务端需要集成的两个接口

InitFaceVerify-发起认证请求

每次开始认证前通过调用本接口获取用于浏览器进行实人认证的认证链接CertifyUrl和每次认证的唯一CertifyId

须将此接口的请求封装为开始认证的业务接口,供网页端调用。

请求参数

名称

类型

是否必选

描述

示例值

SceneId

Long

要接入的认证场景ID。该ID在控制台创建认证场景后自动生成。

1000000006

OuterOrderNo

String

您自定义的业务唯一标识,用于后续定位和排查问题使用。

支持长度为32位的字母和数字组合,请确保唯一。

e0c34a77f5ac40a5aa5e6ed20c353888

ProductCode

String

要接入的认证方案。

唯一取值:ID_PRO。

ID_PRO

Model

String

活体检测类型,取值:

说明

活体检测类型仅支持下列取值,暂不支持自定义动作或组合。

  • LIVENESS(默认):眨眼

  • PHOTINUS_LIVENESS:眨眼 + 炫彩

  • MULTI_ACTION:眨眼 + 摇头 (眨眼和摇头顺序随机)

  • MULTI_PHOTINUS:眨眼 + 摇头 (眨眼和摇头顺序随机)+ 炫彩活体检测。

  • MOVE_ACTION(推荐):远近移动 + 眨眼 (远近和眨眼顺序随机)

  • MULTI_FAPTCHA:眨眼 + 形迹

    说明

    形迹判断是一种动作活体的检测方式,按规则移动鼻尖完成指定动作。形迹判断通过增加随机性,提升了安全能力。

PHOTINUS_LIVENESS

CertType

String

用户证件类型

不同证件类型,取值均为IDENTITY_CARD

IDENTITY_CARD

CertName

String

您的终端用户的真实姓名。

张三

CertNo

String

您的终端用户的证件号码。

330103xxxxxxxxxxxx

ReturnUrl

String

认证结束后回跳页面的链接地址。

https://www.aliyun.com

MetaInfo

String

MetaInfo环境参数。实际环境需要通过JS文件,调用函数getMetaInfo()获取,详情请参见认证触发页面(启动刷脸)

{
    "appVersion": "1",
    "bioMetaInfo": "4.1.0:1150****,0",
    "appName": "com.aliyun.antcloudauth",
    "deviceType": "ios",
    "osVersion": "iOS 10.3.2",
    "apdidToken": "",
    "deviceModel": "iPhone9,1"
}
警告

该示例仅供参考,实际集成中不能直接应用,否则会导致无法正常获取到CertifyUrl

Mobile

String

您终端用户的手机号码。

130xxxxxxxx

Ip

String

您终端用户的IP。

47.100.XX.XX

UserId

String

您自定义的用户ID(最长100个字符),请保持唯一。

123456789

CallbackUrl

String

认证结果的回调通知地址,回调请求方式默认为GET,回调地址必须以https开头。平台在完成认证后会回调该地址,并自动添加certifyIdpassed字段,passed字段值返回的是subcode值,示例:https://www.aliyun.com?callbackToken=1000004826&certifyId=shaxxxx&passed=200

重要
  • 仅当认证完成(包含认证通过和认证未通过)时才会触发回调,若认证中放弃、异常中断或未进行认证均不会通知。建议您收到回调通知时,若有需要可通过查询接口获取认证详情信息。

  • 该值的传入会在调用接口前做可访问校验,如果传入的地址不能在公网访问,会返回401。

  • 接口在回调后务必返回 HTTP 状态码 200,否则会触发重试,3秒内两次回调。

https://www.aliyun.com

CallbackToken

CallbackToken

安全Token,由您自行生成,用于防重复、防篡改校验。

如果设置了该值,会在回调地址中显示CallbackToken字段。

NMjvQanQgplBSaEI0sL86WnQplB

CertifyUrlType

String

Web SDK设备类型。取值WEB或者H5

说明

只支持Web SDK设备类型。

WEB

CertifyUrlStyle

String

返回CertifyUrl类型,包括:

  • L:原始长链

  • S(默认):短链

L

AuthId

String

用户授权ID,最大长度为64位字符。

92d46b9e9e2d703f2897f350d5bd4149

EncryptType

String

加密类型。为空表示不加密。

如开启加密传输,需传入加密算法。目前仅支持SM2国密算法。

如需传入加密算法,需对CertNameCertNo进行加密,并传入加密后的密文。

有关参数加密的更多信息,请参见参数加密说明

SM2

ProcedurePriority

String

移动端H5方式认证出现WebRTC或者Webassembly不兼容时的降级配置。

  • keep:不支持降级,直接返回。

  • url(默认):支持降级,返回认证URL,用户使用此URL打开或者切换浏览器进行认证。

  • video:支持降级,使用系统相机录制一段3~5秒的眨眼视频进行认证。

    说明

    当降级模式为Video时如下功能将失效,且产品安全性会降低,建议仅面向安全场景配置。

    • 活体检测的类型设置将不生效。

    • 视频存证VideoEvidence功能不支持。

url

FaceGuardOutput

String

设备助手标签种类,取值:DeviceRisk

说明
  • 选择输出设备助手会产生额外的费用,详情请参见付费增值服务

  • 如果不需要输出设备助手标签,可以不传递参数或者传入空值。

DeviceRisk

RarelyCharacters

String

是否开启生僻字模式:

  • Y:开启

    用户认证前会弹出信息输入框,需输入生僻字姓名和身份证号码,同意协议后才能开始认证流程。

  • N:不开启(默认)

Y

uiCustomUrl

String

UI配置文件URL。

您可以在Web SDK UI自定义配置说明中查看完整配置。

www.aliyundoc.com

VideoEvidence

String

是否开启视频存证:

  • true:开启

  • false:不开启(默认)

说明

因为视频文件较大,当网络不稳定时系统会丢弃视频文件优先保障认证必要图片传输,建议您业务上设置为弱依赖视频。

false

CameraSelection

String

是否开启摄像头选择功能:

  • Y:开启

  • N:不开启(默认)

说明

该功能仅针对PC端集成模式生效,开启后支持用户自主选择摄像头认证。

N

SuitableType

String

适老化配置参数,针对每笔认证请求生效,您可以根据自有App的业务属性、客群分布、操作特性等条件对于每笔认证请求选择不同的参数,包括以下选项,默认为0。

  • 0:不开启,表示当前认证请求不开启适老化。

  • 1:开启,表示当前认证请求开启适老化。

  • 2:用户选择。

    支持终端用户选择认证模式,产品引导页提供“开启认证”和“长辈认证模式”两种认证入口,当用户选择“长辈认证模式”系统进入适老化模式。

说明
  • 适老化参数仅在活体检测类型Model取值 LIVENESS 或者 MULTI_ACTION时生效。

  • 适老化主要是通过增加语音提示、字体放大、UI优化等方式针对老年人或身体机能存在缺陷的群体提供友好操作体验的认证模式。

  • Navite SDK支持适老化模式,SDK版本需要大于或等于2.2.5。

    Web SDK 支持适老化模式,建议使用最新版本SDK。

  • 开启适老化,人脸验证时间会变长。

  • 当移动设备开启系统无障碍模式,SDK不支持开启适老化模式。

0

needMultiFaceCheck

String

终端检测到多人脸时是否拦截,取值:

  • Y:拦截,客户端提示需要重新刷脸。

  • N(默认):不拦截,取刷脸画面中的最大脸发送服务端进行安全检测。

Y

返回数据

名称

类型

描述

示例值

RequestId

String

请求ID。

130A2C10-B9EE-4D84-88E3-5384FF039795

Code

String

返回码,200 指接口响应成功。

您可以在返回CodeMessage说明中查看不同 Code 的详细描述。

200

Message

String

请求信息的响应消息,对 Code(返回码)的简短描述。

success

ResultObject.CertifyId

String

实人认证唯一标识。

重要

CertifyId字段为计费统计字段,为了方便后续核对账单,请您在本地留存该字段信息。

初始化接口返回的认证CertifyId30分钟有效仅能认证提交一次,请您在有效期内使用,避免重复使用。

91707dc296d469ad38e4c5efa6a0f24b

ResultObject.CertifyUrl

String

Web浏览器进行实人认证的URL,认证结束后根据入参ReturnUrl进行跳转。

警告
  • 初始化接口返回的认证CertifyUrl30分钟有效仅能认证提交一次,请您在有效期内使用,避免重复使用。

  • 此参数需要入参中MetaInfo正确传入,以返回与客户端匹配的CertifyUrl。如无法获取,请检查MetaInfo以及其他传入参数是否正确。

  • 此地址域名可能会随服务更新而变更,为保证服务正常可用,建议不要对此地址域名进行访问控制。

  • 浏览器跳转时尽量不要使用无痕模式或改变 URL,否则可能会出现签名异常的错误。

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:通过

  • F:未通过

重要

认证结果判定以此字段为准。

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图片以及意愿认证等数据信息。

MaterialInfo

ResultObject.UserInfo

String

记录在生僻字模式下用户输入的身份信息与对应编码。返回数据为JSON格式字符串,姓名中无生僻字返回为空字符串。

  • name:指用户输入的姓名。

  • verifyName:指通过验证的最终姓名编码。例如生僻字是通过转码认证通过:“王先生”,实际认证通过是“王先”。

  • number:指用户输入的证件号码。

{
  "number": "610***********1110",
  "name": "王先生",
  "verifyName": "王先"
}
重要

判断认证结果请以ResultObject.Passed字段为准。

SDK调用示例

阿里云提供了OpenAPI门户,可以使用网页或命令行方式预先验证接口,您可以通过下面的链接进入调试:

重要

在集成操作前,默认您已经开通了服务并获取了AccessKey认证场景ID,这两个参数是调用接口所必需的。如果没有,请参考前提条件获取。

SDK集成

Java语言为例,要求JDK 1.8及以上版本。

  1. 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访问的身份验证。您需要提前在系统配置环境变量,具体操作,请参见身份验证配置

  2. 接口调用示例。

    调用示例中仅设定了必要参数,详细参数请参见InitFaceVerify-发起认证请求DescribeFaceVerify-获取认证详细数据

    重要

    代码示例仅展示最基础的接口调用能力,实际使用时请根据业务需求情况加以优化和重构。

    例如,代码中变量名为credentialClientconfigclient等通用对象在实际使用时,建议根据业务需求情况优化为单例模式,以提升性能。这些对象在示例代码中标有建议使用单例模式的字样。

    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 IDAccessKey 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); 
            // CertifyIdInitFaceVerify接口的返回值中。
            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 IDAccessKey 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);
        }
    }