金融级实人认证服务提供Harmony客户端SDK,帮助您在业务应用(App)中实现刷脸认证功能。本文将结合示例代码进行Harmony客户端接入的详细说明。
使用限制
刷脸应用必须运行在Harmony Next 4.1及以上版本。
不支持模拟器模式调试。
建议使用手机端集成,SDK未适配平板可能存在兼容性问题。
权限说明
Harmony SDK权限说明如下:
权限 | 是否必须 | 说明 |
ohos.permission.INTERNET | 是 | 联网权限。SDK需要联网才能使用。 |
ohos.permission.GET_NETWORK_INFO | 否 | 网络状态确认。SDK可以根据网络状态提供更好的服务。 |
ohos.permission.CAMERA | 是 | 摄像头权限。 |
依赖配置
方式一:通过 OpenHarmony 三方库中心仓依赖(推荐)
直接从 OpenHarmony 三方库中心仓拉取已发布的 HAR 包。该方式无需本地管理产物,版本升级仅需修改版本号。
在
entry/oh-package.json5文件的dependencies节点中声明直接引用的模块:{ "name": "entry", "version": "1.0.0", "dependencies": { "@antdigital/authbase": "2.3.48-26051508", "@antdigital/aliyunfacade": "2.3.48-26051508" } }说明仅需显式声明源码中直接
import的模块。例如,@antdigital/aliyunfacade会通过传递依赖自动引入livenessverify和ocrverify,无需在此处重复列出。根目录下的
oh-package.json5文件无需配置overrides字段。
执行以下命令完成安装:
ohpm install
方式二:本地 HAR 集成
下载Harmony SDK并解压。
该SDK为Harmony的har包。
将 SDK 构建产物放置于工程根目录的
libs/文件夹下,目录结构示例如下:libs/ ├── authbase.har ├── livenessverify.har ├── ocrverify.har └── aliyunfacade.har在根目录
oh-package.json5文件中添加overrides字段,强制将依赖解析为本地 HAR 包:{ "modelVersion": "5.0.0", "name": "facedemo", "version": "1.0.0", "dependencies": {}, "devDependencies": { "@ohos/hypium": "1.0.11" }, "overrides": { "@antdigital/authbase": "file:./libs/authbase.har", "@antdigital/livenessverify": "file:./libs/livenessverify.har", "@antdigital/ocrverify": "file:./libs/ocrverify.har", "@antdigital/aliyunfacade": "file:./libs/aliyunfacade.har" } }在
entry/oh-package.json5中声明依赖项。版本号可保留远程版本号字符串(系统会优先应用overrides规则从本地拉取),或直接使用file:相对路径。执行以下命令完成安装:
ohpm install
接口说明
Harmony SDK包含初始化(init、initIPv6)、获取MetaInfos(getMetaInfos)和开始认证(verify)3个核心接口。
初始化SDK
描述:调用该函数完成SDK内部初始化。请务必做延迟初始化配置,确保在用户同意《隐私权政策》后,在人脸识别业务场景中初始化SDK。
函数原型:
public init(context: Context, params?: HashMap<string, string>): number public initIPv6(context: Context, params?: HashMap<string, string>): number说明请根据实际情况选用IPv4或者IPv6网络环境进行业务调用。
参数说明:
名称
类型
说明
context
Context
当前Ability的Context。
params
HashMap<string, string>
自定义参数,可不传。
返回值:Number类型。0表示初始化无异常。
获取metaInfos
描述:移动端环境信息是人脸检测过程中识别设备风险的必要参数:
每次认证时均需获取MetaInfos。
客户端获取MetaInfos后,以字符串形式发送到服务端,在服务端调用InitFaceVerify接口时作为参数传入。
函数原型:
public static getMetaInfos(context: Context, params?: HashMap<string, string>): string参数说明:
名称
类型
说明
context
Context
当前Ability的Context
params
HashMap<string, string>
自定义参数,可不传。
返回值:String类型,以JSON格式返回当前移动设备端环境以及SDK信息。
{ "deviceType": "harmony", "osVersion": "2", "osFullName": "2.1.6.1(Beta1)", "deviceModel": "NOH-AN00", "appName": "com.dtf.faceverify", "appVersion": "1.0.0", "nfcSupport": "N", "bioMetaInfo": "7.1.2:393216,0", "apdidToken": "", "sdkVersion": "1.1.0", "securityVersion": "", "zimVer": "", "voiceSdkVersion": "" }
发起认证
描述:调用该函数发起实人认证。
函数原型:
public static verify(context: UIContext | Context, callBack: ZimCallBack, params?: HashMap<string, string>): void参数说明:
名称
类型
说明
context
UIContext 或 Context
当前Ability的UIContext或Context。
重要请优先传递UIContext,可避免Harmony系统兼容性的问题。
certifyID
String
认证ID。您可以通过服务端发起申请请求接口(InitFaceVerify)获取该参数。
callBack
ZimCallBack
认证结果的回调接口,定义如下:
export interface ZimCallBack { onComplete: (response: ZimResponse) => void; encrypt: (content: string) => string; }ZIMResponse类的定义,请参见下文认证结果及错误码。
params
HashMap<string, string>
自定义参数,需要根据要求传入数据。params取值,请参见表 2. params取值说明。
表 1. ZimCallBack接口回调说明
方法
说明
示例值
onComplete
SDK认证结果回调
参考ZimResponse类定义
表 2. params取值说明
取值
说明
示例值
ext_params_key_use_message_box
当刷脸认证过程中出现异常情况,是否使用SDK内部的弹框提示。取值:
true:SDK先弹框提示,确定之后,返回错误code。
false:不弹提示框,直接返回错误code,客户业务应用App自行决定如何提示。
true
ext_params_key_open_full_screen
进入SDK认证后是否开启全屏显示,SDK默认会开启全屏显示以保证显示正常。设置单次有效。
true:开启全屏显示。
false:关闭全屏显示。
true
ext_params_key_use_video
是否返回活体认证视频。取值:
true:可在response.videoPath或在服务端查询接口获取视频路径。
false:不返回活体认证视频(默认)。
true或者false
ext_params_key_hsp_module_name
当实人认证模块被打包在Multi Hap中,且Hsp没有依赖实人认证相关模块时,需要将Multi Hap的Module Name通过此参数传递给SDK。
说明SDK默认该值为空。
alidemoshared
ext_params_key_force_use_portrait
是否强制使用竖屏,取值:
true(默认):强制使用竖屏发起认证。
false:跟随App的方向,不做任何调整。
true
ext_params_key_wave_animate_close
是否开启水波纹loading,取值:
true:关闭水波纹loading, 使用原先的loading动画。
false(默认):打开水波纹loading, 使用水波纹loading。
true
返回值:无。
认证结果及错误码
认证结果通过ZIMResponse类返回,定义如下:
/*
* 结果返回
*/
export class ZimResponse {
/**
* 结果码主码
*/
public code: string;
/**
* 结果码子码
*/
public subCode: string;
/**
* 错误原因
*/
public msg: string;
/**
* 留证视频路径
*/
public videoPath: string;
}|
错误码 |
是否计费 |
错误码文案 |
错误码描述 |
|
1000 |
是 |
刷脸成功 |
用户完成了刷脸过程,认证建议结果为通过。 该结果仅供参考,可通过调用服务端DescribeFaceVerify接口获取最终认证结果。 |
|
1001 |
否 |
系统错误 |
表示系统错误。 |
|
1003 |
否 |
验证中断 |
表示验证中断。 |
|
2002 |
否 |
网络错误 |
表示网络错误。 |
|
2003 |
否 |
客户端设备时间错误 |
表示客户端设备时间错误。 |
|
2006 |
是(仅认证不通过的场景计费) |
刷脸提交认证数据失败,或刷脸验证失败。 |
该结果仅供参考,可通过调用服务端 DescribeFaceVerify 接口获取最终认证结果以及未通过的详细原因。 |
更多subCode错误码信息,请参见金融级客户端错误码详情 - Harmony。
接口混淆配置
为避免接口被混淆而造成功能异常,请查看har包中obfuscation.txt文件中的配置,请勿移除该文件。同时在应用的主工程打包添加如下混淆配置文件 obfuscation-rules.txt 添加如下配置:
ctx
userAppKey
options
securityInitListener
initRaw
getSessionRaw
getSessionIdRaw
setInitStatusRaw
getInitStatusRaw
setOptionsRaw示例代码
import { ZimConstant, ZimFacade, ZimResponse } from '@alipay/aliyunfacade';
import { HashMap } from '@kit.ArkTS';
import { JSONUtil, StringUtil } from '@alipay/authbase';
@Entry
@Component
struct Index {
@State message: string = '发起认证';
@State certifyID: string = ''
build() {
Row() {
Column() {
// certifyID需要从服务端InitFaceVerify接口的返回值中获取,每次获取需要将MetaInfo传给服务端。
// 注意每个certifyID仅有30分钟有效期,过期后不能使用。
TextInput({ placeholder: '请输入certifyID', text: this.certifyID })
.onChange((value: string) => {
this.certifyID = value;
})
.margin({ left: 20, right: 20 })
Button(this.message)
.fontSize(18)
.fontWeight(FontWeight.Bold)
.onClick((event: ClickEvent) => {
let params: HashMap<string, string> = new HashMap();
// SDK 全屏显示,默认为true
params.set(ZimConstant.KEY_NEED_FULL_SCREEN, 'true');
// SDK 展示对客弹窗信息,默认为true
params.set(ZimConstant.KEY_USE_MESSAGE_BOX, 'true');
ZimFacade.verify(this.getUIContext(), this.certifyID, {
onComplete: (response: ZimResponse) => {
let result: HashMap<string, string> = new HashMap();
result.set('code', response.code);
result.set('subCode', response.subCode);
result.set('msg', response.msg);
result.set('certifyID', this.certifyID);
this.certifyID = '';
if (response.faceImage) {
result.set('faceImage', 'data:image/jpg;base64,' + StringUtil.base64Uint8Array(response.faceImage))
} else {
result.set('faceImage', '');
}
let showParams: string = JSONUtil.parseMapToString(result);
console.log("Aliyun", showParams);
}
}, params)
})
.margin({ top: 10 })
}
.width('100%')
}
.height('100%')
}
aboutToAppear(): void {
ZimFacade.init(getContext());
}
}Demo代码包
开启安全摄像头能力
HarmonySDK 从 1.3.2 版本开始支持安全摄像头能力。此能力需要针对 APP 在 Harmony 官网开启如下配置:
可信应用服务
应用设备状态检测
安全检测服务
具体操作方法,请参考Harmony官方文档:开通Device Security服务。