Flutter泰国银行卡读取插件acs_card_reader_thailand的使用
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
更多关于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");
}