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

程序员 2024-9-7 00:21:35 46 0 来自 中国
项目中有实名认证的需求,用户上传身份证反正面,举行人脸核验,配景集成的是阿里云的金融级实名认证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")    //阿里云实人认证SDK    implementation(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.okhttp3khttp:3.11.0'    implementation 'com.squareup.okiokio:1.14.0'    implementation 'com.alibaba:fastjson:1.2.62'    implementation 'com.aliyun.dpass-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 Activity    private MethodChannel channel;    // 上下文 Context    private Context context;    private Activity activity;    private EventChannel.EventSink eventSink;    @Override    public 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() {            @Override            public void onListen(Object o, EventChannel.EventSink eventSink) {                AliAuthPersonPlugin.this.eventSink = eventSink;            }            @Override            public void onCancel(Object o) {                AliAuthPersonPlugin.this.eventSink = null;            }        });    }    @Override    public 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() {                @Override                public 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();        }    }    @Override    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {        channel.setMethodCallHandler(null);    }    @Override    public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {        activity = binding.getActivity();    }    @Override    public void onDetachedFromActivityForConfigChanges() {    }    @Override    public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {    }    @Override    public void onDetachedFromActivity() {    }}Ios集成

参考:阿里云官方讲授:https://help.aliyun.com/document_detail/163106.html
复制粘贴 frameworks

2.png 导入声明

编写 .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      = <<-DESCA new Flutter project.                       DESC  s.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 Flutterimport UIKitimport AliyunIdentityManager//当前视图 ViewController;var controller : UIViewController?;//method管道var channel : FlutterMethodChannel?;//event管道var eventChannel : FlutterEventChannel?;//回调flutterlet 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))    //初始化阿里SDK    AliyunSdk.`init`();  }  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {      //获取本机参数      if(call.method == "getMetaInfos"){          let info  = AliyunIdentityManager.getMetaInfo();          var jsonData: Data? = nil          do {              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) in              DispatchQueue.main.async {                  var resString = ""                  switch response?.code {                  case .ZIMResponseSuccess:                    resString = "认证乐成"                      break;                  case .ZIMInterrupt:                      resString = "初始化失败"                   break                  case .ZIMTIMEError:                   resString = "装备时间错误"                   break                  case .ZIMNetworkfail:                   resString = "网络错误"                   break                  case .ZIMInternalError:                   resString = "用户退出"                   break                  case .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? = nil    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {        eventSink = events        return nil    }        func onCancel(withArguments arguments: Any?) -> FlutterError? {        eventSink = nil        return nil    }        public func sendEvent(event:Any) {        eventSink?(event)    }}
就此完成啦
https://github.com/lurongshuang/ali_auth_personIOS集成的时间遇见几个标题,我截图列一下,有其他标题,接洽我,我们共同发展。
标题一 和办理

4.png
标题二

标题三


您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 19:26, Processed in 0.166368 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表