Android开发接入阿里实人认证

释放双眼,带上耳机,听听看~!

阿里实人认证作用:
通过动作活体的方式采集用户的人脸照片并验证其真实性,并通过与业务已留存的人脸照片进行人脸比对,验证两者是否为同一个人
实人认证接入流程
前往阿里云官网注册账号。如果已有注册账号,请跳过此步骤。
对该账号进行企业实名认证。如果已经是企业账号,请跳过此步骤。
打开云盾实人认证产品页面,单击立即开通,开通实人认证服务。
在接入之前,可以根据业务上的需求,先了解活体人脸验证方案,选择可以满足业务需求的认证方案。
登录阿里云实人认证控制台,在接入及设置页面,创建场景并进行相应的流程配置,具体操作见活体人脸验证场景设置。
根据接入时序图,了解客户端和服务端的交互流程,及各自需要做的事情。
接入时序图

在阿里后台设置场景

//这里仅是使用系统默认胡用户授权声明

点击获取认证SDK,上传apk,下载SDK

解压下载SDK-ANDROID.zip文件
1.将yw_1222_0670.jpg签名图片文件导入到工程应用模块的res/drawable目录下
如果工程在打包时启用了shrinkResources对资源进行压缩,还需要在keep.xml(res/raw/keep.xml)文件中添加以下内容:

2.解压client.zip包后根据上述介绍将SDK包拷入工程的libs目录下**

根据自己项目引入


关于ABI类型
SDK目前支持armeabi、armeabi-v7a、arm64-v8a三种ABI类型

android {
defaultConfig {

ndk {
abiFilters “armeabi-v7a”, “arm64-v8a”
}
}
}
关于签名配置

检查您工程的Gradle Plugin版本是否大于3.4.1,如果Gradle Plugin版本大于3.4.1,请您将Gradle Plugin版本降至3.4.1,并将Gradle版本降至5.4.1。如果无法降低Gradle Plugin及Gradle版本,需要在您工程的App模块下的build.gradle中添加签名配置,示例:
signingConfigs {
release {
// 修改为你的release签名文件信息。
storeFile file(‘test.jks’)
storePassword “test1234”
keyAlias “key0”
keyPassword “test1234”
// 修改为你的release签名文件信息。

        v1SigningEnabled true
v2SigningEnabled true
}
debug {
// 修改为你的release签名文件信息。
storeFile file('test.jks')
storePassword "test1234"
keyAlias "key0"
keyPassword "test1234"
// 你的debug签名文件信息。
v1SigningEnabled true
v2SigningEnabled false
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
signingConfig signingConfigs.debug
}

}
关于混淆配置
android {

buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
}
那么在相应的ProGuard配置文件(proguard-rules.pro)中添加以下配置信息,保证实人认证服务需要的类不被混淆,示例:
-keep class com.taobao.securityjni.{*;}
-keep class com.taobao.wireless.security.
{;}
-keep class com.ut.secbody.**{
;}
-keep class com.taobao.dp.{*;}
-keep class com.alibaba.wireless.security.
{;}
-keep class com.alibaba.security.rp.**{
;}
-keep class com.alibaba.security.cloud.{*;}
-keep class com.alibaba.security.realidentity.
{;}
-keep class com.alibaba.security.biometrics.**{
;}
-keep class com.alibaba.sdk.android.{*;}
-keep class android.taobao.windvane.
{*;}

关于权限配置
使用SDK需要在AndroidManifest.xml中添加以下权限声明(已有则忽略):

如果您使用的RPSDK版本在3.0.0.4(不含)以下,还需要添加以下权限声明(已有则忽略):

在Application里初始化RPVerify

 RPVerify.checkEnvironment(this);
verifyInit = RPVerify.init(getApplicationContext());

调用实人认证
调用开始实人认证的接口前,需要您提前获取verifyToken(verifyToken由您的服务端调用发起认证请求接口DescribeVerifyToken获取),将其传入接口

RPVerify.start接口支持除RPMin外的所有认证方案,该接口会以加载H5的方式显示页面,如果您选择的认证方案只包含活体检测步骤(具体请参见认证方案),并对调起实人认证的速度有较高的要求,可以使用RPVerify.startByNative接口

//调接口,获取verifyToken
if (null != WCApplication.getInstance() && !WCApplication.getInstance().verifyInit) { //判断下初始化有没有成功
Flowable flowable = RetrofitUtil.getInstance().getServiceWithStr(getActivity()).getFaceToken(LoginHelper.get().getToken(), ll_auth_name.getContent().toString().trim(), ll_auth_id.getContent().toString().trim());
HttpUtil.getInstance().toSubscribeNoGson_(getActivity(), flowable, new RxSubscriber() {
@Override
public void onNext(String s) {
try {
JSONObject object = new JSONObject(s);
if (null != object && null != object.getString(“result”)) {
if (object.getString(“result”).equals(“200”)) {
if (null != object.getJSONObject(“data”) && !TextUtils.isEmpty(object.getJSONObject(“data”).optString(“VerifyToken”))) {
biZid = object.getJSONObject(“data”).optString(“Bizid”);
// im_head_bg.setBackground(ContextCompat.getDrawable(PersonAuthActivity.this, R.drawable.im_people_success));
im_head_bg
.setVisibility(View.VISIBLE);
im_head_bg.setVisibility(View.GONE);

                               //用获取的VerifyToken,调用实人认证方法,调起实人认证界面
RPVerify.start(getActivity(), object.getJSONObject("data").optString("VerifyToken"), new RPEventListener() {
@Override
public void onFinish(RPResult auditResult, String code, String msg) {
//实人认证回调方法
if (auditResult == RPResult.AUDIT_PASS) {
// 认证通过。建议接入方调用实人认证服务端接口DescribeVerifyResult来获取最终的认证状态,并以此为准进行业务上的判断和处理。
// do something
success();
//  im_head_bg.setBackground(ContextCompat.getDrawable(PersonAuthActivity.this, R.drawable.im_people_success));
im_head_bg_.setVisibility(View.VISIBLE);
im_head_bg.setVisibility(View.GONE);
tv_status.setText("认证成功");
im_status.setVisibility(View.VISIBLE);
im_status_.setVisibility(View.GONE);
tv_reason.setText("恭喜您认证成功");
tv_next_step.setText("完成");
} else if (auditResult == RPResult.AUDIT_FAIL) {
// 认证不通过。建议接入方调用实人认证服务端接口DescribeVerifyResult来获取最终的认证状态,并以此为准进行业务上的判断和处理。
// do something
//  im_head_bg.setBackground(ContextCompat.getDrawable(PersonAuthActivity.this, R.drawable.im_people_success));
im_head_bg_.setVisibility(View.VISIBLE);
im_head_bg.setVisibility(View.GONE);
resultCode = "";
failure();
tv_status.setText("认证失败");
im_status.setVisibility(View.GONE);
im_status_.setVisibility(View.VISIBLE);
tv_reason.setText("认证失败,请重新认证");
tv_next_step.setText("重新认证");
} else if (auditResult == RPResult.AUDIT_NOT) {
//  im_head_bg.setBackground(ContextCompat.getDrawable(PersonAuthActivity.this, R.drawable.im_people_success));
im_head_bg_.setVisibility(View.VISIBLE);
im_head_bg.setVisibility(View.GONE);
resultCode = "";
if (null != auditResult) {
tv_status.setText("认证失败");
im_status.setVisibility(View.GONE);
im_status_.setVisibility(View.VISIBLE);
tv_next_step.setText("重新认证");
if (code.equals("3203")) {
resultCode = "3203";
tv_reason.setText("原因:设备不支持扫脸");
} else if (code.equals("3208")) {
resultCode = "3208";
tv_reason.setText("原因:公安网没有留存身份证照片");
} else if (code.equals("3101")) {
tv_reason.setText("原因:用户姓名身份证实名校验不匹配");
} else if (code.equals("3102")) {
tv_reason.setText("原因:实名校验身份证号不存在");
} else if (code.equals("3103")) {
tv_reason.setText("原因:实名校验身份证号不合法");
} else if (code.equals("3204")) {
tv_reason.setText("原因:非本人操作");
} else if (code.equals("3206")) {
tv_reason.setText("原因:非本人操作");
} else if (code.equals("3001")) {
tv_reason.setText("原因:认证token无效或已过期");
} else if (code.equals("-10")) {
tv_reason.setText("原因:设备问题,如设备无摄像头、无摄像头权限、摄像头初始化失败、当前手机不支持端活体算法等");
} else if (code.equals("-20")) {
tv_reason.setText("原因:端活体算法异常,如算法初始化失败、算法检测失败等");
} else if (code.equals("-30")) {
tv_reason.setText("原因:网络问题导致的异常,如网络链接错误、网络请求失败等。需要您检查网络并关闭代理");
} else if (code.equals("-40")) {
tv_reason.setText("原因:SDK异常,原因包括SDK初始化失败、SDK调用参数为空、活体检测被中断(如电话打断)等");
} else if (code.equals("-50")) {
tv_reason.setText("原因:用户活体失败次数超过限制");
} else if (code.equals(" -60")) {
tv_reason.setText("原因:手机的本地时间和网络时间不同步");
} else if (code.equals("-10000")) {
tv_reason.setText("原因:客户端发生未知错误");
} else if (code.equals(" 3104")) {
tv_reason.setText("原因:认证已通过,重复提交");
} else {
tv_reason.setText("请重新认证");
}
} else {
tv_reason.setText("请重新认证");
}
failure();
if (code.equals("-1")) {
//tv_reason.setText("原因:用户在认证过程中,主动退出");
im_head_bg_.setVisibility(View.GONE);
im_head_bg.setVisibility(View.VISIBLE);
ll_first.setVisibility(View.VISIBLE);
ll_last.setVisibility(View.GONE);
tv_next_step.setText("下一步");
tv_next_step.setBackground(getResources().getDrawable(R.drawable.bg_43b9e0_radius_23_all));
tv_next_step.setTextColor(getResources().getColor(R.color.main_ffff));
}
}
}
});
} else {
T("获取token失败");
}
} else if (object.getString("result").equals("201")) {
T("获取token失败");
return;
} else if (object.getString("result").equals("401")) {
T("您的认证次数过多,请联系客服操作");
return;
} else if (object.getString("result").equals("500")) {
T("身份证已认证/审核中");
return;
} else if (object.getString("result").equals("501")) {
T("身份证号码有误");
return;
} else if (object.getString("result").equals("502")) {
T("身份认证信息已存在");
return;
} else {
}
}
} catch (JSONException e) {
e.printStackTrace();
} finally {
}
}
@Override
public void _onError(String msg) {
T(msg);
}
});
} else {
}
}

错误码说明

运行程序,测试


在阿里后台的认证记录查询里查看认证结果

人已赞赏
Android文章

android开发接入极光一键登入

2021-2-2 0:15:34

Android文章

Android开发接入极光推送,接入华为,小米,OPPO,VIVO厂商通道

2021-2-2 1:09:56

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索