项目中有实名认证的需求,用户上传身份证反正面,进行人脸核验,后台集成的是阿里云的金融级实名认证SDK,巧合的是阿里云没有packages 需要自己造轮子。
废话不多少,直接上代码:

新建项目 ProjectType = Plugin

创建完成后,会自动为我们搭建好通信结构

编写Dart中间件

在项目下的 lib下的dart文件中定义我们的通信方法。
实名认证 需要两个方法 分别是:
获取本机信息发送给服务器 返回ID
调用实名认证,以及返回结果

import 'dart:async';import 'package:flutter/services.dart';class AliAuthPerson {static const MethodChannel _channel = MethodChannel('ali_auth_person');static Future<String?> get platformVersion async {final String? version = await _channel.invokeMethod('getPlatformVersion');return version;}static const EventChannel _eventChannel =EventChannel("ali_auth_person_plugin_event");///认证结果返回监听static addListen(Function(String resData) onEvent) {_eventChannel.receiveBroadcastStream().listen((data) {onEvent(data);});}///实名认证static Future<void> verify(String certifyId) async {await _channel.invokeMethod("verify", certifyId);}///获取本机参数static Future<String> getMetaInfos() async {return await _channel.invokeMethod("getMetaInfos");}
}

Andriod 集成

参考:阿里云官方解说:https://help.aliyun.com/document_detail/163105.html

复制粘贴 AAR文件
将SDK的中的 AAR放入项目内
导入声明

dependencies {compileOnly files("$flutterRoot/bin/cache/artifacts/engine/android-arm/flutter.jar")//阿里云实人认证SDKimplementation(name:'android-aliyunbasicstl-sdk-release-1.6.0-20220414192835', ext:'aar')implementation(name:'android-aliyuncomm-sdk-release-1.6.0-20220414192835', ext:'aar')implementation(name:'Android-AliyunDevice-FG-10022.2', ext:'aar')implementation(name:'android-aliyunface-sdk-release-1.6.0-20220414192835', ext:'aar')implementation(name:'android-aliyunocr-sdk-release-1.6.0-20220414192835', ext:'aar')implementation(name:'APSecuritySDK-DeepSec-7.0.1.20211220', ext:'aar')implementation(name:'photinus-1.0.1.220217162928', ext:'aar')implementation(name:'tygerservice-1.0.0.220407164130', ext:'aar')//三方依赖库implementation 'com.squareup.okhttp3:okhttp:3.11.0'implementation 'com.squareup.okio:okio:1.14.0'implementation 'com.alibaba:fastjson:1.2.62'implementation 'com.aliyun.dpa:oss-android-sdk:+'
}

编写Android 适配方法
代码如下

package com.lrs.ali_auth_person.ali_auth_person;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;import androidx.annotation.NonNull;import com.aliyun.aliyunface.api.ZIMCallback;
import com.aliyun.aliyunface.api.ZIMFacade;
import com.aliyun.aliyunface.api.ZIMFacadeBuilder;
import com.aliyun.aliyunface.api.ZIMResponse;import org.json.JSONException;
import org.json.JSONObject;import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry;/*** AliAuthPersonPlugin*/
public class AliAuthPersonPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {/// The MethodChannel that will the communication between Flutter and native Android////// This local reference serves to register the plugin with the Flutter Engine and unregister it/// when the Flutter Engine is detached from the Activityprivate MethodChannel channel;// 上下文 Contextprivate Context context;private Activity activity;private EventChannel.EventSink eventSink;@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "ali_auth_person");channel.setMethodCallHandler(this);context = flutterPluginBinding.getApplicationContext();final EventChannel eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), "ali_auth_person_plugin_event");eventChannel.setStreamHandler(new EventChannel.StreamHandler() {@Overridepublic void onListen(Object o, EventChannel.EventSink eventSink) {AliAuthPersonPlugin.this.eventSink = eventSink;}@Overridepublic void onCancel(Object o) {AliAuthPersonPlugin.this.eventSink = null;}});}@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {if (call.method.equals("getPlatformVersion")) {result.success("Android " + android.os.Build.VERSION.RELEASE);} else if (call.method.equals("getMetaInfos")) {//获取本机参数String metaInfo = ZIMFacade.getMetaInfos(context);result.success(metaInfo);} else if (call.method.equals("verify")) {//进行实名认证String certifyId = call.arguments();if (certifyId == null || certifyId.isEmpty()) {Toast.makeText(context, "certifyId 不能为空!", Toast.LENGTH_SHORT).show();return;}Toast.makeText(context, "" + certifyId, Toast.LENGTH_SHORT).show();ZIMFacade.install(context);ZIMFacade zimFacade = ZIMFacadeBuilder.create(activity);zimFacade.verify(certifyId, true, new ZIMCallback() {@Overridepublic boolean response(ZIMResponse response) {// TODO:根据实人认证回调结果处理自身的业务。JSONObject jsonObject = new JSONObject();try {jsonObject.put("code", response.code);jsonObject.put("msg", response.msg);jsonObject.put("deviceToken", response.deviceToken);jsonObject.put("videoFilePath", response.videoFilePath);} catch (JSONException e) {e.printStackTrace();}eventSink.success(jsonObject.toString());return true;}});} else {result.notImplemented();}}@Overridepublic void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {channel.setMethodCallHandler(null);}@Overridepublic void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {activity = binding.getActivity();}@Overridepublic void onDetachedFromActivityForConfigChanges() {}@Overridepublic void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {}@Overridepublic void onDetachedFromActivity() {}
}

Ios集成

参考:阿里云官方解说:https://help.aliyun.com/document_detail/163106.html

复制粘贴 frameworks
导入声明

编写 .podspec文件 如下

#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint ali_auth_person.podspec` to validate before publishing.
#
Pod::Spec.new do |s|s.name             = 'ali_auth_person's.version          = '0.0.1's.summary          = 'A new Flutter project.'s.description      = <<-DESC
A new Flutter project.DESCs.homepage         = 'http://example.com's.license          = { :file => '../LICENSE' }s.author           = { 'Your Company' => 'email@example.com' }s.source           = { :path => '.' }s.source_files = 'Classes/**/*'s.public_header_files = 'Classes/**/*.h's.dependency 'Flutter's.platform = :ios, '9.0's.vendored_frameworks = 'frameworks/AliyunIdentityManager.framework','frameworks/AliyunOSSiOS.framework','frameworks/APBToygerFacade.framework','frameworks/APPSecuritySDK.framework','frameworks/BioAuthAPI.framework','frameworks/BioAuthEngine.framework','frameworks/deviceiOS.framework','frameworks/MPRemoteLogging.framework','frameworks/OCRDetectSDKForTech.framework','frameworks/ToygerNative.framework','frameworks/ToygerService.framework','frameworks/ZolozIdentityManager.framework','frameworks/ZolozMobileRPC.framework','frameworks/ZolozOpenPlatformBuild.framework','frameworks/ZolozSensorServices.framework','frameworks/ZolozUtility.framework's.frameworks = 'CoreGraphics','Accelerate','SystemConfiguration','AssetsLibrary','CoreTelephony','QuartzCore','CoreFoundation','CoreLocation','ImageIO','CoreMedia','CoreMotion','AVFoundation','WebKit','AudioToolbox','CFNetwork','MobileCoreServices','AdSupport's.libraries = 'resolv','z','c++.1','c++abi','z.1.2.8's.resource_bundles = { 'Resources' => 'frameworks/*.framework/*.bundle' }# Flutter.framework does not contain a i386 slice.# s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }s.swift_version = '5.0'# s.ios.deployment_target = '9.0's.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }s.pod_target_xcconfig = {'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64'   }s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
end

编写IOS适配方法

import Flutter
import UIKit
import AliyunIdentityManager//当前视图 ViewController;
var controller : UIViewController?;
//method管道
var channel : FlutterMethodChannel?;
//event管道
var eventChannel : FlutterEventChannel?;
//回调flutter
let eventStreamHandler = EventStreamHandler()
public class SwiftAliAuthPersonPlugin: NSObject, FlutterPlugin{public static func register(with registrar: FlutterPluginRegistrar) {channel = FlutterMethodChannel(name: "ali_auth_person", binaryMessenger: registrar.messenger())let instance = SwiftAliAuthPersonPlugin()registrar.addMethodCallDelegate(instance, channel: channel!)eventChannel = FlutterEventChannel(name: "ali_auth_person_plugin_event", binaryMessenger: registrar.messenger())eventChannel?.setStreamHandler((eventStreamHandler as! FlutterStreamHandler & NSObjectProtocol))//初始化阿里SDKAliyunSdk.`init`();}public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {//获取本机参数if(call.method == "getMetaInfos"){let info  = AliyunIdentityManager.getMetaInfo();var jsonData: Data? = nildo {if info != nil {jsonData = try JSONSerialization.data(withJSONObject: info!, options: .prettyPrinted)}} catch  _ {print("(parseError.localizedDescription)");}var infoData : String? = "";if let jsonData = jsonData {infoData = String(data: jsonData, encoding: .utf8)};result(infoData);}else if(call.method == "verify"){controller = UIApplication.shared.delegate?.window??.rootViewController;//进行实名认证let  certifyId : String = String(describing: call.arguments!);print(certifyId);let extParams: [String : Any] = ["currentCtr": controller!];AliyunIdentityManager.sharedInstance()?.verify(with: certifyId, extParams: extParams, onCompletion: { (response) inDispatchQueue.main.async {var resString = ""switch response?.code {case .ZIMResponseSuccess:resString = "认证成功"break;case .ZIMInterrupt:resString = "初始化失败"breakcase .ZIMTIMEError:resString = "设备时间错误"breakcase .ZIMNetworkfail:resString = "网络错误"breakcase .ZIMInternalError:resString = "用户退出"breakcase .ZIMResponseFail:resString = "刷脸失败"default:resString = "未知异常"break}eventStreamHandler.sendEvent(event: "{'code':\(response?.code)},'msg':\(resString),'deviceToken':\(response?.deviceToken),'videoFilePath':\(response?.videoFilePath)");}})}else{result("")}}
}class EventStreamHandler: FlutterStreamHandler {private var eventSink:FlutterEventSink? = nilfunc onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {eventSink = eventsreturn nil}func onCancel(withArguments arguments: Any?) -> FlutterError? {eventSink = nilreturn nil}public func sendEvent(event:Any) {eventSink?(event)}
}

就此完成啦

https://github.com/lurongshuang/ali_auth_person

IOS集成的时候遇见几个问题,我截图列一下,有其他问题,联系我,我们共同成长。

flutter - 编写 阿里云-金融级实名认证插件相关推荐

  1. android中集成阿里云金融级实人认证

    上个项目中有用到过这个,现在又要用到,每次都是到官网去看文档去集成,特此记录一下集成的步骤 第一步:打开官网文档阿里云金融级实人认证Android接入文档 去下载最新的sdk,集成到项目中 第二步在需 ...

  2. UniApp接入阿里云金融级实人认证服务

    1.下载金融级实人认证UniApp SDK,解压到项目根目录的nativePlugins目录下. 2.选择插件:manifest.json =>App原生插件配置=>本地插件. 3.设置自 ...

  3. PHP实现阿里云金融级实人认证人脸识别h5案例源码,带签名

    PHP部分: //本代码段为项目中的代码,部分参数接收方式和路径请自行更改 <?php class control_face_certification {function __construc ...

  4. 阿里云ACP级认证考试心得+过关经验

    正在准备阿里云ACP级认证考试的童鞋福利来啦!经过小编的软磨硬泡,终于从高分通过ACP云计算专业认证及大数据专业认证的大牛同事那里要来了考试心得+经验分享,直接看吧 认证考试简介 知己知彼知大纲 首先 ...

  5. 阿里云ACP级认证考试心得+过关经验 1

    正在准备阿里云ACP级认证考试的童鞋福利来啦!经过小编的软磨硬泡,终于从高分通过ACP云计算专业认证及大数据专业认证的大牛同事那里要来了考试心得+经验分享,直接看吧 认证考试简介 知己知彼知大纲 首先 ...

  6. 阿里云智能编码idea插件:Alibaba Cloud AI Coding Assistant

    阿里云智能编码idea插件:Alibaba Cloud AI Coding Assistant plugins中搜索: 参考链接: https://help.aliyun.com/document_d ...

  7. 阿里云账号注册实名认证详细教程(支付宝实名认证)

    原文持续更新:http://tencent.yundashi168.com/908.html 在阿里云注册完新账号后,一般都要通过账号实名认证,然后才能去选购云产品.就给大家分享如何快速通过阿里云个人 ...

  8. 腾讯金融云mysql,腾讯云金融级云数据库优势与功能介绍

    腾讯云金融级云数据库定义是什么? 腾讯云金融级云数据库英文名称是CDB for TDSQL,是一个与 MySQL 兼容的关系型数据库,针对金融类业务设计,可媲美高端商用数据库,同时还具有开源数据库的简 ...

  9. 阿里云账号企业实名认证和个人实名认证区别详解

    阿里云账号根据实名认证信息主体可以分为企业认证和个人认证,根据有关规定,阿里云账号需要通过实名认证才可以购买云服务器等产品,所以在购买云产品之前必须要对账号进行实名认证,阿小云分享阿里云个人实名认证和 ...

最新文章

  1. 在Ubuntu 14.04 64bit上安装Master PDF Editor 3.2.81
  2. PL/SQL -- 动态SQL调用包中函数或过程
  3. CodeForces - 1236D Alice and the Doll(贪心+二分+模拟)
  4. 第三次学JAVA再学不好就吃翔(part41)--修饰符
  5. 计算机操作系统实验一,计算机操作系统实验一.doc
  6. 杭电2539点球大战
  7. IDEA去除掉虚线,波浪线,和下划线实线的方法
  8. 中国内部物流输送系统市场趋势报告、技术动态创新及市场预测
  9. Unity3D导出的EXE不用显示分辨率选择界面
  10. [转]C#操作varbinary(MAX)字段
  11. cdr怎么做文字路径_抖音短视频中边说过边出现文字的是怎么做的?教程如下
  12. python实现自动打电话软件_python拨打电话
  13. VS2022怎么取消背景或者删除主题
  14. iis设置开启GZIP网页压缩功能
  15. word图片靠右_word设置图片边缘透明的方法步骤
  16. scala面向对象总结
  17. excel计算数据时固定某一列或一行或某一值
  18. Jmeter - JMeter监听器 -上篇(详解教程)
  19. Resharper使用
  20. navicat连接服务器mysql,mysql外网连接

热门文章

  1. 引领运动耳机新风尚、南卡携手世界冠军郭丹打造冠军品质
  2. 两年“换芯”期限将至,苹果芯片工程师又被挖,微软加速开发定制芯片
  3. 前端——菜鸟网站横向CSS导航条菜单:带小三角形
  4. Error:Execution failed for task ':app:transformClassesWithDexForPgyRelease'
  5. mysql select教程_sql教程4 MySQL SELECT
  6. VUE 实现公众号网页微信授权登录
  7. NavicatPremium12 软件和破解工具和破解教程
  8. 用postman导出excel文件
  9. Π-model,Temporal ensembling,Mean Teacher半监督模型
  10. 逗号表达式 java_c和java中问号表达式与逗号表达式问题