5
  byte[] APDUCommand = { 
            (byte) 0x00, // CLA Class           
            (byte) 0xA4, // INS Instruction     
            (byte) 0x04, // P1  Parameter 1
            (byte) 0x00, // P2  Parameter 2
            (byte) 0x0A, // Length
            0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID
        };


    Intent intent = getIntent();
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    IsoDep iso = IsoDep.get(tag);        
    iso.connect();

    byte[] result = iso.transceive(APDUCommand);

我正在使用上述代码使用三星 Galaxy s4 读取 VisaPayWave NFC 卡详细信息(持卡人姓名、有效期、卡号等)。我得到的输出是 [106,-126]。我认为我使用的 APDU 命令不正确。请提出正确的命令。

4

3 回答 3

2

更改 APDU 命令定义

byte[] APDUCommand = { 
        (byte) 0x00, // CLA Class           
        (byte) 0xA4, // INS Instruction     
        (byte) 0x04, // P1  Parameter 1
        (byte) 0x00, // P2  Parameter 2
        (byte) 0x07, // Length
        (byte) 0xA0,0x00,0x00,0x00,0x03,0x10,0x10 // AID
    };
于 2014-07-08T12:42:39.473 回答
1

正如lltami回答的那样,Visa payWave 通常可以通过 AID 选择A0000000031010。所以你可以使用 APDU

00 A4 04 00 07 A0000000031010 00

选择 payWave 应用程序。

在非接触式 EMV 支付卡上,您还可以选择 PPSE(邻近支付系统环境)来检索可用应用程序(及其 AID)的列表:

00 A4 04 00 0E 325041592E5359532E4444463031 00

选择 EMV 支付应用程序只是第一步。您需要发出几个进一步的命令来获取可读的信用卡数据(请参阅此答案)。

例如,您可以发出 GET PROCESSING OPTIONS 命令(参见例如this answerthis answerthis answer)。

和/或您可以发出 READ RECORD 命令以从已知的基本文件中获取数据。例如

00 B2 01 0C 00

读取 EF 1 的记录 1,

00 B2 02 0C 00

读取 EF 1 的记录 2,或

00 B2 01 14 00

读取 EF 2 的记录 1 等。

您可以从http://www.emvco.com/获取支付系统的 EMV 规范,以了解可能的命令和数据结构。

于 2014-07-19T06:57:41.350 回答
0

您的响应代码 [106, -126] 更好地表示为十六进制,而不是暗示任何有符号值。

它实际上是 6A82 - 构成 APDU 响应代码的 SW1 和 SW2。6A82 对应于“错误的参数 P1 P2;找不到文件”。有关详细信息,请参阅 EMV 手册 1。即在卡上找不到“0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31” - 但应该是“0xA0,0x00,0x00,0x00,0x03,0x10,0x10”。

正如lletami 所说,您的APDU 命令需要重建,包括使用“压缩数字”的AID(如EMV Book 1 中所述),与二进制编码的十进制非常相似。

于 2015-09-14T23:52:32.793 回答