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结果为集合,实际为字符串,具体可根据返回的结果进行重新解析即可