如何使用Flutter读取信用卡的NFC信息(卡号、有效期、CVV)
Flutter读取信用卡NFC信息的正确方案
为啥之前的代码没用?
- 你写的是处理普通NFC标签的NDEF逻辑,但信用卡采用的是EMV智能卡标准(基于ISO 7816协议),和普通NFC标签的格式完全不同,所以代码识别不了信用卡。
- 重点提醒:CVV是印刷在卡片上的安全校验码,不会存储在NFC芯片中,无法通过NFC读取。
正确实现方法
1. 选对依赖
推荐用flutter_nfc_kit,它对EMV卡片的指令封装更友好;也可以用nfc_manager手动处理指令,不过代码会更繁琐。
2. 核心代码示例(用flutter_nfc_kit)
import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; import 'package:intl/intl.dart'; Future<void> readCreditCard() async { try { // 检查设备是否支持NFC final nfcStatus = await FlutterNfcKit.nfcAvailability; if (nfcStatus != NFCAvailability.available) { throw Exception("设备不支持NFC或未开启"); } // 启动NFC扫描,只识别ISO 7816类型的卡片(即EMV信用卡) final tag = await FlutterNfcKit.poll( timeout: const Duration(seconds: 10), pollOption: NFCPollOption.iso14443, ); if (tag.type == NFCTagType.iso7816) { // 发送指令选择Visa应用(不同品牌卡片的指令不同,比如MasterCard是00A4040007A0000000041010) await FlutterNfcKit.transceive("00A4040007A0000000031010"); // 读取卡号(对应EMV标签5A) final cardNumResp = await FlutterNfcKit.transceive("00CA005A00"); final cardNumber = _hexToString(cardNumResp.substring(0, cardNumResp.length - 4)); // 读取有效期(对应EMV标签5F24) final expiryResp = await FlutterNfcKit.transceive("00CA005F2400"); final expiryHex = expiryResp.substring(0, 4); final expiryDate = DateFormat("MM/yy").format(DateFormat("yyMM").parse(expiryHex)); // 读取持卡人姓名(对应EMV标签5F20) final holderResp = await FlutterNfcKit.transceive("00CA005F2000"); final cardHolderName = _hexToString(holderResp.substring(0, holderResp.length - 4)); // 更新UI逻辑 // cardNumber、cardHolderName、expiryDate就是你要的信息 update(); // 这里可以加你的页面跳转逻辑 // Get.toNamed('/debit-sms', arguments: receiveController.text); } // 结束NFC会话 await FlutterNfcKit.finish(); } catch (e) { print("读取失败: $e"); // 不管成功失败都要结束会话 await FlutterNfcKit.finish(); } } // 把十六进制字符串转成普通字符串 String _hexToString(String hexStr) { String result = ""; for (int i = 0; i < hexStr.length; i += 2) { final code = hexStr.substring(i, i + 2); result += String.fromCharCode(int.parse(code, radix: 16)); } return result; }
3. 配置权限
- Android:在
AndroidManifest.xml里加这些:<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="false" /> - iOS:在
Info.plist里加:<key>NFCReaderUsageDescription</key> <string>读取信用卡信息</string> <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key> <array> <string>A0000000031010</string> <!-- Visa的应用ID --> <string>A0000000041010</string> <!-- MasterCard的应用ID --> <string>A000000333010101</string> <!-- 银联的应用ID --> </array>
注意事项
- 不同品牌的信用卡需要发送不同的应用选择指令,比如银联、MasterCard的指令和Visa不一样,你可以根据实际需求添加判断。
- 有些卡片可能不支持读取持卡人姓名,需要根据实际返回的结果调整逻辑。
- 必须在真实设备上测试,模拟器不支持NFC功能。
内容的提问来源于stack exchange,提问作者Ted
相关产品推荐
相关产品推荐

