You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:22:27