Flutter电子身份验证插件ekyc_id_flutter的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter电子身份验证插件ekyc_id_flutter的使用

image

EkycID SDK for Flutter

该EkycID Flutter SDK允许你在Flutter应用中构建出色的OCR和面部识别体验。

通过一次快速扫描,用户可以从其身份证、护照、驾驶执照、车牌、车辆登记证、新冠疫苗接种卡等政府签发的文件中提取信息。

EkycID的优势包括:

  • 易于集成到现有的生态系统和解决方案中,支持原生和混合应用程序。
  • 提升用户体验,因为文档检测和活体检查都是在设备上离线完成的。
  • 通过减少对人工劳动和手动数据输入的时间需求来降低成本并提高效率。

EkycID可以:

  • 通过文档识别和OCR从身份文件中提取信息。
  • 通过活体检测和面部识别验证一个人是否真实。
  • 结合文档检测、OCR、活体检测和面部识别来验证身份文件的真实性。

此Flutter SDK是我们原生SDK(Android和iOS)的封装。

1. 要求

iOS

  • 最低iOS部署目标:10.0
  • Xcode 13或更新版本
  • Swift 5
  • EkycID仅支持64位架构(x86_64和arm64)

Android

  • minSdkVersion: 21
  • targetSdkVersion: 32
  • compileSdkVersion 32

2. 安装

2.1. Flutter安装

要使用此插件,在pubspec.yaml文件中添加ekyc_id_flutter作为依赖项。

dependencies:
  ...
  ekyc_id_flutter:

2.2. iOS安装

步骤1: 在iOS中,将以下内容添加到你的Info.plist文件中。

<!-- Camera Access -->
<key>NSCameraUsageDescription</key>
<string>Camera Access for Scanning</string>

<!-- Microphone Access -->
<key>NSMicrophoneUsageDescription</key>
<string>Microphone for playing instructions audio.</string>

步骤2: 进入项目 > Runner > 构建设置 > 排除架构 > 任何SDK > armv7

步骤3: 对Podfile进行调整,如下面所示。

# 添加此行:
$iOSVersion = '10.0'

post_install do |installer|
  # 添加这些行:
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7"
    config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
  end
  
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    
    # 添加这些行:
    target.build_configurations.each do |config|
      if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
      end
    end
    
  end
end

2.3. Android安装

无需额外设置。

3. 使用

步骤1: 设置服务器URL

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  EkycIDServices.instance.setURL("YOUR_SERVER_URL");
  runApp(MyApp());
}

步骤2: 设置EkycIDExpress Widget

我们提供了一个易于使用的Widget叫做EkycIDExpress。它处理身份文件扫描和活体检测背后的逻辑。你只需要提供一个简单的回调来处理结果。以下是使用方法。

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

  Future<void> onKYCCompleted({
    required LivenessDetectionResult liveness,
    required DocumentScannerResult mainSide,
    DocumentScannerResult? secondarySide,
  }) async {
    print("== ACCESS RESULTS HERE ==");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: TextButton(
          onPressed: () async {
            await showCupertinoModalBottomSheet(
              context: context,
              builder: (BuildContext context) {
                return EkycIDExpress(
                  language: Language.KH,
                  onKYCCompleted: onKYCCompleted,
                );
              },
            );
          },
          child: Text("Start KYC"),
        ),
      ),
    );
  }
}

步骤3: 处理结果

onKYCCompleted回调中,你可以访问到LivenessDetectionResult实例和两个DocumentScannerResult实例(一个用于文档的每一边)。

步骤3: 匹配面部

你可以执行文档中的面部与活体检测中的面部之间的比较,如下所示。

Future<void> onKYCCompleted({
  required LivenessDetectionResult liveness,
  required DocumentScannerResult mainSide,
  DocumentScannerResult? secondarySide,
}) async {
  
  ApiResult response = await EkycIDServices.instance.faceCompare(
    faceImage1: mainSide.faceImage,
    faceImage2: liveness.frontFace?.image,
  );

  print(response.data?) // 匹配分数
}

步骤4: 执行OCR

你可以在文档图像上执行OCR,如下所示。

Future<void> onKYCCompleted({
  required LivenessDetectionResult liveness,
  required DocumentScannerResult mainSide,
  DocumentScannerResult? secondarySide,
}) async {
  
  ApiResult response = await EkycIDServices.instance.ocr(
    image: mainSide.documentImage,
    objectType: mainSide.documentType
  );

  print(response.data?); // 基于文档类型的响应对象
}

4. 许可证

© 2022 EKYC Solutions Co, Ltd. All rights reserved.


以下是完整的示例代码:

import 'package:ekyc_id_flutter/ekyc_id_flutter.dart';
import 'package:ekyc_id_flutter_example/test_result.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
// import 'package:ekyc_id_flutter/src/core/document_detection.dart';
import 'package:ekyc_id_flutter/src/document_scanner/document_scanner_values.dart';
import 'package:ekyc_id_flutter/src/core/models/object_detection_object_type.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  EkycIDServices.initialize(EkycURL(
    ocrURL: "http://ocr.ekycsolutions.com",
    faceCompareURL: "https://identity.ekycsolutions.com",
    livenessURL: "http://liveness.ekycsolutions.com",
  ));
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    Permission.camera.request();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);
  [@override](/user/override)
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  // var faceDetector = FaceDetectionController();
  // var documentDetector = DocumentDetectionController();

  [@override](/user/override)
  void initState() {
    super.initState();
    // documentDetector.initialize();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final _faceScanner = GlobalKey<FaceScannerViewState>();
    final _docScanner = GlobalKey<DocumentScannerViewState>();
    final _livenessScanner = GlobalKey<LivenessDetectionViewState>();

    Future<void> onFaceScanned(LivenessFace f) async {
      await _faceScanner.currentState!.pause();

      // await Navigator.push(context,
      //     MaterialPageRoute(builder: (_) => TestResult(image: f.image)));

      await _faceScanner.currentState!.start();
    }

    Future<void> onDocScanned(
        DocumentScannerResult f, DocumentScannerResult? b) async {
      await _docScanner.currentState!.pause();

      await Navigator.push(
          context, MaterialPageRoute(builder: (_) => TestResult(document: f)));

      await _docScanner.currentState!.start();
    }

    Future<void> onLivenessCompleted(LivenessDetectionResult liveness) async {
      var result =
          await EkycIDServices.instance.verifyLiveness(result: liveness);

      // await _docScanner.currentState!.pause();

      // await Navigator.push(
      //     context, MaterialPageRoute(builder: (_) => TestResult(document: f)));

      // await _docScanner.currentState!.start();
    }

    return Scaffold(
      // body: FaceScannerView(
      //   key: _faceScanner,
      //   options: FaceScannerOptions(
      //     useFrontCamera: true,
      //   ),
      //   onFaceScanned: onFaceScanned,
      //   overlayBuilder: (context, frameStatus, countdown) {
      //     return Column(
      //       children: [
      //         Text(frameStatus.toString()),
      //         Text(countdown.toString()),
      //       ],
      //     );
      //   },
      // ),
      // body: DocumentScannerView(
      //   key: _docScanner,
      //   onDocumentScanned: onDocScanned,
      //   options: DocumentScannerOptions(scannableDocuments: [
      //     ScannableDocument(
      //       mainSide: ObjectDetectionObjectType.NATIONAL_ID_0,
      //       secondarySide: ObjectDetectionObjectType.NATIONAL_ID_0_BACK,
      //     ),
      //     ScannableDocument(
      //       mainSide: ObjectDetectionObjectType.PASSPORT_KH_0,
      //     ),
      //     ScannableDocument(
      //       mainSide: ObjectDetectionObjectType.PASSPORT_INT,
      //     ),
      //   ]),
      //   overlayBuilder: (BuildContext context, FrameStatus frameStatus,
      //       DocumentSide side, int countDown) {
      //     return Container(
      //       child: Center(child: Text("$frameStatus, $side, $countDown")),
      //     );
      //   },
      // ),
      body: LivenessDetectionViewWithRandomPrompts(
        key: _livenessScanner,
        promptCount: 2,
        onLivenessTestCompleted: onLivenessCompleted,
        options: LivenessDetectionOptions(recordVideo: true),
        overlayBuilder: (
          context,
          frameStatus,
          countDown,
          progress,
          activePrompt,
          isFocusing,
        ) {
          return LivenessOverlayMinimal(
            options: LivenessDetectionOptions(recordVideo: true),
            frameStatus: frameStatus,
            progress: progress,
            promptTimer: countDown,
            isFocusing: isFocusing,
            activePrompt: activePrompt,
          );
        },
      ),
      // body: LivenessDetectionView(
      //   key: _livenessScanner,
      //   onLivenessTestCompleted: onLivenessCompleted,
      //   options: LivenessDetectionOptions(recordVideo: true),
      //   overlayBuilder: (
      //     context,
      //     frameStatus,
      //     countDown,
      //     progress,
      //     activePrompt,
      //     isFocusing,
      //   ) {
      //     return LivenessOverlayMinimal(
      //       options: LivenessDetectionOptions(recordVideo: true),
      //       frameStatus: frameStatus,
      //       progress: progress,
      //       promptTimer: countDown,
      //       isFocusing: isFocusing,
      //       activePrompt: activePrompt,
      //     );
      //   },
      // ),
    );
  }
}

更多关于Flutter电子身份验证插件ekyc_id_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电子身份验证插件ekyc_id_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用ekyc_id_flutter插件进行电子身份验证(eKYC)的示例代码。请注意,此代码假设你已经正确设置了Flutter开发环境,并且已经在pubspec.yaml文件中添加了ekyc_id_flutter依赖项。

首先,确保在pubspec.yaml中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  ekyc_id_flutter: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖项。

接下来,你可以按照以下步骤在你的Flutter应用中使用ekyc_id_flutter插件:

  1. 导入插件

在你的Dart文件中(例如main.dart),导入ekyc_id_flutter插件:

import 'package:ekyc_id_flutter/ekyc_id_flutter.dart';
  1. 配置插件

通常,eKYC插件需要一些初始化配置,比如API密钥或服务端URL。这些配置应该在调用身份验证功能之前设置好。假设插件提供了一个初始化方法,你可以这样做:

void initEkycPlugin() async {
  // 示例配置,实际配置取决于插件的API
  await EkycIdFlutter.initialize(
    apiKey: '你的API密钥',
    baseUrl: '你的服务端URL'
  );
}
  1. 调用身份验证功能

初始化完成后,你可以调用插件提供的身份验证方法来启动身份验证流程。以下是一个简单的示例:

void startEkycVerification() async {
  try {
    // 调用插件的验证方法,这里假设方法名为verifyIdentity
    EkycResult result = await EkycIdFlutter.verifyIdentity();

    // 处理验证结果
    if (result.success) {
      print("身份验证成功: ${result.data}");
      // 你可以在这里处理成功后的逻辑,比如保存用户信息
    } else {
      print("身份验证失败: ${result.error}");
      // 处理失败情况
    }
  } catch (e) {
    print("发生错误: $e");
    // 处理异常
  }
}
  1. 在UI中触发身份验证

最后,在你的UI中添加一个按钮或其他触发元素来调用上述身份验证方法。例如:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'eKYC Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('eKYC Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('点击按钮进行eKYC身份验证'),
              ElevatedButton(
                onPressed: () async {
                  // 初始化插件
                  await initEkycPlugin();

                  // 启动身份验证
                  await startEkycVerification();
                },
                child: Text('开始身份验证'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 假设的EkycResult类,实际类应由插件提供
class EkycResult {
  bool success;
  String? data;
  String? error;

  EkycResult({required this.success, this.data, this.error});
}

注意

  • 上述代码中的EkycIdFlutter.initializeEkycIdFlutter.verifyIdentityEkycResult类都是假设的,实际使用时请参考插件的官方文档和API。
  • 确保你已经处理了所有必要的错误处理和用户反馈。
  • 插件的具体使用方法和API可能会随着版本的更新而变化,因此始终参考最新的官方文档。
回到顶部