2011-06-28 40 views
14

我想从VISA卡读取信用卡数据,但无法取得成功。在互联网资源中,我发现对于MASTER卡我们可以选择PSE目录使用1PAY.SYS.DDF01文件,然后读取记录。但对于VISA而言,它不是强制性的,当我使用SELECT命令获取PSE目录时使用以下文件时,我得到的响应为'6A82'。这意味着它不受文件系统支持。我在EMV 4.2第1册(EMV规范)中查找错误,并且说我们必须使用“AID列表”。它说“终端使用列表中的下一个AID发出另一个SELECT命令”。 我无法理解这一点并继续进行。如何阅读基于EMV的智能VISA卡详细信息

有关如何获得VISA卡或AID获得信用卡详细信息的PSE的帮助?

感谢, 谢卡尔

回答

3

所以,问题是你不知道你的卡上应用的援助?没有办法让他们(PSE除外),你必须首先知道你所支持的卡上的应用程序。所以“AID列表”就是你支持的AID列表,这是你收购方告诉你的。您可以尝试使用您在此处列出的某些标准AID自行创建此列表:http://en.wikipedia.org/wiki/EMV#Application_selection

1

这对我来说有点奇怪......我的研究表明,对于VISA,应用程序始终可用,但对于万事达卡它是不是强制性的?

总之,这里是我发送给我的读卡器序命令来选择应用:

//    OP CL P1 P2 LN DATA------------------------------------- EL 
//select command 00 A4 04 00 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00 

NSString* str= @"1PAY.SYS.DDF01"; 
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding]; 
int datalength = data.length; 
NSMutableData *selectPSECommand = [[NSMutableData alloc] init]; 

[selectPSECommand appendBytes:"\x00" length:1]; //command class 
[selectPSECommand appendBytes:"\xA4" length:1]; //APDU_INSTRUCTION_SELECT_FILE 
[selectPSECommand appendBytes:"\x04" length:1]; //select file by name 
[selectPSECommand appendBytes:"\x00" length:1]; //First or only occurrence of file 
[selectPSECommand appendBytes:&datalength length:1]; //data length 
[selectPSECommand appendData:data]; //the data we are sending 
[selectPSECommand appendBytes:"\x00" length:1]; //expected response length. here it is 0. We are only selecting a file. 

的代码示例是目的C.

比较数据你参议员d与我发送的数据一起看看是否对应。与此同时,我将研究通过AID列表。

希望它有帮助。 Ezfrag

6

首先PPSE小程序没有什么特定的VISA或万事达卡。它由EMV定义,并且在您正确注意到列出卡上可用支付应用程序的AID时使用。但是,如果不在那里,终端会尝试所有受支持的AID来构建候选列表。

如果要选择VISA小程序,但不知道完整的AID,则可以使用部分选择。由于所有的VISA艾滋病与VISA的RID开始:A0 00 00 00 03.你可以尝试发送这个命令:

这将返回第一个实例:

00 A4 04 00 05 A0 00 00 00 03 00

,这会给你更多,如果你有你的卡上:

00 A4 04 02 05 A0 00 00 00 03 00

+0

@KamKamen Goranchev你知道上述命令应该是什么响应APDU吗? – nish1013

+1

如果存在具有给定RID的应用程序,则响应将是状态字61XX。如果是这样,请使用GET RESPONSE命令来检索完整的AID。 – David

0

您可以使用AID列表像this one。但是,当遍历列表时,某些卡会以“错误”的数据进行响应。即,我有V-Pay VISA卡被认为是Maestro的情况。如果您必须遍历一个大的AID列表才能“打开”卡片信息,我建议您添加一个标志以从卡片中获取实际的AID,然后返回主方法读取具有主AID的卡片提供。

喜欢的东西:

  1. 读卡通过AID列表迭代
  2. 如果的0x90返回(成功读取),提取数据
  3. 检查其中返回的数据类型AID(0x4f)的。
  4. 如果是这样,清除您的列表,并使用正确的AID再次获取数据,现在您知道这是正确的,因为它直接来自卡。

由于AID通常来自卡片的第一条记录,因此该循环以最低的时间成本确保过程正确。