Android通过支付宝进行刷脸认证
官方文档快速接入
一、简介
支付宝刷脸认证是通过支付宝人脸识别进行身份校验,主要包括三个模块身份认证初始化服务、开始认证、认证结果查询
二、应用场景
认证场景码 FACE SMART_FACE CERT_PHOTO CERT_PHOTO_FACE FACE_SDK
认证场景 | 多因子人脸认证 | 多因子证照和人脸认证 | 多因子证照认证 | 多因子快捷认证 |
(biz_code) | FACE | CERT_PHOTO_FACE | CERT_PHOTO | SMART_FACE |
三、认证前准备
1.注册支付宝开放平台完成商户入驻流程,创建应用添加功能(身份验证)并进行签约;
2.你需要获取一个 应用 ID,并完成必要的开发 环境配置;
3.支付宝开放平台通过 HTTPS 通信进行接口调用,包含系统调用和页面转跳两类接口,相关概念参照 接口调用;参数的加密解密和加签验签参考
4.集成并配SDK,支付宝身份验证目前并未提供相应的客户端sdk,功能主要集中在后台服务中,后台完成相应的配置后,商户通关唤起支付宝app完成身份认证
四、整体流程
1.调用身份认证初始化服务 alipay.user.certify.open.initialize 接口进行认证初始化,并获取返回值certify_id。certify_id 是本次认证的标识,在后面的认证接口和查询接口会用到。
2.将生成的 certify_id 作为入参,调用身份认证开始认证服务接口 alipay.user.certify.open.certify 生成认证服务请求地址 (文档中有url示例)
3.用户完成认证后会通知商户结果。这个接口支持多种方式接入,可以灵活使用。重点必须在这个接口的请求中传入 return_url 才能回跳到商户, return_url 也支持多个协议 H5、小程序、商户App。
4.可以根据第一步返回的 certify_id 查询本次认证的状态和结果。
五、认证初始化以及生成认证请求url(服务端完成)
1.初始化服务
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
AlipayUserCertifyOpenInitializeRequest request = new AlipayUserCertifyOpenInitializeRequest();
//构造身份信息json对象
JSONObject identityObj = new JSONObject();
//身份类型,必填,详细取值范围请参考接口文档说明
identityObj.put("identity_type", "CERT_INFO");
//证件类型,必填,详细取值范围请参考接口文档说明
identityObj.put("cert_type", "IDENTITY_CARD");
//真实姓名,必填
identityObj.put("cert_name", "张三");
//证件号码,必填
identityObj.put("cert_no", "260104197909275964");
//构造商户配置json对象
JSONObject merchantConfigObj = new JSONObject();
// 设置回调地址,必填. 如果需要直接在支付宝APP里面打开回调地址使用alipay协议,参考下面的案例:appId用固定值 20000067,url替换为urlEncode后的业务回跳地址
// alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fapp.cqkqinfo.com%2Fcertify%2FzmxyBackNew.do
merchantConfigObj.put("return_url", "alipays://platformapi/startapp?appId=20000067&url=https%3A%2F%2Fapp.cqkqinfo.com%2Fcertify%2FzmxyBackNew.do");
//构造身份认证初始化服务业务参数数据
JSONObject bizContentObj = new JSONObject();
//商户请求的唯一标识,推荐为uuid,必填
bizContentObj.put("outer_order_no", "506608c8141a4fc781538fb3e55029f9");
bizContentObj.put("biz_code", "FACE");
bizContentObj.put("identity_param", identityObj);
bizContentObj.put("merchant_config", merchantConfigObj);
request.setBizContent(bizContentObj.toString());
//发起请求
AlipayUserCertifyOpenInitializeResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
//接口调用成功,从返回对象中获取certify_id
String certifyId = response.getCertifyId();
//执行后续流程...
} else {
System.out.println("调用失败");
}
2.生成认证url
//参考代码如下:
//获取alipay client
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
AlipayUserCertifyOpenCertifyRequest request = new AlipayUserCertifyOpenCertifyRequest();
//设置certifyId
JSONObject bizContentObj = new JSONObject();
bizContentObj.put("certify_id", "2109b5e671aa3ff2eb4851816c65828f");
request.setBizContent(bizContentObj.toString());
//生成请求链接,这里一定要使用GET模式
AlipayUserCertifyOpenCertifyResponse response = alipayClient.pageExecute(request, "GET");
if(response.isSuccess()){
System.out.println("开始认证服务调用成功");
String certifyUrl = response.getBody();
//执行后续流程...
} else {
System.out.println("调用失败");
}
六、客户端(Android)操作,通过支付宝App内进行认证
1.填写基本信息,身份信息
2.唤起支付宝app,传入后台服务生成认证url,进行人脸识别
示例:
/**
* 启动支付宝进行认证
* @param url 开放平台返回的URL
*/
private void doVerify(String url) {
if (hasApplication()) {
Intent action = new Intent(Intent.ACTION_VIEW);
StringBuilder builder = new StringBuilder();
// 这里使用固定appid 20000067
builder.append("alipays://platformapi/startapp?appId=20000067&url=");
builder.append(URLEncoder.encode(url));
action.setData(Uri.parse(builder.toString()));
startActivity(action);
} else {
// 处理没有安装支付宝的情况
new AlertDialog.Builder(this)
.setMessage("是否下载并安装支付宝完成认证?")
.setPositiveButton("好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent action = new Intent(Intent.ACTION_VIEW);
action.setData(Uri.parse("https://m.alipay.com"));
startActivity(action);
}
}).setNegativeButton("算了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
}
/**
* 判断是否安装了支付宝
* @return true 为已经安装
*/
private boolean hasApplication() {
PackageManager manager = getPackageManager();
Intent action = new Intent(Intent.ACTION_VIEW);
action.setData(Uri.parse("alipays://"));
List list = manager.queryIntentActivities(action, PackageManager.GET_RESOLVED_FILTER);
return list != null && list.size() > 0;
}
3.认证完成后点击返回,应该返回到我们的App中,或者是一个H5的认证结果页,此时主要在初始化认证服务中的return_url中进行配置,简单介绍几种配置
H5 网页
H5网页提示,需要使用alipay协议,参考下面的案例:
alipays://platformapi/startappappId=20000067&url=https%3A%2F%2Fapp.cqkqinfo.com%2Fcertify%2FzmxyBackNew.do
Android客户端App
返回到商户App需要用到schema 协议,参考下面案例
scheme://face/certify
商户App配置,在Mainefest配置文件中配置需要用scheme协议跳转的Activity
<activity
android:name=".LoginActivity"
<!-- 要想在别的App上能成功调起App,必须添加intent过滤器 -->
<!-- 协议部分,随便设置 -->
<intent-filter>
<!--协议部分,随便设置-->
<data android:scheme="scheme" android:host="face" android:path="/certify" />
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
IOS配置
return_url中使用,weilvapp://
七、认证记录查询
1.人脸识别完成身份认证后,查询认证结果(服务端完成) 示例:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayUserCertifyOpenQueryRequest request = new AlipayUserCertifyOpenQueryRequest();
request.setBizContent("{" +
"\"certify_id\":\"OC201809253000000393900404029253\"" +
" }");
AlipayUserCertifyOpenQueryResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
2.响应示例
{
"alipay_user_certify_open_query_response": {
"code": "10000",
"msg": "Success",
"passed": [
"T"
],
"identity_info": "{}",
"material_info": "{}"
},
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}
注:官方文档中给出的各类公共错误码,对返回结果进行比对,其中对身份认证结果的判断,官方sdk给出的api中的passed结果为集合,实际为字符串,具体可根据返回的结果进行重新解析即可