本文指导您在 Android 应用中集成金融级实人认证服务。

前提条件

应用必须在 Android 4.3+ 平台上运行。

获取 SDK 和 Demo 代码

添加 SDK 依赖

如果您的应用客户端不依赖 mPaaS 基础库,则添加标准版 SDK;如果您的应用客户端依赖 mPaaS 基础库,则 添加 mPaaS 版 SDK

当前 SDK 仅支持 armeabi 的 so 文件。如果您的应用中还有支持其他架构的 SDK,请添加以下代码以保留 armeabi
ndk {
     abiFilters "armeabi"
}

添加标准版 SDK

  1. 解压 AlipayVerifySDK-1.0.2.zip,将所有 .aar 包放入 libs 目录下:
  2. 在工程的 build.gradle 文件中添加 libs 目录作为依赖仓库。
    allprojects {
      repositories {
          // 添加以下内容
          flatDir {
              dirs 'libs'
          }
       }
    }
  3. 在应用的 build.gradle 文件中添加配置
    android {       
        // 添加以下内容      
        useLibrary 'org.apache.http.legacy'
    }
  4. 在应用的 build.gradle 文件中添加依赖。
    dependencies {
        // 添加如下内容
        compile 'com.android.support:appcompat-v7:26.1.0'
        compile (name:'verifysdk-1.0.0.190522154510', ext:'aar')
        compile (name:'releaseLoging-4.0.0.00000003', ext:'aar')
        compile (name:'bio-7.1.0.00000001', ext:'aar')
        compile (name:'hardware-7.1.0.00000001', ext:'aar')
        compile (name:'toyger-7.1.0.00000001', ext:'aar')
        compile (name:'zface-7.1.0.00000001', ext:'aar')
        compile (name:'zim-7.1.0.00000001', ext:'aar')
        compile (name:'rpc-2.1.0.180302121215-ZOLOZ', ext:'aar')
        compile (name:'zolozsdk-7.1.0.00000003', ext:'aar')
        compile (name:'securitysdk-open-6.0.5.20191014', ext:'aar')
        compile 'com.alibaba:fastjson:1.2.8@jar'
        compile 'com.squareup:otto:1.3.8'
    }

添加 mPaaS 版 SDK

  1. 解压 AlipayVerifySDK-1.0.2.zip,并将 verifysdk-1.0.0.190522154510.aar、securitysdk-open-6.0.5.20191014.aar 放入 libs 目录下。
  2. 在工程的 build.gradle 文件中添加 libs 目录作为依赖仓库。
    allprojects {
      repositories {
          // 添加以下内容
          flatDir {
              dirs 'libs'
          }
       }
    }
  3. 确认通过 mPaaS 插件构建的应用带有如下仓库依赖。
    allprojects {
      repositories {
          maven {
              credentials {
                  username "*******"
                  password "*******"
              }
              url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
          }
          flatDir {
              dirs 'libs'
          }
          jcenter()
       }
    }
  4. 在 bundle 工程的 app 模块中,配置 build.gradle 文件,添加 SDK 的依赖。
    dependencies {
        // 添加如下内容
        provided "com.alipay.android.phone.zoloz:zcloud-build:3.0.1.190704174711:api@jar"
        compile (name:'verifysdk-1.0.0.190522154510', ext:'aar')
        compile (name:'securitysdk-open-6.0.5.20191014', ext:'aar') 
        compile 'com.squareup:otto:1.3.8'
    }
  5. 在 portal 工程的主 module 模块中,配置 build.gradle 文件,添加 bundle 的依赖。
    dependencies {
        // 添加如下内容
        bundle "com.alipay.android.phone.zoloz:zcloud-build:3.0.1.190704174711:nolog@jar"
        manifest "com.alipay.android.phone.zoloz:zcloud-build:3.0.1.190704174711:AndroidManifest@xml"
    }

调用 API 发起认证

  1. 封装发起认证的信息。
    发起认证包含的信息包括 certifyId 和网关 url。两者都通过服务端的相关接口取得。
    JSONObject requestInfo = new JSONObject();
    requestInfo.put("url", url);
    requestInfo.put("certifyId", certifyId);
  2. 发起认证。
    调用 startService 接口请求认证,传入当前的 context、认证信息以及接收处理结果的回调。
    ServiceFactory.build()
      .startService(context, requestInfo, new ICallback() {
          @Override
          public void onResponse(Map<String, String> response) {
          // TODO with sdk response
          }
      });
  3. 获取认证结果。
    认证结束后,ICallback.onResponse 方法会被调用,参数 response 中包含本次调用的结果。
    public interface ICallback {
      /**
       * 返回结果
       * resultStatus 结果状态码
       * result.certifyId 本次认证流水号
       *
       * @param response 结果对象
       */
      void onResponse(Map<String, String> response);
    }

    其中,ResultStatus 枚举定义如下:

    状态码 描述
    9000 认证通过
    6002 网络异常
    6001 用户取消了业务流程,主动退出
    4000 业务异常
    说明
    • resultStatus = 6001、6002 时,result 对象数据为空,接入者不需要获取 result 对象数据。
    • resultStatus= 9000 时,业务方需要去查询认证结果接口查询最终状态(由于前端数据是可篡改的)。
    <Status:4000> 包含的部分 errorCode 如下表格所示 :
    错误码 描述
    UNKNOWN_ERROR 未知异常
    SYSTEM_ERROR 系统异常
    USER_IS_NOT_CERTIFY 用户未认证
    ... 其他

混淆配置参考

为避免接口混淆,您可以参考以下代码来保留类名:

-keepclassmembers class ** {
     @com.squareup.otto.Subscribe public *;
     @com.squareup.otto.Produce public *;
}

-keep public class com.alipay.mobile.security.zim.api.**{
    public <fields>;
    public <methods>;
}

-keep class com.alipay.mobile.security.zim.biz.ZIMFacadeBuilder {
  !private <fields>;
   !private <methods>;
}

-keep class com.alipay.android.phone.mobilecommon.logger.AlipayMonitorLogService {
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.android.phone.mobilecommon.rpc.AlipayRpcService {
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.android.phone.mobilecommon.apsecurity.AlipayApSecurityService {
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.zoloz.toyger.bean.ToygerMetaInfo {
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.zoloz.toyger.algorithm.** { *; }

-keep class com.alipay.zoloz.toyger.blob.** {
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.zoloz.toyger.face.** {
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.zoloz.hardware.camera.impl.** {
    !private <fields>;
    !private <methods>;
}


-keep public class com.alipay.mobile.security.zim.plugin.**{
    public <fields>;
    public <methods>;
}

-keep class * extends com.alipay.mobile.security.zim.gw.BaseGwService{
    !private <fields>;
    !private <methods>;
}

-keep class * extends com.alipay.mobile.security.bio.service.BioMetaInfo{
    !private <fields>;
    !private <methods>;
}

-keep class com.alipay.zoloz.toyger.workspace.FaceRemoteConfig{
    *;
}

-keep public class com.alipay.zoloz.toyger.**{
    *;
}

-keep public class com.alipay.mobile.security.zim.gw.**{
    *;
}

-keep class com.alipay.deviceid.module.senative.DeviceIdUtil { *;}

-repackageclass com.alipay.deviceid.module.x
-keep class com.alipay.deviceid.module.rpc.deviceFp.** { *; }
-keep class com.alipay.deviceid.module.rpc.report.open.** { *; }
-keep class com.alipay.deviceid.DeviceTokenClient { *; }
-keep class com.alipay.deviceid.DeviceTokenClient$InitResultListener { *; }
-keep class com.alipay.deviceid.DeviceTokenClient$TokenResult {*;}

-keep class com.alipay.rds.v2.face.RDSClient { *; }
-keep class com.alipay.rds.constant.* { *; }