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 | 錯誤信息內容 | 錯誤的詳細實際原因,主要用於定位問題 |