Flutter泰国银行卡读取插件acs_card_reader_thailand的使用

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

Flutter泰国银行卡读取插件acs_card_reader_thailand的使用

简介

Flutter ThaiNationalIDCard 是一个专为 Flutter 开发设计的插件,主要用于读取泰国身份证卡信息。此插件基于原始代码进一步开发,支持通过特定设备读取泰国身份证卡的详细信息。

支持设备:

  • acs acr39u icc reader

支持操作系统:

  • Android

错误消息响应

以下是可能出现的错误代码及对应的含义:

  • 0 → 打开任务时设备出错
  • 1 → 卡片未牢固插入
  • 2 → 设备权限被拒绝
  • 3 → 设备不支持
  • 4 → 未找到设备

APDU 命令

获取响应

命令格式:0x00, 0xC0, 0x00, 0x00 + Len in hex

指令说明
  • INS 0xB0 | 读取BIN数据
  • INS 0xC0 | 获取响应
SELECT FILE
  • CLA = 0X00
  • INS = 0XA4
  • P1 = 0x04 | 直接选择文件名(数据字段为文件名)
  • P2 = 0x00
  • Lc = 0x08 (文件名长度)
  • Thailand Personal DF Name = 0xA0, 0X00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01

数据表

Description CLA INS P1 P2 Lc Data Le
Select 0x00 0xA4 0X04 0x00 0x08 0xA0, 0X00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01
GET RESPONSE 0X00 0XC0 0x00 0x00
CID 0x80 0xB0 0x00 0x04 0x02 0x00 0x0D
TH Fullname 0x80 0xB0 0x00 0x11 0x02 0x00 0x64
EN Fullname 0x80 0xB0 0x00 0x75 0x02 0x00 0x64
Date of birth 0x80 0xB0 0x00 0xD9 0x02 0x00 0x08
Gender 0x80 0xB0 0x00 0xE1 0x02 0x00 0x01
Card Issuer 0x80 0xB0 0x00 0xF6 0x02 0x00 0x64
Issue Date 0x80 0xB0 0x01 0x67 0x02 0x00 0x08
Expire Date 0x80 0xB0 0x01 0x6F 0x02 0x00 0x08
Address 0x80 0xB0 0x15 0x79 0x02 0x00 0x64
Photo_Part1/20 0x80 0xB0 0x01 0x7B 0x02 0x00 0xFF
Photo_Part2/20 0x80 0xB0 0x02 0x7A 0x02 0x00 0xFF
Photo_Part3/20 0x80 0xB0 0x03 0x79 0x02 0x00 0xFF
Photo_Part4/20 0x80 0xB0 0x04 0x78 0x02 0x00 0xFF
Photo_Part5/20 0x80 0xB0 0x05 0x77 0x02 0x00 0xFF
Photo_Part6/20 0x80 0xB0 0x06 0x76 0x02 0x00 0xFF
Photo_Part7/20 0x80 0xB0 0x07 0x75 0x02 0x00 0xFF
Photo_Part8/20 0x80 0xB0 0x08 0x74 0x02 0x00 0xFF
Photo_Part9/20 0x80 0xB0 0x09 0x73 0x02 0x00 0xFF
Photo_Part10/20 0x80 0xB0 0x0A 0x72 0x02 0x00 0xFF
Photo_Part11/20 0x80 0xB0 0x0B 0x71 0x02 0x00 0xFF
Photo_Part12/20 0x80 0xB0 0x0C 0x70 0x02 0x00 0xFF
Photo_Part13/20 0x80 0xB0 0x0D 0x6F 0x02 0x00 0xFF
Photo_Part14/20 0x80 0xB0 0x0E 0x6E 0x02 0x00 0xFF
Photo_Part15/20 0x80 0xB0 0x0F 0x6D 0x02 0x00 0xFF
Photo_Part16/20 0x80 0xB0 0x10 0x6C 0x02 0x00 0xFF
Photo_Part17/20 0x80 0xB0 0x11 0x6B 0x02 0x00 0xFF
Photo_Part18/20 0x80 0xB0 0x12 0x6A 0x02 0x00 0xFF
Photo_Part19/20 0x80 0xB0 0x13 0x69 0x02 0x00 0xFF
Photo_Part20/20 0x80 0xB0 0x14 0x68 0x02 0x00 0xFF

使用示例

以下是一个完整的示例代码,展示如何使用 acs_card_reader_thailand 插件来读取泰国身份证卡信息。

import 'dart:convert';

import 'package:acs_card_reader_thailand/model/personalInformation.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:acs_card_reader_thailand/acs_card_reader_thailand.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  bool isCheck_btn = true;

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

  // 初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await AcsCardReaderThailand.platformVersion ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }
    if (!mounted) return;
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  late PersonalInformation personalInformation = PersonalInformation(status: false);

  // 连接设备并读取信息
  onConnectDevice() async {
    AcsCardReaderThailand.messageStream.listen((event) async {
      if (event) {
        if (isCheck_btn) {
          isCheck_btn = false;
          setState(() {});
          personalInformation = await AcsCardReaderThailand.acsCardID();
          isCheck_btn = true;
          setState(() {});
        }
      } else {
        isCheck_btn = true;
        personalInformation = PersonalInformation(status: false);
        setState(() {});
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    onConnectDevice();
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Thai ID Card Reader'),
        ),
        body: Center(
          child: Container(
            width: 250,
            child: SingleChildScrollView(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  // 显示用户头像
                  personalInformation.status! ? getImagenBase64(personalInformation.PictureSubFix.toString()) : SizedBox(),
                  SizedBox(height: 20,),
                  // 显示泰文姓名
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('NameTH ')),
                      Expanded(flex: 2, child: Text('${personalInformation.nameTH ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示英文姓名
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('NameEN ')),
                      Expanded(flex: 2, child: Text('${personalInformation.nameEN ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示出生日期
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('BirthDate ')),
                      Expanded(flex: 2, child: Text('${personalInformation.birthDate ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示身份证号
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('IDCard ')),
                      Expanded(flex: 2, child: Text('${personalInformation.personalID ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示性别
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('Gender ')),
                      Expanded(flex: 2, child: Text('${personalInformation.gender == 1 ? 'ชาย' : personalInformation.gender == 2 ? 'หญิง' : '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示地址
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('Adress ')),
                      Expanded(flex: 2, child: Text('${personalInformation.address ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示发卡机构
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('CardIssuer ')),
                      Expanded(flex: 2, child: Text('${personalInformation.CardIssuer ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示发卡日期
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('IssueDate ')),
                      Expanded(flex: 2, child: Text('${personalInformation.IssueDate ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示有效期
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(child: Text('ExpireDate ')),
                      Expanded(flex: 2, child: Text('${personalInformation.ExpireDate ?? '-------------------- -------------------'}')),
                    ],
                  ),
                  // 显示消息码
                  SizedBox(height: 1,),
                  Text("Message_code -> ${personalInformation.Message_code}"),
                  SizedBox(height: 20,),
                  // 扫描按钮
                  TextButton(
                    style: ButtonStyle(
                      backgroundColor: MaterialStateProperty.all(isCheck_btn ? Colors.blueAccent : Colors.grey.shade400),
                    ),
                    onPressed: () async {
                      if (isCheck_btn) {
                        isCheck_btn = false;
                        setState(() {});
                        personalInformation = await AcsCardReaderThailand.acsCardID();
                        isCheck_btn = true;
                        setState(() {});
                      }
                    },
                    child: Text("Scan Now CardID",
                      style: TextStyle(color: Colors.white),)),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

  // 将Base64编码转换为图像
  Widget getImagenBase64(String imagen) {
    const Base64Codec base64 = Base64Codec();
    if (personalInformation.status == false) return new Container(
      padding: EdgeInsets.all(20),
      color: Colors.grey.shade400,
      child: Icon(Icons.person_add, size: 100, color: Colors.grey.shade500,),
    );

    return Image.memory(
      base64.decode(imagen),
      fit: BoxFit.fitWidth,
    );
  }
}

更多关于Flutter泰国银行卡读取插件acs_card_reader_thailand的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter泰国银行卡读取插件acs_card_reader_thailand的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


acs_card_reader_thailand 是一个用于在 Flutter 应用中读取泰国银行卡信息的插件。它通常用于与 ACS(Advanced Card Systems)的读卡器设备进行交互,以读取泰国银行卡上的数据。

以下是如何在 Flutter 项目中使用 acs_card_reader_thailand 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 acs_card_reader_thailand 插件的依赖。

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

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:acs_card_reader_thailand/acs_card_reader_thailand.dart';

3. 初始化读卡器

在使用读卡器之前,通常需要初始化设备。你可以使用 AcsCardReaderThailand 类来初始化读卡器。

AcsCardReaderThailand cardReader = AcsCardReaderThailand();

4. 连接读卡器

使用 connect 方法来连接读卡器设备。

try {
  await cardReader.connect();
  print("读卡器连接成功");
} catch (e) {
  print("读卡器连接失败: $e");
}

5. 读取银行卡信息

使用 readCard 方法来读取银行卡信息。

try {
  Map<String, dynamic> cardInfo = await cardReader.readCard();
  print("银行卡信息: $cardInfo");
} catch (e) {
  print("读取银行卡信息失败: $e");
}

6. 断开连接

在完成操作后,记得断开读卡器的连接。

try {
  await cardReader.disconnect();
  print("读卡器已断开连接");
} catch (e) {
  print("断开连接失败: $e");
}

7. 处理读取到的数据

readCard 方法返回的 Map<String, dynamic> 包含了银行卡的各种信息,例如卡号、持卡人姓名、有效期等。你可以根据需要进行处理。

String cardNumber = cardInfo['cardNumber'];
String cardHolderName = cardInfo['cardHolderName'];
String expiryDate = cardInfo['expiryDate'];

print("卡号: $cardNumber");
print("持卡人姓名: $cardHolderName");
print("有效期: $expiryDate");

8. 错误处理

在实际使用中,可能会遇到各种错误,例如读卡器未连接、读卡失败等。确保在代码中妥善处理这些错误。

try {
  Map<String, dynamic> cardInfo = await cardReader.readCard();
  print("银行卡信息: $cardInfo");
} on AcsCardReaderException catch (e) {
  print("读取银行卡信息时发生错误: ${e.message}");
} catch (e) {
  print("未知错误: $e");
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!