金融级实人认证服务提供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值需要您根据业务自定义。
添加Bundle
按照下图指引,在Copy Bundle Resources配置项中添加以下Bundle。Bundle文件在刷脸SDK目录下,路径为aliyun_face_plugin/ios/Products。
- ToygerNative.bundle:位于ToygerNative.framework中。
- OCRXMedia.bundle:位于OCRDetectSDKForTech.framework中。
- BioAuthEngine.bundle:位于BioAuthEngine.framework中。
- APBToygerFacade.bundle:位于APBToygerFacade.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。
- Key:固定字符串
- 返回值:返回实人认证请求状态。格式为
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")),
])),
),
);
}
}