官方文档 :https://cloud.tencent.com/document/product/1007/35866
前期操作就是一系列的申请啊,拿到对应的AppId 和 keyLicence,secret ,没什么要求,就是等待审核,本文就讲代码接入
步骤。
申请签名需要ticket,申请ticket 需要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"
}
请求 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"
}]
}
(这里用到了Hasing,需要用到guava-28.2-jre.jar链接:https://download.csdn.net/download/qq_39836064/12194244)
public static String sign(List 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 values = new ArrayList();
values.add(wbappid);
values.add(userId);
values.add(version);
values.add(nonceStr);
String sign = sign(values, ticket);
这时候就拿到sign了,可以去申请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"
}
}
//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 ;
public static final *;
}
-keep public class com.webank. facelight.tools.WbCloudFaceVerifySdk$*{
*;
}
-keep public class com.webank.record.**{
public ;
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 ;
}
-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 ;
}
-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 ;
}
-keep class com.tencent.youtufacelive.tools.YTUtils{
public ;
}
-keep class com.tencent.youtufacelive.tools.YTFaceLiveLogger{
public ;
}
-keep class com.tencent.youtufacelive.tools.YTFaceLiveLogger$IFaceLiveLogger{
*;
}
-keep class com.tencent.youtufacelive.IYTMaskStateListener{
*;
}
-keep class com.tencent.youtufacelive.YTPreviewHandlerThread{
public static *;
public ;
}
-keep class com.tencent.youtufacelive.YTPreviewHandlerThread$IUploadListener{
*;
}
-keep class com.tencent.youtufacelive.YTPreviewHandlerThread$ISetCameraParameterListener{
*;
}
-keep class com.tencent.youtufacelive.YTPreviewMask{
public ;
}
-keep class com.tencent.youtufacelive.YTPreviewMask$TickCallback{
*;
}
-keeppackagenames com.webank.mbank.permission_request
# 保留自定义控件(继承自View)不能被混淆
-keep public class * extends android.view.View {
public (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (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 ;
}
-keep interface com.webank.mbank.wehttp.**{
public ;
}
-keep public class com.webank.mbank.wehttp.WeLog$Level{
*;
}
-keep class com.webank.mbank.wejson.WeJson{
public ;
}
-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 (android.content.Context);
}
#########云产品依赖的第三方库 混淆规则-END#############
参数 | 说明 | 类型 | 长度(字节) | 是否必填 |
---|---|---|---|---|
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 | 腾讯云线下对接决定 | 是 |
# 在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 | 错误信息内容 | 错误的详细实际原因,主要用于定位问题 |