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

如何读取NFC标签的实际数据?NFC开发新手求助

读取NFC标签实际数据的方案

首先你打印的日志是NFC标签的基础技术元数据,不是实际存储的用户数据:

  • 银行卡日志里的isodep是它用的ISO-DEP协议参数(符合EMV支付标准),nfca是NFC-A类型标签的硬件参数(比如identifier是标签唯一ID,sak是标签应答标识)
  • 健身卡日志里的mifareclassic说明它是MIFARE Classic卡,日志给出了卡的容量(1024字节)、扇区/块数量等硬件属性

要读取标签里的实际数据,需要根据卡的类型调用对应API处理:


一、读取MIFARE Classic健身卡数据

这类卡需要先验证扇区密钥,再读取对应块的存储内容,示例代码:

void _startNFCReading() async {
  try {
    bool isAvailable = await NfcManager.instance.isAvailable();
    if (isAvailable) {
      NfcManager.instance.startSession(
        onDiscovered: (NfcTag tag) async {
          MifareClassic? mifareCard = MifareClassic.fromTag(tag);
          if (mifareCard != null) {
            try {
              await mifareCard.connect();
              // 多数空白/民用MIFARE卡用默认密钥FFFFFFFFFFFF,若不行需联系卡发行方获取
              bool authSuccess = await mifareCard.authenticateSectorWithKeyA(0, MifareClassic.keyDefault);
              if (authSuccess) {
                // 读取扇区0的块0数据(每个扇区最后一块是密钥块,请勿随意写入)
                Uint8List blockData = await mifareCard.readBlock(0);
                debugPrint('块0原始数据: $blockData');
                // 若存储的是文本,转成字符串输出
                debugPrint('文本内容: ${String.fromCharCodes(blockData)}');
              } else {
                debugPrint('扇区验证失败,密钥不匹配');
              }
              await mifareCard.close();
            } catch (e) {
              debugPrint('读取MIFARE卡出错: $e');
            }
          }
          await NfcManager.instance.stopSession();
        },
      );
    } else {
      debugPrint('NFC不可用');
    }
  } catch (e) {
    debugPrint('NFC初始化出错: $e');
  }
}

二、读取银行卡数据

银行卡属于EMV标准IC卡,需发送APDU指令交互,仅能读取公开基本信息(敏感数据需合法权限),示例代码:

void _startNFCReading() async {
  try {
    bool isAvailable = await NfcManager.instance.isAvailable();
    if (isAvailable) {
      NfcManager.instance.startSession(
        onDiscovered: (NfcTag tag) async {
          IsoDep? bankCard = IsoDep.fromTag(tag);
          if (bankCard != null) {
            try {
              await bankCard.connect();
              // 发送APDU指令选择EMV支付应用(以Visa为例)
              Uint8List selectApdu = Uint8List.fromList([0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x00]);
              Uint8List response = await bankCard.transceive(selectApdu);
              debugPrint('应用选择响应: $response');
              // 可根据EMV规范发送更多指令读取公开信息(如卡号片段)
              await bankCard.close();
            } catch (e) {
              debugPrint('读取银行卡出错: $e');
            }
          }
          await NfcManager.instance.stopSession();
        },
      );
    } else {
      debugPrint('NFC不可用');
    }
  } catch (e) {
    debugPrint('NFC初始化出错: $e');
  }
}

注意:未经授权读取他人银行卡敏感数据涉嫌违法,开发时仅可测试公开字段。

内容的提问来源于stack exchange,提问作者mana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:57:05