尊敬的用户您好!即日起本官网将启用新域名"shanyan.253.com",原域名(flash.253.com)将自动跳转至新域名,原域名后期将停用。请您及时更新浏览器收藏夹或直接使用新域名访问本官网。万分感谢您的配合!

闪验、创蓝闪验

一、准备工作


概述

本文是实人认证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所在目录结构如下图

image.png


jni及资源目录如下图:

image.png



在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() {
    @Override
    public void onSuccess(String tiker) {
        //获取tickterID成功,可启动实人认证方法
        RPCSDKManager.getInstance().startAuthentication(MainActivity.this);
    }
    @Override
    public void onFail(String code, String fail) {
        //获取tickerID失败,不能执行实人认证操作
    }
});

注意:Tiker返回成功的话,可以进行实人认证流程,如果失败,关闭入口,不能进行实人认证。



onSuccess回调说明(成功回调)

参数

类型

说明

tiker

String

账号校验结果信息


onFail回调说明(失败回调)

参数

类型

说明

code

String

错误码(具体报错 请查询错误码)

fail

String

错误原因


8.认证结果RPClister 回调


代码示例

public class RPCListener implements IRPCLister {
    
/**
 * 失败回调
 */
@Override
public void onFail(String code, String failMsg) { }

 /**
  * 人证对比成功接口回调
  */
@Override
public void onVerifaction(String code, String score) {}

 /**
  * 身份核验成功回调
  */
@Override
public void onIdentityCardAuth(String code, String msg) {}

/**   
 * 图片地址回调
 */
@Override
public void onVerifiedPic(String code, Map<String, String> picVerifiedMap) {
    }
/**   
 * 身份证正反面ocr回调   
 */
@Override
public void onIdcardMsg(String code, String IdcardFront, String IdcardBack) {
}
    
/**   
 * 用户修改后的身份证信息回调
 */
@Override
public void onIdcardModifiedMsg(String code, String IdcardFront, String IdcardBack) {}
}


人证对比成功接口回调


人证对比成功接口回调说明

@Override
public void onVerifaction(String code,String score) {}


人证对比成功接口回调参数说明

参数

类型

说明

code

String

错误码(具体报错 请查询错误码)1000为成功

score

String

指人证对比接口返回的分数


接口调用失败回调

接口调用失败回调说明

@Override
public void onFail(String code, String failMsg) {
}

接口调用失败回调参数说明

参数

类型

说明

code

String

根据code值判断是否成功调用接口,code为“1007”时,指人证对比调用失败,code为“1008”指身份核验调用失败

failMsg

String

错误原因


身份核验成功回调


身份核验成功回调说明

@Override
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-认证失败


图片地址回调


图片地址回调说明

@Override
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回调说明

@Override
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"}


用户修改后的身份证信息回调


当身份证信息页设置能修改时有值,否则为空


用户修改后的身份证信息回调说明

@Override
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

账户相关能力已激活