[NEW]刷脸认证
产品介绍
刷脸认证是一种身份验证服务,通过采集用户的面部特征,并与权威数据源比对,判断当前登录用户是否为账户所有人本人和真人。核心功能包括:
- 人脸识别: 高精度人脸检测和比对算法,极速响应。
- 活体检测:全球领先的多模态活体检测技术,极速通过检测,能有效防止高清照片、视频等攻击方式。
- 安全防护:基于大数据模型和风控策略进一步提升刷脸认证的体验和安全性。
产品特色
刷脸认证有以下几个特点:
高准确性 金融级精准度,真实业务场景中的误识率低于十万分之一
极致体验 全球首创多模态活体检测,无需用户做点头摇头动作,无需注册采集,秒级验证通过。
高安全性 全球独有眼纹专利和领先活体检测技术,能有效拦截照片、视频、3D 软件模拟及面具攻击。
高稳定性 采用蚂蚁高可用、动态扩展的服务框架体系。
权威比对源 采用权威认证的数据源做比对,确保认证结果的真实有效性。
海量业务验证 实践验证,成熟可靠,服务超过3亿互联网金融用户,保障超25亿次交易安全。
交互流程
刷脸付的用户交互流程简单易懂,用户点击“支付宝刷脸验证”后进行验证,随后会返回认证结果,交互流程如下图所示:
应用场景
刷脸认证应用广泛,可适用于以下多个场景:
场景 | 描述 |
账户实人认证 | 某互联网金融应用要求用户进行实人认证,确认账号持有人的真实身份。接入刷脸认证后,用户在支付宝小程序内即可快速完成实人认证。 |
打卡签到 | 某 O2O 小程序,为了保障服务质量,要求服务人员进行刷脸打卡,进而确保提供服务的是账户本人。 |
高风险身份校验 | 某金融类应用在检测到账户当前操作存在风险时,调用刷脸认证,校验操作者的身份,确保是账户本人操作,保障用户的资金和信息安全。 |
查询敏感信息 | 在用户查询敏感隐私信息之前,需要通过刷脸认证当前用户的身份,确认本人后,才可展示隐私信息。用户不用担心自己的隐私数据被别人获取。如公积金信息、个人信用数据等。 |
准入条件
该产品使用者需要签约,具体签约要求如下:
- 申请前必须拥有经过实名认证的支付宝账户;
- 仅企业工商户可申请;
- 需提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致。
计费模式
该产品的使用在合同期内免费。
接入介绍
添加刷脸认证
在小程序详情页的功能列表中添加“刷脸认证”,如下图所示:
签约刷脸认证
刷脸认证功能需要签约,请点击“立即签约”,签约成功后,状态变为“已生效”,即可调用刷脸认证接口。审核时间通常需要1-3个工作日完成。
刷脸认证接入
调用流程图
刷脸认证需要用到两个接口:人脸识别(my.ap.faceVerify)和 人脸结果查询 (zoloz.identification.customer.certifyzhub.query),具体接入流程如下图所示:
调用 JSAPI(faceVerify)唤起刷脸认证,整个认证过程完全由人脸内部实现,认证完成后,通过回调函数返回认证结果。认证过程中,人脸客户端会首先展示刷脸引导页,该页面用于告知用户即将进入人脸采集环节,当用户点击页面上的“支付宝刷脸验证”按钮,客户端完成人脸采集过程以及活体检测,然后采集的人脸特征数据上传到服务端进行进一步的活体检测以及人脸比对,最终返回认证结果到客户端。
接口 faceVerify 虽然会返回认证结果,但是因为客户端天然的安全性比服务端低,强烈建议商户调用服务端查询接口(zoloz.identification.customer.certifyzhub.query)获取可信的认证结果。基于该结果进行后续的业务流程。
接入准备
- 前提:开发者需要先了解小程序框架;
- 版本要求:支付宝APP最低版本要求:10.1.35;小程序框架最低版本要求:1.10.5;
- 配置服务端环境:为了帮助开发者调用开放接口,我们提供了开放平台服务端SDK,包含JAVA、PHP 和 .NET三语言版本,封装了签名&验签、HTTP接口请求等基础功能。请先下载对应语言版本的 SDK 并引入您的开发工程。请下载最新版本。在 SDK 调用前需要进行初始化,以 JAVA 代码为例:
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
接入步骤
1、调用接口 my.ap.faceVerify,传入入参 bizId 和 bizType 唤起刷脸认证,认证结束后,通过回调函数得到认证结果。其中 bizId 是业务流水号,开发者自行生成,需确保唯一性;bizType 请务必填写2,代表刷脸认证场景,否则会导致认证逻辑异常。
代码示例
my.ap.faceVerify({
bizId: '545689787654767653', //业务请求的唯一标识,需要保证唯一性
bizType: '2', //业务场景参数,必须填写‘2’,代表刷脸认证
success: (res) => {
my.alert({
content: JSON.stringify(res),
});
},
fail: (res) => {
my.alert({
content: JSON.stringify(res),
});
}
});
认证成功结果示例faceRetCode = 1000 代表刷脸认证成功,认证为本人。
注意:retCode 代表的是刷脸可用性的判断结果,刷脸判断为可用,才可进入认证环节。可用性判断失败的话,faceRetCode为空,具体可用性失败的原因查看 retCode 。
{
"faceRetCode":"1000",
"retCode": "OK_SUCCESS",
"retCodeSub": "Z5100",
"retMessageSub": "成功 (Z5100)",
"zimId": "7b6b72be1493cab72dd0a25877de329dd00"
}
认证失败结果示例faceRetCode = 2006 代表认证失败,可能是认证为非本人,也可能是活体攻击等情况。
注意:retCode 代表的是刷脸可用性的判断结果,刷脸判断为可用,才可进入认证环节,但是不代表最终的认证结果。
{
"faceRetCode":"2006",
"retCode":"OK_SUCCESS",
"retMessageSub":"成功 (Z5100)",
"retCodeSub":"Z5100",
"zimId":"fe2441a47c070da19a29618a247e2e71d48",
}
认证未完成结果示例faceRetCode = 1003 代表认证未完成,通常指用户在采集人脸页面主动退出或操作超时。
{
"faceRetCode":"1003",
"retCode":"OK_SUCCESS",
"retMessageSub":"成功 (Z5100)",
"retCodeSub":"Z5100",
"zimId":"fe2441a47c070da19a29618a247e2e71d48",
}
可用性失败结果示例在正式进入人脸识别环节之前,先经过可用性判断。如果判断为不可用,则无法进入人脸识别环节。以下返回码代表可用性判断为不可用,具体原因是刷脸失败次数过多。这是人脸后台的数据风控模块返回的结果,为了避免黑产批量攻击,会对尝试次数过多的情况进行冷却处理。
{
"faceRetCode":"",
"retCode":"HIGH_RISK",
"retMessageSub":"刷脸失败次数过多,请稍候再试(Z1209)",
"retCodeSub":"Z1209",
"zimId":"fe2441a47c070da19a29618a247e2e71d48",
}
2、调用 zoloz.identification.customer.certifyzhub.query 接口查询认证结果
- 确保业务参数 biz_id 和 faceVerify 中的入参 bizId 一致,否则会导致查询失败;
- 业务参数 zim_id 从 faceVerify 接口返回的结果 zimId 获取,zim_id 只允许使用一次,不能重复使用,并且该ID的有效期为30分钟,到期后无法使用该ID完成查询;
- 业务参数 face_type 固定填写2,表明查询认证结果,否则无法保证查询结果的正确性;
- 业务参数 bizType 固定填写2,表明刷脸认证场景,否则无法保证查询结果的正确性。
请求代码示例
// app_id: 小程序应用的appid; your private_key:小程序应用的私钥;alipay_public_key:小程序应用的支付宝公钥
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
ZolozIdentificationCustomerCertifyzhubQueryRequest request = new ZolozIdentificationCustomerCertifyzhubQueryRequest();
request.setBizContent("{" +
"\"biz_id\":\"3423412412420181107\"," +
"\"zim_id\":\"535325098432\"," +
"\"face_type\":\"2\"," +
"\"bizType\":\"2\"" +
" }");
ZolozIdentificationCustomerCertifyzhubQueryResponse response = alipayClient.execute(request);
if (response != null && response.isSuccess()){
//成功逻辑
} else {
//错误逻辑
}
查询成功结果示例code=10000代表认证成功为本人
{
"zoloz_identification_customer_certifyzhub_query_response":{
"code":"10000",
"msg":"Success",
"zim_msg":"验证通过 (Z5130)",
"zim_code":"Z5130",
"biz_id":"3423412412420181107"
}
,"sign":"ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}
查询失败结果示例code=40004代表认证失败,具体原因见sub_code,以下示例代表不是本人刷脸
{
"zoloz_identification_customer_certifyzhub_query_response":{
"code":"40004",
"msg":"Business Failed",
"sub_code":"NOT_SAME_PERSON",
"sub_msg":"不是本人",
"zim_msg":"抱歉,没有认出您(Z1146)",
"zim_code":"Z1146",
"biz_id":"3423412412420181107"
},
"sign":"YA0e6t1TN7+EqAvHfHdA"}
sub_code=INVALID_ARGUMENT 代表入參有误,更详细的原因请见 zim_code,其中 Z5133 代表 biz_id 和 faceVerify 传入的bizId 不一致;Z5132 代表 zim_id 重复使用或已经过期;Z5131 代表传入的 zim_id 不正确,请确保是 faceVerify 接口成功后返回的结果。
{
"zoloz_identification_customer_certifyzhub_query_response":{
"code":"40004",
"msg":"Business Failed",
"sub_code":"INVALID_ARGUMENT",
"sub_msg":"请求入参无效",
"zim_msg":"抱歉,系统出错了,请您稍后再试 (Z5132)",
"zim_code":"Z5132",
"biz_id":"5456897876546767654"
},
"sign":"AdPxUv6GAE7q5q63qsCScNC"}
API介绍
接口英文名称 | 接口中文名称 |
---|---|
my.ap.faceVerify | 人脸识别 |
zoloz.identification.customer.certifyzhub.query | 人脸结果查询 |