刷脸认证提供 Android 客户端 SDK 帮助您在 App 中实现刷脸认证功能。您可通过刷脸认证的服务端认证初始化接口获取刷脸认证唯一标识 CertifyId,并使用 CertifyId 唤起刷脸认证客户端 SDK。本文将结合示例代码进行详细的说明介绍。

前提条件

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

依赖配置

下载Android SDK,该 SDK 为 Android 标准 aar 包,下载之后在 Android Studio 中进行 aar 包引用,如下载完 aar 包之后,放入工程目录的 libs 目录下,并添加以下依赖:

#在此添加阿里云实人认证SDK依赖包

implementation files('libs/aliyunface-sdk-xxx.aar')
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.alibaba:fastjson:1.2.62'
			

接口定义

/**
 * 刷脸认证接口
 */
public class ZIMFacade {

    /**
     * 预初始化接口,建议接入方在调用其它接口前,先调用此接口
     * 
     * @context Context
     */
    public static void install(Context context);

    /**
     * 获取环境参数接口
     * 
     * @context Context
     */
    public static String getMetaInfos(Context context);

    /**
     * identify interface for android
     * 需在 UI 线程上调用,不会阻塞调用线程
     *
     * @param certifyId    刷脸认证唯一标识,请从刷脸认证服务端认证初始化接口获取
     * @param useMsgBox   当刷脸认证过程中出现异常情况,是否使用SDK内部的弹框提示,
     *                    如果取值为true, 则SDK先弹框提示,确定之后,返回错误code
     *                    如果取值为false, 则不弹提示框,直接返回错误code, 客户App自行决定如何提示
     * @param callback 认证结果的回调接口
     */
    public void verify(String certifyId, boolean useMsgBox,, ZIMCallback callback);

    /**
     * 开始进行实名认证(拉起UI), 带自定义参数的版本
     * @param zimId    unique id
     * @param useMsgBox   表示是否在sdk内部使用弹框提示错误信息
     * @param extParams 扩展参数
     * @param callback identify result
     */
    public void verify(final String zimId, boolean useMsgBox, HashMap<String, String> extParams, ZIMCallback callback);

    /**
     * 获取设备指纹DeviceToken
     * @return
     */
    public ZIMSession getSession();
}

接口调用

  1. 初始化SDK

    为提高身份核验的用户体验,并为刷脸认证准备必要数据,Android 客户端需要进行 SDK 初始化。初始化的代码示例如下:

    ZIMFacade.install(context);
  2. 获取metaInfo数据

    示例代码如下:

    String metaInfos = ZIMFacade.getMetaInfos(context);

    您在调用刷脸认证服务端 发起认证请求 时需要传入该 metalnfo 值。

  3. 开始认证

    在 Android 客户端支持接入手机端和 Pad 端,请根据自身业务需求选择需要接入的版本。

    两者的示例代码如下:

    • Android 手机端:
      ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
      zimFacade.verify(certifyId, true, new ZIMCallback() {
       @Override
       public boolean response(ZIMResponse response) {
           // TODO: 接入方在这里实现自身业务
           if (null != response && 1000 == response.code) {
               // 认证成功
           } else {
               // 认证失败
           }
           return true;
       }
      }
    • Android手机端+Pad端,支持自定义参数:
      说明

      金融级实人认证支持返回活体检测本地视频,默认不返回。若设置返回,在您使用金融级实人认证SDK完成认证时(不区分认证结果为F或T),将在SDK回调时返回视频路径,请您及时处理。

      提醒:目前仅支持返回本地视频,无法通过服务端查询接口获取。

      ZIMFacade zimFacade = ZIMFacadeBuilder.create(MainActivity.this);
      
      HashMap<String, String> extParams = new HashMap<>();
      //如果需要指定活体检测UI界面方向(横屏+竖屏),请指定这一项
      extParams.put(ZIMFacade.ZIM_EXT_PARAMS_KEY_SCREEN_ORIENTATION, ZIMFacade.ZIM_EXT_PARAMS_VAL_SCREEN_LAND); 
      //如果需要支持活体视频返回,请指定这一项,并在response.videoFilePath中获取视频本地路径
      extParams.put(ZIMFacade.ZIM_EXT_PARAMS_KEY_USE_VIDEO, ZIMFacade.ZIM_EXT_PARAMS_VAL_USE_VIDEO_TRUE); 
      zimFacade.verify(certifyId, true, extParams, new ZIMCallback() {
          @Override
          public boolean response(final ZIMResponse response) {
              if (1000 == response.code) {
                  showMessageBox("认证通过");
              } else {
                  showMessageBox("认证失败([" + response.code + "]" + response.reason + ")");
              }
      
              return true;
          }
      });
    说明
    • certifyId:是刷脸认证唯一标识,可从刷脸认证服务端 发起认证请求 获取。
    • ZIMCallback 的 response 回调需要有返回值,默认为 true。
  4. 获取设备指纹

    获取设备指纹deviceToken,然后通过后端接口查询设备风险。

    示例代码如下:
    ZIMSession deviceSession = zimFacade.getSession();
     if(deviceSession.code == 0){
                //获取session成功,可以通过后端接口查询风险标签
     }else{
                //获取session失败,不能通过后端接口查询到有效风险标签
     }
  5. 返回结果

    刷脸认证 SDK 回调结果中的 ZIMResponse 类,该类中定义了对应的结果编码和原因,如下所示:

    /**
     * 刷脸认证回调结果
     */
    public class ZIMResponse {
        /**
         * 返回结果编码:
         * 1000: 刷脸成功
         * 1001: 系统错误
         * 1003: 验证中断
         * 2002: 网络错误     
         * 2003: 客户端设备时间错误
         * 2006: 刷脸失败
         */
        public int code;
        /**
         * 返回结果原因信息
         */
        public String reason;
    }

    返回结果说明:

    • 1000:代表刷脸成功,该结果仅供参考,可通过服务端 查询认证结果 获取最终认证结果;
    • 1001:表示系统错误;
    • 1003:表示验证中断;
    • 2002:表示网络错误;
    • 2003:客户端设备时间错误;
    • 2006:表示刷脸失败,如需获取更详细的失败原因,需调用服务端 服务端接入

    参见Android客户端错误码详情了解更多信息。

接口混淆配置

为避免接口混淆,您可以参考以下代码来保留类名(一般是在打 release 包的时候):

-verbose

-keep class com.aliyun.aliyunface.network.model.** {*;}
-keep class com.aliyun.aliyunface.api.ZIMCallback {*;}
-keep class com.aliyun.aliyunface.api.ZIMFacade {*;}
-keep class com.aliyun.aliyunface.api.ZIMFacadeBuilder {*;}
-keep class com.aliyun.aliyunface.api.ZIMMetaInfo {*;}
-keep class com.aliyun.aliyunface.api.ZIMResponse {*;}
-keep class com.aliyun.aliyunface.api.ZIMSession {*;}
-keep class com.aliyun.aliyunface.config.**{*;}
-keep class com.aliyun.aliyunface.log.RecordBase {*;}
-keep class com.aliyun.aliyunface.ui.ToygerWebView {*;}
-keep class com.alipay.zoloz.toyger.**{*;}
-keep class com.aliyun.security.yunceng.** {*;}

-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**

权限说明

金融级实人认证为您提供全链路安全的身份核验服务,为达到更好的设备风险防范效果,建议您在使用APP调用刷脸SDK之前,提前向用户获取如下权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />                
//开发人员需注意,6.0以上系统属于动态权限     
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Demo代码包

下载Android Demo代码包(aliyunfaceDemo.zip)进行体验。