芝麻认证:
项目要做芝麻认证,以为只是简单调一下SDK,其实不然,官方文档并不是很详细,所以把自己踩的坑总结一下:
总体流程如下:
1.调用 customer.certification.initialize 接口进行认证初始化,并获取返回值 biz_no。biz_no 是本次认证的标识,在后面的认证接口和查询接口会用到。
2.跳转到 customer.certification.certify 页面接口或者使用客户端 SDK 让用户完成认证,用户完成认证后会通知商户结果。这个接口支持多种方式接入,可以灵活使用。必须在这个接口的请求中传入 return_url 才能回跳到商户, return_url 也支持多个协议,可以按照需要使用
3 可以根据第一步返回的 biz_no 查询本次认证的状态和结果。
可以看下我从官网扣下的流程图:
image.png
通过芝麻提供的暴露接口,商户回调。拿到对应的标识,发起认证。
代码如下:
1.认证初始化(服务)
ZhimaCustomerCertificationInitializeRequest request = new ZhimaCustomerCertificationInitializeRequest();
request.setPlatform("zmop");
request.setTransactionId("ZGYD201610252323000001234");// 必要参数
request.setProductCode("w1010100000000002978");// 必要参数
request.setBizCode("FACE");// 必要参数
request.setIdentityParam("{\"identity_type\":\"CERT_INFO\",\"cert_type\":\"IDENTITY_CARD\",\"cert_name\":\"收委\",\"cert_no\":\"260104197909275964\"}");// 必要参数
request.setExtBizParam("{}");// 必要参数
DefaultZhimaClient client = new DefaultZhimaClient(
"https://zmopenapi.zmxy.com.cn/openapi.do",
"app_id",
"your private_key",
"zhima_public_key");
try {
ZhimaCustomerCertificationInitializeResponse response = (ZhimaCustomerCertificationInitializeResponse) client
.execute(request);
System.out.println(response.isSuccess());
System.out.println(response.getErrorCode());
System.out.println(response.getErrorMessage());
} catch (ZhimaApiException e) {
e.printStackTrace();
}
2.生成认证URL(服务)
ZhimaCustomerCertificationCertifyRequest request = new ZhimaCustomerCertificationCertifyRequest();
request.setPlatform("zmop");
request.setBizNo("ZM201612013000000242400404124269");// 必要参数
// 设置回调地址,必填. 如果需要直接在支付宝APP里面打开回调地址使用alipay协议
// alipay://www.taobao.com 或者 alipays://www.taobao.com,分别对应http和https请求
request.setReturnUrl("http://www.taobao.com");// 必要参数
DefaultZhimaClient client = new DefaultZhimaClient(
"https://zmopenapi.zmxy.com.cn/openapi.do";, "app_id", "your private_key",
"zhima_public_key");
try {
String url = client.generatePageRedirectInvokeUrl(request);
System.out.println("generateCertifyUrl url:" + url);
} catch (ZhimaApiException e) {
e.printStackTrace();
}
本地认证方式:
1.直接根据后台生成的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;
}
对应上面这种方式会存在跳转到支付宝页面认证完成后会发现没有对应的回调
对此我给出的解决方式是:
指定activity 处理支付宝的隐似跳转
android:name=".module.login.OcrResultiActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
android:host="zmcert"
android:path="/ocrresult"
android:scheme="ixmsdk" />
对于上面格式不是很明白的可以看看下面我推荐的博客,讲的很详细,可以学习一下
第二种集成方式:直接app 内集成。 直接拿对应回调处理
final ZMCertification zmCertification = ZMCertification.getInstance();
zmCertification.getBuildInfo();
zmCertification.setZMCertificationListener(new ZMCertificationListener() {
@Override
public void onFinish(boolean isCanceled, boolean isPassed, int errorCode) {
zmCertification.setZMCertificationListener(null);
if (isCanceled)
Toast.makeText(mContext, "cancel : 芝麻验证失败,原因是:" + errorCode, Toast.LENGTH_SHORT).show();
else {
if (isPassed){
setResult(Activity.RESULT_OK);
finish();
Toast.makeText(mContext, "complete : 芝麻验证成功,原因是:" + errorCode, Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(mContext, "complete : 芝麻验证失败,原因是:" + errorCode, Toast.LENGTH_SHORT).show();
startActivityForResult(new Intent(mContext,FaceResultAliActivity.class),REQUEST_AUTH_RESULT);
}
}
}
});