金融级实人认证服务提供Flutter客户端SDK,帮助您在业务应用(App)中实现刷脸认证功能。本文结合示例代码介绍Flutter客户端的接入流程。
使用限制
不支持模拟器调试及使用,请您使用真机开发及功能测试。
仅支持iOS 9.0、Android 5.0及以上版本的移动智能设备(手机或Pad)接入。
依赖配置
下载Flutter SDK并解压。
Flutter SDK中的接口介绍,请参见接口说明。
将解压后的Flutter SDK拷贝至业务工程。
编辑业务工程中的pubspec.yaml文件,并在dev_dependencies字段下增加阿里云刷脸插件依赖。
aliyun_face_plugin: path: aliyun_face_plugin
Android环境配置
增加模块依赖
编辑业务工程下/android/build.gradle文件,在allprojects字段中增加flatDir配置。
flatDir {
dirs project(':aliyun_face_plugin').file('libs')
}
配置Proguard混淆规则
如果在release场景下配置了Proguard代码混淆,则需要在业务工程的android/app/proguard-rules.pro文件中添加如下规则:
-keep class com.alipay.deviceid.** { *; }
-keep class net.security.device.api.** {*;}
-keep class org.json.** { *;}
-keep class com.alibaba.fastjson.** {*;}
-keep class com.alibaba.sdk.android.oss.** { *; }
-dontwarn okio.**
-dontwarn org.apache.commons.codec.binary.**
-keepclassmembers,allowobfuscation class * {
@com.alibaba.fastjson.annotation.JSONField <fields>;
}
iOS环境配置
添加Camera权限
使用Xcode打开Runner工程(业务工程/ios/Runner.xcworkspace)。
按照下图指引,在Runner工程的Info.plist文件中增加Camera权限。
Value值需要您根据业务自定义。
添加framework
在Link Binary With Libraries配置项中添加SDK的framework和系统依赖库。framework位于解压后的Flutter SDK目录下,路径为aliyun_face_plugin/ios/Products/
。
SDK中的framework:
AliyunFaceAuthFacade.framework
APBToygerFacade.framework
APPSecuritySDK.framework
BioAuthEngine.framework
deviceiOS.framework
DTFIdentityManager.framework
DTFUtility.framework
OCRDetectSDKForTech.framework
ToygerNative.framework
ToygerService.framework
系统依赖库:
CoreGraphics.framework
Accelerate.framework
SystemConfiguration.framework
AssetsLibrary.framework
CoreTelephony.framework
QuartzCore.framework
CoreFoundation.framework
CoreLocation.framework
ImageIO.framework
CoreMedia.framework
CoreMotion.framework
AVFoundation.framework
WebKit.framework
libresolv.tbd
libz.tbd
libc++.tbd
libc++.1.tbd
libc++abi.tbd
AudioToolbox.framework
CFNetwork.framework
MobileCoreServices.framework
libz.1.2.8.tbd
AdSupport.framework
ReplayKit.framework
添加Bundle
按照下图指引,在Copy Bundle Resources配置项中添加以下Bundle。Bundle位于解压后的Flutter SDK目录下,路径为aliyun_face_plugin/ios/Products/
。
ToygerService.bundle:位于ToygerService.framework中。
APBToygerFacade.bundle:位于APBToygerFacade.framework中。
APBToygerFacadeSuitable.bundle:位于APBToygerFacade.framework中。
OCRXMedia.bundle:位于OCRDetectSDKForTech.framework中。
BioAuthEngine.bundle:位于BioAuthEngine.framework中。
增加-ObjC链接标志
按照下图指引,在Other Linker Flags配置项中添加-ObjC标志。
接口说明
Flutter SDK包含初始化SDK(init)、获取MetaInfos(getMetaInfos)和开始认证(verify)3个接口。
class AliyunFacePlugin {
// SDK初始化接口
Future<void> init() {
return AliyunFacePluginPlatform.instance.init();
}
// 获取客户端的metainfos,用于服务器端接口获取认证id,即CertifyId
Future<String?> getMetaInfos() {
return AliyunFacePluginPlatform.instance.getMetaInfos();
}
// SDK认证接口
Future<String?> verify(String key, String value) {
return AliyunFacePluginPlatform.instance.verify(key, value);
}
}
初始化SDK
描述:主要用于人脸模型及人脸安全模块的初始化。需要在应用刚启动,用户确认App隐私协议之后,尽可能早的调用。
函数原型:
Future<void> init() { return AliyunFacePluginPlatform.instance.init(); }
返回值:无。
获取MetaInfos
描述:该接口返回客户端的环境信息,客户端需要将这些信息发送至业务服务器端,业务服务器端将这些信息作为参数之一(MetaInfo)调用服务端初始化认证接口InitFaceVerify,从而获取CertifyId,用于后续认证环节。
函数原型:
Future<String?> getMetaInfos() { return AliyunFacePluginPlatform.instance.getMetaInfos(); }
返回值:无。
开始认证
描述:用于发起实人认证请求。
函数原型:
Future<String?> verify(String key, String value) { return AliyunFacePluginPlatform.instance.verify(key, value); }
参数说明:
Key:固定字符串
certifyId
。Value:服务器端通过调用初始化认证接口InitFaceVerify返回的CertifyId。
重要每个CertifyId只能使用一次,否则会返回错误。错误信息如下:
iOS:2002,ZIMNetworkfail。
Android:1001,NET_RESPONSE_INVALID。
返回值:返回实人认证请求状态。格式为
code,reson
,中间以逗号(,)分隔。code为错误码;reson为具体原因。说明iOS、Android平台的code及reson释义可能会有不同,以相应的文档说明为准。
示例代码
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:aliyun_face_plugin/aliyun_face_plugin.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _infos = 'Unknown';
final _aliyunFacePlugin = AliyunFacePlugin();
@override
void initState() {
super.initState();
// 在App启动的早期调用init接口。
_aliyunFacePlugin.init();
}
Future<void> getMetaInfos() async {
String metainfos;
try {
// 获取客户端metainfos,将信息发送到服务器端,调用服务器端相关接口获取认证ID,即CertifyId。
metainfos = await _aliyunFacePlugin.getMetaInfos() ?? 'Unknown metainfos';
} on PlatformException {
metainfos = 'Failed to get metainfos.';
}
setState(() {
_infos = "metainfos: " + metainfos;
});
}
Future<void> startVerify() async {
String verifyResult;
try {
// 调用认证接口,CertifyId需要调用服务器端接口获取。
// 每个CertifyId只能使用一次,否则会返回code: "2002(iOS), 1001(Android)"。
verifyResult = await _aliyunFacePlugin.verify(
"certifyId", "shac05691e3bf2e1826a968793c1a17d") ??
'-1,error';
} on PlatformException {
verifyResult = '-2,exception';
}
setState(() {
_infos = "verifyResult: " + verifyResult;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Aliyun face plugin demo')),
body: Center(
child: Column(children: <Widget>[
Text('$_infos\n'),
ElevatedButton(
onPressed: () async {
getMetaInfos();
},
child: Text("getMetaInfos")),
ElevatedButton(
onPressed: () async {
startVerify();
},
child: Text("startVerify")),
])),
),
);
}
}
完整代码示例,请点击Demo下载。