Android 快速接入腾讯云人脸核身(识别)

Android 通过 SDK 快速接入腾讯云人脸核身

官方文档 :https://cloud.tencent.com/document/product/1007/35866

前期操作就是一系列的申请啊,拿到对应的AppId 和 keyLicence,secret ,没什么要求,就是等待审核,本文就讲代码接入

步骤。

一  、申请签名和faceId(文档上说是后台申请,但是你也可以都在Android端搞定)

申请签名需要ticket,申请ticket 需要Access Token.

  •  申请 Access Token:

     请求 URL:https://idasc.webank.com/api/oauth2/access_token 请求方法GET

     请求参数:

参数 说明 类型 长度(字节) 是否必填
app_id 请添加小助手微信 faceid001,进行线下对接获取 String 腾讯云线下对接决定
secret 请添加小助手微信 faceid001,进行线下对接获取 String 腾讯云线下对接决定
grant_type 授权类型,默认值为:client_credential(必须小写) String 20
version 版本号,默认值为:1.0.0 String 20

成功响应:

{
"code":"0","msg":"请求成功",
"transactionTime":"20151022043831",
"access_token":"accessToken_string",
"expire_time":"20151022043831",
"expire_in":"7200"
}
  • 申请Ticket

       请求 URL:https://idasc.webank.com/api/oauth2/api_ticket 请求方法:GET

       请求参数:

参数 说明 类型 长度(字节) 是否必填
app_id 请添加小助手微信 faceid001,进行线下对接获取 String 腾讯云线下对接决定
access_token 请根据 Access Token 获取 指引进行获取 String 腾讯云线下对接决定
type ticket 类型,默认值:NONCE(必须大写) String 20
version 版本号 String 20
user_id 当前使用用户的唯一标识,需合作伙伴自行定义
注意:合作伙伴必须保证 user_id 的全局唯一性
String 30

       响应结果:

{
    "code": "0",
    "msg": "请求成功",
    "transactionTime": "20151022044027",
    "tickets": [{
        "value": "ticket_string",
        "expire_in": "120",
        "expire_time": "20151022044027"
    }]
}
  •  拿到ticket后,就可以生成sign了
  • 生成签名的算法:

(这里用到了Hasing,需要用到guava-28.2-jre.jar链接:https://download.csdn.net/download/qq_39836064/12194244

public static String sign(List<String> values, String ticket) {
    if (values == null) {
        throw new NullPointerException("values is null");
    }
    values.removeAll(Collections.singleton(null));// remove null
    values.add(ticket);
    java.util.Collections.sort(values);

    StringBuilder sb = new StringBuilder();
    for (String s : values) {
        sb.append(s);
    }
    return Hashing.sha1().hashString(sb, Charsets.UTF_8).toString().toUpperCase();
}

 传入参数为:

参数 说明 来源
wbappid 请添加小助手微信 faceid001,进行线下对接获取 腾讯云线下对接分配
userId 用户唯一标识 合作方自行分配(与 SDK 里定义的 userId 保持一致)
version 参数值为:1.0.0 -
ticket 合作伙伴服务端缓存的 ticket,注意是 NONCE 类型 获取方式请参见 获取 NONCE ticket(所用的 userId 参数值需要与 SDK 里面定义 userId 值保持一致)
nonceStr 必须是32位随机数 合作方自行生成(与 SDK 里定义的随机数保持一致)
        List<String> values = new ArrayList<String>();
        values.add(wbappid);
        values.add(userId);
        values.add(version);
        values.add(nonceStr);
        String sign = sign(values, ticket);

这时候就拿到sign了,可以去申请faceId了。

  • 生成faceId

     请求 URL:https://idasc.webank.com/api/server/getfaceid   请求方法:POST

     报文格式:Content-Type: application/json

参数 说明 类型 长度(字节) 是否必填
webankAppId 请添加小助手微信 faceid001,进行线下对接获取 String 腾讯云线下对接决定
orderNo 订单号,由合作方上送,每次唯一,不能超过 32 位 String 不能超过 32 位
name 姓名 String -
idNo 证件号码 String -
userId 用户 ID ,用户的唯一标识(不能带有特殊字符) String -
sourcePhotoStr 比对源照片,注意:原始图片不能超过 500k,且必须为 JPG 或 PNG 格式。 参数有值:使用合作伙伴提供的比对源照片进行比对,必须注照片是正脸可信照片,照片质量由合作方保证。参数为空 :根据身份证号 + 姓名使用权威数据源比对 BASE64String 1048576 否,非必填
sourcePhotoType 比对源照片类型,参数值为1 时是:水纹正脸照。参数值为 2 时是:高清正脸照 String 1
version 默认参数值为:1.0.0 String 20
sign 签名:使用上面生成的签名 String 40

响应:

{
"code": 0,
"msg": "成功",
"result": {
     "bizSeqNo":"业务流水号",
     "orderNo":"合作方订单号",
     "faceId":"cc1184c3995c71a731357f9812aab988"
    }
}

二 、Android端接入

  •  添加腾讯云提供的arr 文件
//1. 云刷脸SDK
 compile(name: 'WbCloudFaceLiveSdk-版本号-githash值', ext: 'aar')
 //2. 云normal SDK
 compile(name: 'WbCloudNormal-版本号-githash值', ext: 'aar')

 混淆规则

###############云刷脸混淆规则 faceverify-BEGIN##################
#不混淆内部类
-keepattributes InnerClasses

-keep public class com.webank.facelight.tools.WbCloudFaceVerifySdk{
    public <methods>;
    public static final *;
}
-keep public class com.webank. facelight.tools.WbCloudFaceVerifySdk$*{
    *;
}
-keep public class com.webank.record.**{
    public <methods>;
    public static final *;
}
-keep public class com.webank. facelight.ui.FaceVerifyStatus{

}
-keep public class com.webank. facelight.ui.FaceVerifyStatus$Mode{
    *;
}
-keep public class com.webank. facelight.tools.IdentifyCardValidate{
    public <methods>;
}
-keep public class com.tencent.youtulivecheck.**{
    *;
}
-keep public class com.webank. facelight.contants.**{
    *;
}
-keep public class com.webank. facelight.listerners.**{
    *;
}
-keep public class com.webank. facelight.Request.*$*{
    *;
}
-keep public class com.webank. facelight.Request.*{
    *;
}
-keep public class com.webank. facelight.config.FaceVerifyConfig {
    public <methods>;
}

-keep class com.tencent.youtuface.**{
    *;
}
-keep class com.tencent.youtulivecheck.**{
    *;
}
-keep class com.tencent.youtufacetrack.**{
    *;
}
-keep class com.tencent.youtufacelive.model.**{
    *;
}
-keep class com.tencent.youtufacelive.tools.FileUtils{
public <methods>;
}
-keep class com.tencent.youtufacelive.tools.YTUtils{
    public <methods>;
}
-keep class com.tencent.youtufacelive.tools.YTFaceLiveLogger{
    public <methods>;
}
-keep class com.tencent.youtufacelive.tools.YTFaceLiveLogger$IFaceLiveLogger{
     *;
}
-keep class com.tencent.youtufacelive.IYTMaskStateListener{
    *;
}
-keep class com.tencent.youtufacelive.YTPreviewHandlerThread{
    public static *;
    public <methods>;
}
-keep class com.tencent.youtufacelive.YTPreviewHandlerThread$IUploadListener{
     *;
}
-keep class com.tencent.youtufacelive.YTPreviewHandlerThread$ISetCameraParameterListener{
     *;
}
-keep class com.tencent.youtufacelive.YTPreviewMask{
    public <methods>;
}
-keep class com.tencent.youtufacelive.YTPreviewMask$TickCallback{
    *;
}
-keeppackagenames com.webank.mbank.permission_request
# 保留自定义控件(继承自View)不能被混淆
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(***);
    *** get* ();
}
################云刷脸混淆规则 faceverify-END########################

#############webank normal混淆规则-BEGIN###################
#不混淆内部类
-keepattributes InnerClasses
-keepattributes *Annotation*
-keepattributes Signature

-keep, allowobfuscation @interface com.webank.normal.xview.Inflater
-keep, allowobfuscation @interface com.webank.normal.xview.Find
-keep, allowobfuscation @interface com.webank.normal.xview.BindClick

-keep @com.webank.normal.xview.Inflater class *
-keepclassmembers class * {
    @com.webank.normal.Find *;
    @com.webank.normal.BindClick *;
}

-keep public class com.webank.normal.net.*$*{
    *;
}
-keep public class com.webank.normal.net.*{
    *;
}
-keep public class com.webank.normal.thread.*$*{
   *;
}
-keep public class com.webank.normal.thread. *{
   *;
}
-keep public class com.webank.normal.tools.WLogger{
    *;
}
-keep public class com.webank.normal.tools.*{
*;
}

#wehttp混淆规则
-dontwarn com.webank.mbank.okio.**

-keep class com.webank.mbank.wehttp.**{
    public <methods>;
}
-keep interface com.webank.mbank.wehttp.**{
    public <methods>;
}
-keep public class com.webank.mbank.wehttp.WeLog$Level{
    *;
}
-keep class com.webank.mbank.wejson.WeJson{
    public <methods>;
}
-keep public class com.webank.mbank.wehttp.WeReq$ErrType{ 
     *;
}
#webank normal包含的第三方库bugly
-keep class com.tencent.bugly.webank.**{
    *;
}
###########webank normal混淆规则-END#######################
########云产品依赖的第三方库 混淆规则-BEGIN############

## support:appcompat-v7
-keep public class android.support.v7.widget.** { *; }
-keep public class android.support.v7.internal.widget.** { *; }
-keep public class android.support.v7.internal.view.menu.** { *; }

-keep public class * extends android.support.v4.view.ActionProvider {
    public <init>(android.content.Context);
}

#########云产品依赖的第三方库 混淆规则-END#############
  •  调用SDK所需参数
参数 说明 类型 长度(字节) 是否必填
faceId 刷脸 ID 号,由合作方向人脸识别后台拉取获得 String -
agreementNo 订单号,合作方订单的唯一标识 String 32
openApiAppId 腾讯云线下对接分配的 AppID String 腾讯云线下对接决定
openApiAppVersion 接口版本号,默认填:1.0.0 String 20
openApiNonce 与服务端生成签名的随机数保持一致 String 32
openApiUserId User Id,每个用户唯一的标识,和服务端保持一致 String 30
openApiSign 第一步中 通过 ticket 计算出来的签名信息 String 40
verifyMode 人脸核身类型
光线活体:FaceVerifyStatus.Mode.REFLECTION
动作活体是:FaceVerifyStatus.Mode.ACT
数字活体是:FaceVerifyStatus.Mode.NUM
FaceVerifyStatus.Mode -
keyLicence 腾讯云线下对接分配的 Licence String 腾讯云线下对接决定
  • 用自己的数据调用腾讯云SDK提供的接口
# 在MainActivity中单击某个按钮的代码逻辑:
//先填好数据 
Bundle data = new Bundle();
WbCloudFaceVerifySdk.InputData inputData = new WbCloudFaceVerifySdk.InputData(
                faceId,
                agreementNo,
                openApiAppId,
                openApiAppVersion,
                openApiNonce,
                userId,
                userSign,
                verifyMode,
                keyLicence);
  data.putSerializable(WbCloudFaceContant.INPUT_DATA, inputData);

  //个性化参数设置,可以不设置,不设置则为默认选项。
  //是否显示成功结果页,默认显示,此处设置为不显示
  data.putBoolean(WbCloudFaceContant.SHOW_SUCCESS_PAGE, false);
  //是否展示刷脸失败页面,默认展示,此处设置为不显示
  data.putBoolean(WbCloudFaceContant.SHOW_FAIL_PAGE, false);
//sdk样式设置,默认为黑色
//此处设置为白色
  data.putString(WbCloudFaceContant.COLOR_MODE, WbCloudFaceContant.WHITE);

//设置选择的比对类型  默认为权威库网纹图片比对
//权威数据源比对 WbCloudFaceContant.ID_CRAD
//自带比对源比对  WbCloudFaceContant.SRC_IMG
//仅活体检测  WbCloudFaceContant.NONE
//此处设置权威数据源对比
  data.putString(WbCloudFaceContant.COMPARE_TYPE, WbCloudFaceContant.ID_CRAD);
//是否需要录制上传视频 默认需要,此处设置为需要 
  data.putBoolean(WbCloudFaceContant.VIDEO_UPLOAD, true);
  //是否对录制视频进行检查,默认不检查,此处设置为不检查
  data.putBoolean(WbCloudFaceContant.VIDEO_CHECK, false);
  //设置是否打开闭眼检测,默认不检测,此处设置为检测
  data.putBoolean(WbCloudFaceContant.ENABLE_CLOSE_EYES, true);
//设置是否打开语音提示,默认打开,此处设置为关闭
  data.putBoolean(WbCloudFaceContant. PLAY_VOICE, false);

//初始化 SDK,得到是否登录 SDK 成功的结果 
WbCloudFaceVerifySdk.getInstance().initSdk(
  MainActivity.this,
  data,a
  //由WbCloudFaceVerifyLoginListener返回登录结果
  new WbCloudFaceVerifyLoginListener() {
            @Override
            public void onLoginSuccess() {
             //登录成功,拉起sdk页面
  WbCloudFaceVerifySdk.getInstance().startWbFaceVerifySdk (MainActivity.this,
new WbCloudFaceVerifyResultListener() {
     //由FaceVerifyResultListener返回刷脸结果
       @Override
public void onFinish(WbFaceVerifyResult result) { 
    if(result != null) {
         if (result.isSuccess()) {
              Log.d(TAG, "刷脸成功!");
           } else {
              Log.d(TAG, "刷脸失败!);
           }
         }
      });
    }
            @Override
            public void onLoginFailed(WbFaceError error) {
              //登录失败
              ...
         }
  • 响应结果
字段名 类型 字段含义 说明
isSuccess boolean 人脸核身是否成功 -
sign String 签名 供 App 校验人脸核身结果的安全性
liveRate String 活体检测分数 -
similarity String 人脸比对分数 “仅活体检测” 类型不提供此分数
userImageString String 用户人脸核身图片 经过 Base64 编码后的用户人脸核身图片,仅用户成功通过验证时返回
WbFaceError 自定义对象 人脸核身错误 人脸核身成功时为 null
  • 错误响应 
字段名 类型 字段含义 说明
domain String 错误发生的阶段 -
code String 错误码 -
desc String 错误描述 如有需求,可以展示给用户
reason String 错误信息内容 错误的详细实际原因,主要用于定位问题
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章