一、准备工作
概述
本文是实人认证SDK_Android v1.0.7版本的接入文档,用于指导SDK的使用方法,默认读者已经熟悉 IDE(Eclipse 或者 Android Studio)的基本使用方法,以及具有一定的 Android 编程知识基础。
前置条件
- 实人认证SDK支持minSdkVersion 15及以上版本
- cpu架构arm64-v8a 及armeabi-v7a,armeabi,x86
- 平台获取appId,appKey,两个证书aip.license 和idl-license.face-android
快速体验demo
- Android压缩包附带的apk文件夹中是实人认证demo的安装包,可以直接安装到Android手机上。并快速体实人认证在您的手机上的表现。
- Android压缩包附带的demo文件夹中是实人认证的示例工程,使用Android studio打开示例工程,完成以下步骤配置,然后直接运行起来测试。
a.将build里面的applicationId换成对应的测试包名
b.将签名配置改成您的签名配置
c.将AppId和AppKey换成您在实人认证创建应用后生成的信息
d.将assets目录下的两个证书文件换成自己的,这个两个证书aip.license 和idl-license.face-android对接的时候提供.
开发环境搭建
(1)将开发包拷贝到工程
a.将SDK中libs目录下的aar包拷贝到自己工程的libs目录下,如没有该目录需新建。
b.SDK中assets目录下包LinkfaceID.lic文件拷贝到自己工程的assets目录下,如没有该目录需新建。
libs所在目录结构如下图:
jni及资源目录如下图:
在app文件夹下的build.gradle的dependencies中配置对应版本的aar依赖并添加repositories,详细代码如下:
apply plugin: 'com.android.application' android { compileSdkVersion xx defaultConfig { applicationId "xxx.xxx.xxx" minSdkVersion xx targetSdkVersion xx versionCode 1 versionName "1.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } repositories { flatDir { dirs '../app/libs' } } dependencies { compile(name: 'rpc_sdk_android_v1.0.8', ext: 'aar') }
(2)配置AndroidManifest.xml文件
在manifest标签内添加必要的权限支持
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 需要使用Feature --> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.camera.front" android:required="false"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> <uses-feature android:name="android.hardware.camera.flash" android:required="false"/>
配置权限说明
权限名称 | 权限说明 | 使用说明 |
INTERNET | 网络权限 | 用于访问网络交互数据 |
CAMERA | 摄像头权限 | 用于SDK调用摄像头识别人脸及 |
WRITE_EXTERNAL_STORAGE | 允许程序写入外部存储,如SD卡上写文件 | 拍摄照片时的临时存储 |
READ_EXTERNAL_STORAGE | 允许程序写入外部存储,如SD卡上写文件 | 拍摄照片时的临时存储 |
ACCESS_WIFI_STATE | WiFi权限 | 获取当前的wifi网络状态 |
READ_PHONE_STATE | 允许读取手机状态的权限 | 获取IMEI |
ACCESS_NETWORK_STATE | 获取网络状态权限 | 获取当前手机的网络状态 |
注意:Android6.0及以上版本敏感权限需动态申请。
二.SDK使用说明
1.本地初始化
使用实人认证功能前,需在application中调用本地数据初始化。
方法原型
public void init(Context context, String appId, String appKey, String LicenseID) { }
参数描述
参数 | 类型 | 说明 |
context | Context | 必须传ApplicationContext对象 |
appId | String | 实人认证平台获取到的appId |
appKey | String | 实人认证平台获取到的appKey |
licenseId | String | 由平台对接人员提供 |
示例代码
RPCSDKManager.getInstance().init(getApplicationContext(), appId, appKey, licenseId) { };
2.自定义活体检测动作
用户可根据需求选择活体检测动作及顺序,动作执行顺序由list添加顺序决定。
方法示例
List<LivenessTypeEnum> list = new ArrayList<>(); list.add(LivenessTypeEnum.Eye); RPCSDKManager.getInstance().setLivenessTypeEnum(list);
动作枚举类型
public enum LivenessTypeEnum { Eye, Mouth, HeadLeft, HeadRight, HeadLeftOrRight, }
注意:setLivenessTypeEnum()方法必须调用,list可以传空。
枚举类型说明
类型 | 检测动作 |
Eye | 眨眨眼 |
Mouth | 张张嘴 |
HeadLeft | 向左摇头 |
HeadRight | 向右摇头 |
HeadLeftOrRight | 摇摇头 |
3.自定义活体检测动作
方法示例
/** * 设置身份证详情页是否可修改 */ RPCSDKManager.getInstance().setModifiedIdcardMsg(Boolean isModifiedName, Boolean isModifiedAddress, Boolean isModifiedIdcardNum){ }
参数说明
参数 | 类型 | 说明 |
isModifiedName | Boolean | true:姓名可以修改 false:姓名不可修改 |
isModifiedAddress | Boolean | true:地址可以修改 false: 地址不可修改 |
isModifiedIdcardNum | Boolean | true:身份证号可以修改 false:身份证号不可修改 |
4.获取sdk版本号
方法示例
RPCSDKManager.getInstance().getVersion();
返回值说明
返回值 | 说明 |
String | SDK版本号 |
5.关闭SDK中所有activity对象
方法示例
RPCSDKManager.getInstance().finishActivity();
6.启动实人认证SDK首页
方法示例
RPCSDKManager.getInstance().startAuthentication(MainActivity.this);
参数说明
参数 | 类型 | 说明 |
MainActivity.this | Activity | 必须使用Activity对象 |
7.获取TikerID回调
执行实人认证流程,需生成tikerID,方便客户查询交易流水记录,回调方法需要在启动实人认证的activity中处理。
方法示例
RPCSDKManager.getInstance().getTiker(new RPCSDKManager.TikerCallBack() { public void onSuccess(String tiker) { //获取tickterID成功,可启动实人认证方法 RPCSDKManager.getInstance().startAuthentication(MainActivity.this); } public void onFail(String code, String fail) { //获取tickerID失败,不能执行实人认证操作 } });
注意:Tiker返回成功的话,可以进行实人认证流程,如果失败,关闭入口,不能进行实人认证。
onSuccess回调说明(成功回调)
参数 | 类型 | 说明 |
tiker | String | 账号校验结果信息 |
onFail回调说明(失败回调)
参数 | 类型 | 说明 |
code | String | 错误码(具体报错 请查询错误码) |
fail | String | 错误原因 |
8.认证结果RPClister 回调
代码示例
public class RPCListener implements IRPCLister { /** * 失败回调 */ public void onFail(String code, String failMsg) { } /** * 人证对比成功接口回调 */ public void onVerifaction(String code, String score) {} /** * 身份核验成功回调 */ public void onIdentityCardAuth(String code, String msg) {} /** * 图片地址回调 */ public void onVerifiedPic(String code, Map<String, String> picVerifiedMap) { } /** * 身份证正反面ocr回调 */ public void onIdcardMsg(String code, String IdcardFront, String IdcardBack) { } /** * 用户修改后的身份证信息回调 */ public void onIdcardModifiedMsg(String code, String IdcardFront, String IdcardBack) {} }
人证对比成功接口回调
人证对比成功接口回调说明
public void onVerifaction(String code,String score) {}
人证对比成功接口回调参数说明
参数 | 类型 | 说明 |
code | String | 错误码(具体报错 请查询错误码)1000为成功 |
score | String | 指人证对比接口返回的分数 |
接口调用失败回调
接口调用失败回调说明
public void onFail(String code, String failMsg) { }
接口调用失败回调参数说明
参数 | 类型 | 说明 |
code | String | 根据code值判断是否成功调用接口,code为“1007”时,指人证对比调用失败,code为“1008”指身份核验调用失败 |
failMsg | String | 错误原因 |
身份核验成功回调
身份核验成功回调说明
public void onIdentityCardAuth(String code,String msg) { }
身份核验成功回调参数说明
参数 | 类型 | 说明 |
code | String | code为“1000”时成功 |
msg | String | 该字符串是指,身份证核验接口返回的数据信息类似于{"chargeStatus":1,"message":"成功","data":{"orderNo":"xx","handleTime":"xx","result":"01","province":"xx","city":"xx","country":"xx","birthday":"xx","age":"xx","gender":"xx","remark":"一致"},"code":"200000"} |
身份证核验结果需要从msg中的result判断
参数 | 类型 | 说明 |
result | String | 返回结果 01-认证一致02-认证不一致03-认证不确定04-认证失败 |
图片地址回调
图片地址回调说明
public void onVerifiedPic(String code ,Map<String, String> picVerifiedMap) { }
图片地址回调参数说明
参数 | 类型 | 说明 |
code | String | code为“1000”时成功 |
picVerifiedMap | Map | 将活体检测图片和身份证正反面照片地址存到map,供客户取用,打印如下 {rpc_sdk_idcard_front=/storage/emulated/0/ocr/1545718590229.jpg, Eye=/storage/emulated/0/ocr/1545718582972.jpg, rpc_sdk_idcard_back=/storage/emulated/0/ocr/1545718595424.jpg} |
身份证正反面OCR回调
身份证正反面OCR回调说明
public void onIdcardMsg(String code, String IdcardFront, String IdcardBack) { }
身份证正反面OCR回调参数说明
参数 | 类型 | 说明 |
code | String | code为“1000”时成功 |
IdcardFront | String | 需要做判空处理,不为空的话如下:{"chargeStatus":1,"message":"成功","data":{"tradeNo":"18122719530547025","code":"0","riskType":"normal","address":"xxx","birth":"xxx","name":"xx","cardNum":"xx","sex":"男","nation":"汉"},"code":"200000"} |
IdcardBack | String | 需要做判空处理,不为空的话如下:{"chargeStatus":1,"message":"成功","data":{"tradeNo":"18122719530547024","code":"0","issuingDate":"xx","issuingAuthority":"xx","expiryDate":"xx"},"code":"200000"} |
用户修改后的身份证信息回调
当身份证信息页设置能修改时有值,否则为空
用户修改后的身份证信息回调说明
public void onIdcardModifiedMsg(String code, String IdcardFront, String IdcardBack) { }
用户修改后的身份证信息回调参数说明
参数 | 类型 | 说明 |
code | String | code为“1000”时成功 |
IdcardFront | String | {"chargeStatus":1,"message":"成功","data":{"tradeNo":"18122719530547025","code":"0","riskType":"normal","address":"xxx","birth":"xxx","name":"xx","cardNum":"xx","sex":"男","nation":"汉"},"code":"200000"} |
IdcardBack | String | {"chargeStatus":1,"message":"成功","data":{"tradeNo":"18122719530547024","code":"0","issuingDate":"xx","issuingAuthority":"xx","expiryDate":"xx"},"code":"200000"} |
三.混淆
-dontwarn com.baidu.ocr.** -keep class com.baidu.idl.** { *; } -keep class com.baidu.ocr.sdk.**{*;} -keep class com.rpc.manager.RPCSDKManager{public *;} -keep class com.rpc.manager.IRPCLister{public *;} -keep class com.rpc.enumerate.LivenessTypeEnum {*;} -keepclasseswithmembers class com.rpc.manager.RPCSDKManager$TikerCallBack {<methods>;}
四.返回码说明
1.code返回码
code值 | 说明 |
1000 | 实人认证,可得到网络请求参数 |
1001 | SDK初始化失败 |
1002 | 权限获取失败 |
1003 | 网络异常 |
1004 | 活体检测超时 |
1005 | OCR正面认证失败 |
1006 | OCR反面认证失败 |
1007 | 人证核验失败 |
1008 | 二要素验证失败 |
1009 | 获取ticket失败 |
1010 | appId为空 |
1011 | appKey为空 |
2.内层code返回码(result内部code)
外层Code为1005或1006或1007或1008时,内层code返回码
状态码 | 说明 |
400001 | 参数校验异常 |
403000 | 用户校验失败 |
415000 | 请求数据转换异常 |
500000 | 系统异常 |
500002 | 数据处理异常 |
500003 | 业务操作失败 |
500004 | 远程调用失败 |
500005 | 账户余额异常 |
500006 | 请求外部系统失败 |
504000 | 系统超时 |
400101 | 在下游系统中的商户信息不存在 |
403101 | 账户被下游系统禁用 |
403102 | 账户在下游系统中没有被激活 |
510101 | 在下游系统中的用户产品可用数量不足 |
400102 | 商户IP地址在下游系统中不合法 |
400200 | 黑名单列表 |
400201 | 手机号码不能为空 |
400901 | 账户信息不存在 |
400902 | 应用类型信息不存在 |
500901 | 邮箱未设置 |
500902 | 账户信息已存在 |
500903 | 账户相关能力已激活 |