服务端集成

重要

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

在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。详情方案说明,请参见H5网页接入

ID_PRO

Model

String

要进行活体检测的类型。

说明

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

  • LIVENESS(默认):眨眼动作活体检测。

  • PHOTINUS_LIVENESS(推荐):眨眼动作活体+炫彩活体双重检测。

  • MULTI_ACTION:多动作活体检测,眨眼+任意摇头检测(顺序随机)。

  • 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,请保持唯一。

123456789

CallbackUrl

String

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

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

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

https://www.aliyun.com

CallbackToken

CallbackToken

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

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

NMjvQanQgplBSaEI0sL86WnQplB

CertifyUrlType

String

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

说明

只支持Web SDK设备类型。

WEB

CertifyUrlStyle

String

返回CertifyUrl类型,包括:

  • L:HTTPS,原始长链。

  • S:HTTP,短链。

L

AuthId

String

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

92d46b9e9e2d703f2897f350d5bd4149

EncryptType

String

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

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

如需传入加密算法,需对CertNameCertNo进行加密,并传入加密后的密文。有关参数加密的更多信息,请参见参数加密说明

SM2

ProcedurePriority

String

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

默认值为url

  • 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说明,请参见Web SDK UI自定义配置说明

www.aliyundoc.com

VideoEvidence

String

是否开启视频存证。

  • true:开启

  • false:不开启(默认)

说明

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

false

返回数据

名称

类型

描述

示例值

RequestId

String

请求ID。

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

Message

String

返回信息。

success

Code

String

返回码:200为成功,其他为失败。

详细说明,请参见返回Code和Message说明

200

ResultObject.CertifyId

String

实人认证唯一标识。

重要

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

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

91707dc296d469ad38e4c5efa6a0f24b

ResultObject.CertifyUrl

String

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

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

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

http://m.alyms.cn/****

DescribeFaceVerify-获取认证详细数据

当您收到回调通知之后,可以在服务端通过该接口获取相应的认证状态和认证资料。

说明

虽然InitFaceVerify在认证结束后跳转ReturnUrl时会携带认证结果,但考虑到浏览器的安全性,建议调用此接口进行认证结果的二次验证。

请求参数

名称

类型

是否必选

描述

示例值

SceneId

Long

认证场景ID。

1000000006

CertifyId

String

实人认证唯一标识。

91707dc296d469ad38e4c5efa6a0f24b

返回数据

名称

类型

描述

示例值

RequestId

String

请求ID。

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

Message

String

请求消息的响应信息。

success

Code

String

返回码,详细说明,请参见返回Code和Message

200

ResultObject.Passed

String

认证结果:

  • T:通过

  • F:未通过

重要

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

T

ResultObject.SubCode

String

认证结果描述。详情请参见返回Code和Message

200

ResultObject.IdentityInfo

String

认证的主体信息,一般的认证场景返回为空。

null

ResultObject.DeviceRisk

String

设备风险标签。

VirtualBrowser

说明

多个设备风险标签以半角逗号(,)分隔。如需了解更多设备风险标签及其含义,请参见人脸保镖标签说明

ResultObject.MaterialInfo

String

认证主体附件信息,主要为图片类材料。

示例见下文

ResultObject.UserInfo

String

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

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

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

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

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

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

返回示例详述

  • ResultObject.MaterialInfo的JSON格式示例:

    {
        // 是否为攻击:攻击为T,非攻击为F。
        "faceAttack": "T",
        // 是否有脸部遮挡:有脸部遮挡为T,否则为F。
        "faceOcclusion": "F",
        // 认证的照片信息。
        "facialPictureFront": {
             //人脸攻击分。
             "faceAttackScore": 0.00008597839769208804,
            // 照片存放客户上海区域的OSS里,此为照片的bucket名。
            "ossBucketName": "cn-shanghai-aliyun-cloudauth-1260051251634779",
            // 照片存放客户上海区域的OSS里,此为照片的文件名。
            "ossObjectName": "verify/1260051251634779/03a081bd96328aedf83f635f39a50c57_0.jpeg",
            // 照片https地址,有效期15分钟,从查询时开始计时。
            "pictureUrl": "http://cn-shanghai-aliyun-cloudauth-1260051251634779.oss-cn-shanghai.aliyuncs.com/verify/1260051251634779/03a081bd96328aedf83f635f39a50c57_0.jpeg?Expires=1625371140&OSSAccessKeyId=STS.NTX1ngfr6Acg2Pmnn2RYM****&Signature=Hw5BF9WxJs6wI68IxKs41cxCU8****&security-token=CAISjgJ1q6Ft5B2yfSjIr5ftetTTi60X9qGMMHbcim5nXtZhu7GT1Dz2IH1PdXFgA%2Bgds%2Fswmm5U7vgalrkqEcEdHRGdN5YpsM8LrlzwO1h2TGRsq%2B5qsoasPETOITyZtZagToeUZdfZfejXGDKgvyRvwLz8WCy%2FVli%2BS%2FOggoJmadJlNWvRL0AxZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO4gEWq4bHm5fCskKD1Qenk7FO%2B9uuc6LJNZc8YM1NNP6ux%2FFze6b71ypd1gNH7q8ejtYfpGyW5oHHWwIMvErYbbaMrIV1WwZ9Z7knHaVAq%2BXwnOBkuuXYnIns0BdLMuZOSD7YQI2wYWEwgBcxt78agAF%2FHZbelNLYWtipAu5X5oG1t22SqIr1p3TMK5FrjDIVeWOppcxeRXtU%2BjR7hGcwd25scGhiraoxTXV3sxw%2F6dhFSswQ37O4j%2B%2FrCPtiGauqn2ZMdMj%2FvYwKb6KmpQqa%2BtR%2F9cxhS6hoIQRq0SUIfyXl5ZUiZbTjW22iwuX%2BPwzVCw%3D%3D",
            // 视频存放客户上海区域的OSS里,此为视频的文件名(仅当客户端设置视频参数时返回)。
            "ossVerifyVideoObjectName": "verify/1260051251634779/03a081bd96328aedf83f635****_verifyvideo_dcb7.mov",
            // 视频https或htttp地址,有效期15分钟,从查询时开始计时(仅当客户端设置视频参数时返回)。
            "verifyVideoUrl": "http://cn-shanghai-aliyun-cloudauth-1260051251634779.oss-cn-shanghai.aliyuncs.com/verify/******?
            // 活体人脸质量分数。
            "qualityScore": 99.93476867675781,
            // 人脸和公安比对分数,阈值可参考下表详细说明。
            "verifyScore": 57.678396649466755
            // 降级标识字段(仅当deviceType是h5时返回)Keep-未降级;url-该笔认证用户触发了URL降级完成认证;video-该笔认证用户触发了视频降级完成认证
            "procedurePriorityResult":"keep"
        },
    }
  • ResultObject.SubCode错误码说明,请参见ResultObject.SubCode错误码说明

  • verifyScore阈值说明:

    千分之一误识率

    万分之五误识率

    万分之一误识率

    十万分之五误识率

    十万分之一误识率

    70

    71.5

    75

    76.5

    80

    说明

    如果您有个性化需求,您可以根据业务情况,参考返回的比对分和阈值,自定义认证结果。

  • 返回Code和Message说明,请参见返回Code和Message

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-获取认证详细数据

    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 {
    
        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。
            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);
        }
    
    }

    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 {
    
        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。
            com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
            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);
        }
    }