Flutter身份验证插件flutter_pipwave_ekyc的使用

Flutter身份验证插件flutter_pipwave_ekyc的使用

简介

Pipwave eKYC SDK 提供了一个预设计的图形用户界面(GUI),用于进行电子身份验证(eKYC)过程。在过程中,用户可能需要提交他们的身份证、驾驶执照、护照和自拍照,以及信用卡或账单等信息。

Pipwave eKYC SDK 为您创建最佳的身份验证体验提供了许多好处:

  • 预设计的用户界面帮助用户从头到尾完成身份证和自拍照的eKYC过程。
  • 可以轻松地与您的Flutter应用程序集成。
  • 图像将安全地上载到Pipwave服务,从而简化了集成过程。

功能

身份验证

验证政府签发的身份证明文件,如护照、驾驶执照和州身份证。

信用卡验证

验证信用卡信息,以防止欺诈性交易。

地址证明验证

通过各种文档类型确认个人地址,包括公用事业账单、银行对账单和租赁协议。

安装

导入包
dependencies:
  flutter_pipwave_ekyc: 1.0.0

前提条件

添加相机和图库权限
iOS
  1. Info.plist添加以下行:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        ...
        <key>NSCameraUsageDescription</key>
        <string>We need access to your camera to capture photos and videos.</string>
        <key>NSPhotoLibraryUsageDescription</key>
        <string>Access to your media gallery is required to share your photos or videos to the mobile app.</string>
        ...
    </dict>
    </plist>
    
  2. Podfile添加以下行:
    post_install do |installer|
        installer.pods_project.targets.each do |target|
            flutter_additional_ios_build_settings(target)
    
            target.build_configurations.each do |config|
            config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
                '$(inherited)',
    
                ## dart: PermissionGroup.camera
                'PERMISSION_CAMERA=1',
    
                ## dart: PermissionGroup.photos
                'PERMISSION_PHOTOS=1',
            ]
    
            end
        end
    end
    
Android
  1. AndroidManifest.xml添加以下行:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
        <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
        <uses-permission android:name="android.permission.CAMERA" />
    
        <application
            android:requestLegacyExternalStorage="true"
            ...>
            ...
        </application>
    </manifest>
    
添加本地化
iOS
  1. Info.plist添加以下行:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        ...
        <key>CFBundleLocalizations</key>
        <array>
            <string>en</string>
        </array>
        ...
    </dict>
    </plist>
    
Android

无需更改。

启动SDK

初始化SDK
FlutterPipwaveEkyc.instance.launch(
    context,
    accessToken: '{{ACCESS_TOKEN}}',
    onSuccess: () {},
    onError: (error) {},
);
  • accessToken: 用户需要进行eKYC过程的令牌。
  • onSuccess: 当eKYC过程完成后触发的回调。
  • onError: 当eKYC过程失败时触发的回调(参考下表识别错误类型)。
错误/异常类型
错误/异常 描述
sessionIsInitialised 另一个会话已初始化。
invalidAccessToken 访问令牌不是有效的JWT格式。
sessionExpired 会话已过期。
invalidSession 会话ID缺失。
invalidVerificationTypes 包含不支持的验证类型。
submissionExceedLimit 该会话的提交已超过最大限制。
submissionFailed 在eKYC过程中提交失败。包含coderequestId用于调试。
closed eKYC屏幕已关闭。
unknown 在eKYC过程中发生未知错误。

示例代码

import 'package:flutter/material.dart';
import 'package:flutter_pipwave_ekyc/flutter_pipwave_ekyc.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    const MaterialApp(
      home: MainApp(),
    ),
  );
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  [@override](/user/override)
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  final _accessTokenTextEditingController = TextEditingController();
  final _logs = <String>[];

  [@override](/user/override)
  void dispose() {
    _accessTokenTextEditingController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Padding(
        padding: const EdgeInsets.all(24),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Text(
              '欢迎来到Pipwave演示。',
              style: Theme.of(context)
                  .textTheme
                  .headlineMedium
                  ?.copyWith(fontWeight: FontWeight.w600),
              textAlign: TextAlign.center,
            ),
            const SizedBox(height: 16),
            Text(
              '请输入您的eKYC访问令牌继续。',
              style: Theme.of(context)
                  .textTheme
                  .titleMedium
                  ?.copyWith(fontWeight: FontWeight.w600),
              textAlign: TextAlign.center,
            ),
            const SizedBox(height: 16),
            TextField(
              autofocus: true,
              controller: _accessTokenTextEditingController,
              decoration: const InputDecoration(
                labelText: '访问令牌',
                hintText: '输入您的访问令牌',
                border: OutlineInputBorder(),
              ),
              onChanged: (_) => setState(() {}),
            ),
            const SizedBox(height: 32),
            ElevatedButton(
              onPressed:
                  _isButtonEnabled ? () => _launchEkycSdk(context) : null,
              child: const Text('继续'),
            ),
            if (_logs.isNotEmpty) ...[
              const SizedBox(height: 32),
              Text(
                '日志',
                style: Theme.of(context)
                    .textTheme
                    .headlineSmall
                    ?.copyWith(fontWeight: FontWeight.w600),
              ),
              const SizedBox(height: 16),
              Expanded(
                child: ListView.separated(
                  itemBuilder: (context, index) {
                    return Text(_logs[index]);
                  },
                  separatorBuilder: (_, __) => const Divider(),
                  itemCount: _logs.length,
                ),
              ),
            ],
          ],
        ),
      ),
    );
  }

  String get _accessTokenText => _accessTokenTextEditingController.text.trim();

  bool get _isButtonEnabled => _accessTokenText.isNotEmpty;

  Future<void> _launchEkycSdk(BuildContext context) async {
    final accessToken = _accessTokenText.replaceAll('\n', '');

    await FlutterPipwaveEkyc.instance.launch(
      context,
      accessToken: accessToken,
      onSuccess: () => _addLog('eKYC成功'),
      onError: (error) => _addLog(error.toString()),
    );
  }

  void _addLog(String log) {
    if (!mounted) {
      return;
    }

    // ignore: parameter_assignments
    log = '${DateTime.now()}: $log';
    setState(() => _logs.add(log));
  }
}

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

1 回复

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


flutter_pipwave_ekyc 是一个用于在 Flutter 应用中集成 Pipwave 的电子身份验证(eKYC)功能的插件。它允许开发者轻松地将身份验证流程集成到他们的应用程序中。以下是如何使用 flutter_pipwave_ekyc 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_pipwave_ekyc 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_pipwave_ekyc: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在需要使用 flutter_pipwave_ekyc 的 Dart 文件中导入插件:

import 'package:flutter_pipwave_ekyc/flutter_pipwave_ekyc.dart';

3. 初始化插件

在使用插件之前,通常需要初始化它。你可以在 main.dart 或应用程序的入口点进行初始化:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Pipwave eKYC 插件
  await PipwaveEkyc.initialize(
    apiKey: 'YOUR_API_KEY',
    environment: Environment.sandbox, // 或者 Environment.production
  );

  runApp(MyApp());
}

apiKey 是你从 Pipwave 获取的 API 密钥。environment 可以是 Environment.sandbox(用于测试)或 Environment.production(用于生产环境)。

4. 启动身份验证流程

在你的应用中,你可以通过调用 PipwaveEkyc.startVerification 方法来启动身份验证流程。这个方法通常在一个按钮的 onPressed 回调中调用:

ElevatedButton(
  onPressed: () async {
    try {
      final verificationResult = await PipwaveEkyc.startVerification(
        userData: {
          'userId': 'USER_ID', // 用户的唯一标识
          'countryCode': 'MY', // 用户的国家代码
          // 其他必要的用户数据
        },
      );

      // 处理验证结果
      if (verificationResult['status'] == 'success') {
        print('Verification successful: ${verificationResult['message']}');
      } else {
        print('Verification failed: ${verificationResult['message']}');
      }
    } catch (e) {
      print('Error during verification: $e');
    }
  },
  child: Text('Start Verification'),
)
回到顶部