下載實人認證Android SDK的ZIP壓縮包后,您可以參照本文內容將Android SDK集成到您的Android應用中。

背景信息

關于開發環境IDE,Android Studio是Google官方推出并集成了多個便捷的開發插件的Android開發平臺,本文將基于Android Studio(以下簡稱AS)介紹相關操作。關于Android Studio的更多信息,請參見Android Studio

注意 實人認證Android SDK(以下簡稱SDK)與阿里云賬號綁定。為了您的業務安全,您更換阿里云賬號后,需要在實人認證管理控制臺重新下載SDK。

在工程中導入SDK

在控制臺成功上傳APK包后,您可以下載并獲取到一個名為阿里云認證SDK-ANDROID.zip的ZIP壓縮包。

關于SDK包

解壓ZIP包后,您將看到一系列SDK相關的依賴包,下表介紹了這些SDK包、文件的說明。其中,xxx表示版本號。

名稱 描述
Sample/ 可參考的Demo工程,打上TODO標簽的內容表示需要注意的點。
SDK包/rpsdk-xxx.aar 活體、認證SDK。
SDK包/SecurityGuardSDK-external-xxx-xxx.aar 安全加固依賴包。
說明 如果工程已集成阿里體系的其他產品(如阿里百川等)并含有該包,需判斷哪個版本較新,并使用較新的版本。
SDK包/SecurityBodySDK-external-xxx-xxx.aar 安全加固依賴包。
說明 如果工程已集成阿里體系的其他產品(如阿里百川等)并含有該包,需判斷哪個版本較新,并使用較新的版本。
SDK包/MiddleTierSDK-external-xxx-xxx.aar 安全加固依賴包。
說明 如果工程已集成阿里體系的其他產品(如阿里百川等)并含有該包,需判斷哪個版本較新,并使用較新的版本。
SDK包/jniLibs-libc++_shared.zip 包含需要額外加入的SO公共依賴庫文件*libc++_shared.so*

Google官方建議存在多個SO時,在編譯生成C++ SO文件時選擇STL類型為c++_shared,保證擴展性。更多內容,請參見NDK編譯—C++ 庫支持

RPSDK從3.2.0.0版本開始采用此種編譯方式。您也可在Android NDK(建議使用ndk-18)包、目錄(ndk-bundle)下的sources/cxx-stl/llvm-libc++/libs/路徑下找到不同ABI類型的*libc++_shared.so*文件。

SDK包/jniLibs-armeabi.zip 為節省包體積,RPSDK從3.2.0.0版本開始已不再默認打入兼容armeabi的SO文件。
說明 ARM v5(對應ABI類型armeabi)已經是Android系統相當老舊的CPU架構版本。目前主流的版本是ARM v7(對應ABI類型armeabi-v7a),從Android 2.2開始支持。

如果您不需要考慮比之更低的版本,可忽略該ZIP文件。反之,或如果您應用的其他依賴包尚未提供兼容armeabi-v7a的支持包,必須要求armeabi,可在工程src/main/jniLibs(默認)目錄下加入該ZIP包下的相應文件。

解壓出SDK依賴包后,建議在工程根目錄下創建目錄libs(已有則忽略),根據上述介紹將SDK包拷入工程的libs目錄下。目錄
同時,解壓出jniLibs.zip壓縮包內容后,需要將內容拷至src/main/jniLibs(默認JNI依賴SO文件目錄)下。目錄2
說明 src/main/jniLibs并不是固定的,這和您定義的默認源集配置(sourceSets)有關。更多內容,請參見Google官方文檔更改默認源集配置。默認情況下,jni的SO庫文件在src/main/jniLibs下。

在工程中集成SDK

注意 已經集成SDK的客戶,在升級新版本SDK時,要升級SDK里的安全加固相關的aar包(即SecurityGuardSDK和SecurityBodySDK相關的aar包)。

當SDK在4.13.0及以上版本,SDK不再強制校驗應用的包名和簽名,且簽名圖片已經自動合并到rpsdk_xxx.aar中,所以建議您刪除存放在本地的yw_1222_*.jpg圖片(該建議主要針對集成4.13.0之前版本的用戶)。

基于包體積考慮,SDK在4.13.0及以上版本已經去除windvaneossokhttp等相關三方包依賴。所以客戶可以基于自己實際的業務選擇是否刪除相關依賴。

添加SDK包依賴

以直接在應用下進行集成為例,在應用module下的build.gradle文件內,聲明flatDir路徑(如果已有則忽略):

apply plugin: 'com.android.application'

repositories {
  flatDir {
    dirs '../libs'
  }
}

以gradle版本大于等于3.0.0(非gradle tools版本,gradle版本可在gradle/wrapper/gradle-wrapper.properties下查看)為例,在應用module下的build.gradle文件內聲明SDK包依賴:

dependencies {
    implementation fileTree(dir: '../libs', include: ['*.jar'])
    implementation (name:'rpsdk-4.13.2', ext:'aar')
    implementation (name:'SecurityGuardSDK-external-release-5.5.15071059', ext:'aar')
    implementation (name:'SecurityBodySDK-external-release-5.5.15071314', ext:'aar')
    implementation (name:'MiddleTierSDK-external-release-5.5.13874142', ext:'aar')
}
說明 關于AAR包的引入方式建議采用以上示例的寫法,不要和JAR包混在一起引入,防止某些gradle版本無法正確解壓出AAR包內容。

關于ABI類型

SDK目前支持armeabi、armeabi-v7a、arm64-v8a三種ABI類型,其中RPSDK從3.2.0.0版本開始不再默認包含armeabi類型的SO庫文件,建議接入方在應用module下的build.gradle文件內,添加abiFilters配置,示例:
android {
      defaultConfig {
            ndk {
                abiFilters "armeabi-v7a", "arm64-v8a"
            }
    }
}

關于簽名配置

實人認證SDK要求必須存在V1簽名,否則實人認證SDK無法正常工作。關于如何檢測APK是否存在V1簽名,請參考官方文檔檢查apk是否包含V1簽名。

參考以下build.gradle配置,開啟V1簽名。
 v1SigningEnabled true

關于混淆配置

如果您的應用使用了ProGuard進行代碼混淆,為了保證實人認證服務需要的一些類不被混淆,需要在ProGuard配置文件中添加相關指令。

以AS為例,在應用module下的build.gradle文件內,如果配置了proguardFiles,并且啟用了minifyEnabled,則表明已使用指定的配置文件(一般為proguard-rules.pro)進行了代碼混淆,示例:
android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
那么在相應的ProGuard配置文件(proguard-rules.pro)中添加以下配置信息,保證實人認證服務需要的類不被混淆,示例:
-keep class com.alibaba.security.**{*;}
-keep class com.taobao.dp.**{*;}
-keep class com.taobao.wireless.security.**{*;}
-keep class com.alibaba.wireless.security.**{*;}
-keep class android.taobao.windvane.**{*;}
-keep class android.webkit.JavascriptInterface
另外,如果工程在打包時啟用了shrinkResources對資源進行壓縮,還需要在keep.xml(res/raw/keep.xml)文件中添加以下內容:
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@drawable/yw_1222_*, @layout/rp_*, @drawable/rp_*" />
注意 當工程環境配置的Android Gradle Plugin Version為4.2.0及以上版本時,該keep配置會失效,導致工程打Release包時簽名圖片依然被混淆且無法使用。因此在接入時,您需要在工程的gradle.properties文件中加入android.enableResourceOptimizations=false,防止資源被混淆。

目前暫未支持gradle plugin version為7.0及以上版本。

如果您想了解關于資源壓縮的更多內容,請參見Andriod官方文檔Shrink your app。其中,壓縮資源章節介紹了如何使用shrinkResources壓縮資源、配置keep.xml、自定義要保留的資源。更多內容,請參見壓縮資源

關于權限配置

使用SDK需要在AndroidManifest.xml中添加以下權限聲明(已有則忽略):
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Sample示例工程

壓縮包內包含了可參考的樣例工程(目錄是Sample)。打上TODO標簽的內容表示接入時需要注意的點。請您按照TODO標簽的注意點,修改您業務的包名、簽名和安全圖片后,加上token就可以正常運行該工程。

使用SDK

初始化

一般在應用啟動時,調用RPVerify的初始化接口。示例:
import android.app.Application;
import android.content.Context;

import com.alibaba.security.realidentity.RPVerify;

public class DemoApplication extends Application {
    private Context appContext;

    @Override
    public void onCreate() {
        super.onCreate();
        appContext = this.getApplicationContext();
        // 初始化實人認證SDK。
        RPVerify.init(appContext);
    }
}

上述寫法并不是必須的,您可以在調用RPVerify其他接口前的任意位置調用初始化,但為了方便維護和管理,建議您按照示例操作。

調用實人認證

調用開始實人認證的接口前,需要您提前獲取verifyTokenverifyToken由您的服務端調用發起認證請求接口DescribeVerifyToken獲取),將其傳入接口。

注意 返回的msg為具體的錯誤信息,建議自行存儲。
RPVerify.start(DemoActivity.this, "", new RPEventListener() {
      @Override
      public void onFinish(RPResult auditResult, String code, String msg) {
        if (auditResult == RPResult.AUDIT_PASS) {
              // 認證通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
              // do something
        } else if (auditResult == RPResult.AUDIT_FAIL) {
              // 認證不通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
              // do something
        } else if (auditResult == RPResult.AUDIT_NOT) {
              // 未認證,具體原因可通過code來區分(code取值參見錯誤碼說明),通常是用戶主動退出或者姓名身份證號實名校驗不匹配等原因,導致未完成認證流程。
              // do something
        }
      }
});
說明 code取值請參見錯誤碼說明
RPVerify.start接口支持除RPMin外的所有認證方案,該接口會以加載H5的方式顯示頁面,如果您選擇的認證方案只包含活體檢測步驟,并對調起實人認證的速度有較高的要求,可以使用RPVerify.startByNative接口:
RPVerify.startByNative(DemoActivity.this, "", new RPEventListener() {
    @Override
      public void onFinish(RPResult auditResult, String code, String msg) {
        Toast.makeText(DemoActivity.this, auditResult + "", Toast.LENGTH_SHORT).show();

        if (auditResult == RPResult.AUDIT_PASS) {
              // 認證通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
              // do something
        } else if (auditResult == RPResult.AUDIT_FAIL) {
              // 認證不通過。建議接入方調用實人認證服務端接口DescribeVerifyResult來獲取最終的認證狀態,并以此為準進行業務上的判斷和處理。
              // do something
        } else if (auditResult == RPResult.AUDIT_NOT) {
              // 未認證,具體原因可通過code來區分(code取值參見錯誤碼說明),通常是用戶主動退出或者姓名身份證號實名校驗不匹配等原因,導致未完成認證流程。
              // do something
        }
      }
});
說明
  • code取值請參見錯誤碼說明
  • startByNative接口僅支持活體檢測認證方案(如RPBioOnlyFDBioOnlyFVBioOnly),包含身份證件拍攝等其他步驟的認證方案需要使用start接口。

無論是start接口還是startByNative接口,在開始實人認證的接口中,verifyToken參數由接入方的服務端調用實人認證服務的DescribeVerifyToken接口獲得。

錯誤碼說明

注意 只有錯誤碼為1~12時,您才能通過DescribeVerifyResult接口查詢到服務端的認證結果。如果錯誤碼不為1~12,表示認證未完成(見下表code釋義),您通過DescribeVerifyResult接口將查詢不到認證結果,此時您需要先根據錯誤碼提示進行相應的處理,直至認證完成后,才能查詢認證結果。
具體請參見下表說明:
auditResult code code釋義
RPResult.AUDIT_PASS 1 認證通過。
RPResult.AUDIT_FAIL 2~12 表示認證不通過,具體原因可以調用DescribeVerifyResult接口,查看服務端的認證結果(接口文檔中認證狀態的表格說明)。
RPResult.AUDIT_NOT -1 未完成認證。原因:用戶在認證過程中,主動退出。
-2 未完成認證。原因:由網絡問題引起的客戶端認證異常。
-10 未完成認證。原因:設備問題,如設備無攝像頭、無攝像頭權限、攝像頭初始化失敗、當前手機不支持端活體算法等。
-20 未完成認證。原因:端活體算法異常,如算法初始化失敗、算法檢測失敗等。
-30 未完成認證。原因:網絡問題導致的異常,如網絡鏈接錯誤、網絡請求失敗等。需要您檢查網絡并關閉代理。
-40 未完成認證。原因:SDK異常,原因包括SDK初始化失敗、SDK調用參數為空、活體檢測被中斷(如電話打斷),重復認證等。
-50 未完成認證。原因:用戶活體檢測失敗次數超過限制。
-60 未完成認證。原因:手機的本地時間和網絡時間不同步。
-10000 未完成認證。原因:客戶端發生未知錯誤。
3001 未完成認證。原因:認證token無效或已過期。
3101 未完成認證。原因:用戶姓名身份證實名校驗不匹配。
3102 未完成認證。原因:實名校驗身份證號不存在。
3103 未完成認證。原因:實名校驗身份證號不合法。
3104 未完成認證。原因:認證已通過,重復提交。
3203 未完成認證。原因:設備不支持刷臉。
3204 未完成認證。原因:非本人操作。
3206 未完成認證。原因:非本人操作。
3208 未完成認證。原因:公安底照不存在。

UI定制

實人認證服務為您提供UI定制功能,您可以根據實際需要自定義實人認證頁面的按鈕顏色、文案顏色、文案字體大小和圖片資源等信息。UI定制功能僅適用于實人認證Android SDK版本在4.6.2版本及以上。更多內容,請參見UI定制

// 設置UI自定義皮膚路徑。
public RPConfig.Builder setSkinPath(String path);
// 設置皮膚是否內置。
public RPConfig.Builder setSkinInAssets(boolean b);

自定義配置

  • 設置可配置項

    可通過RPConfig.Builder創建一個RPConfig類實例。

    // 退出彈框是否需要確認。
    public RPConfig.Builder setShouldAlertOnExit(boolean shouldAlertOnExit);
    // 轉場動畫。
    public RPConfig.Builder setTransitionMode(TransitionMode transitionMode);
    // 是否需要聲音。
    public RPConfig.Builder setNeedSound(boolean needSound);
  • 傳入配置項

    可通過初始化接口設置你需要的UI樣式。

    RPVerify.start(android.content.Context, String verifyToken, com.alibaba.security.realidentity.RPConfig config, RPEventListener listener)

常見問題

請參見Android集成常見問題