如何从Mastercard获取AFL?无PDOL返回时如何构造GPO指令
Mastercard非接卡SELECT无PDOL返回时的GPO构造与读数据流程
SELECT AID后未收到PDOL,代表卡片不要求终端传入任何PDOL关联的终端数据,直接按EMV规范构造GPO命令即可,不需要额外拼接终端交易参数。
GPO指令构造方法
无PDOL场景下GPO命令固定结构如下:
- 指令头:
80 A8 00 00 - Lc(数据域长度):
02 - 数据域:
83 00,其中83是PDOL填充数据的专用tag,后面的00代表PDOL要求的数据长度为0,无额外字段需要传入 - Le:默认填
00,表示请求卡片返回最大长度的响应
完整指令参考:
80 A8 00 00 02 83 00 00
注意:部分早期发行的Mastercard非接卡不支持Le填00,如果发上述指令无响应,可以将Le替换为10或20这类固定长度重试,避免卡端长度校验不通过。
从GPO响应提取AFL
GPO返回9000状态码后,按两种响应格式提取AFL即可:
- 若响应以
80开头(格式2响应):跳过前2字节的AIP(应用交互特征),后续连续的、按4字节对齐的内容就是AFL,直到响应结束(不含最后2字节的9000状态码) - 若响应以
77开头(格式1响应):在响应数据中查找tag为94的数据对象,tag后紧跟的1字节为AFL长度,长度字段后的对应长度内容就是完整AFL
举个实际响应例子:返回数据为77 16 82 02 1C 00 94 0C 08 01 02 00 10 01 02 01 18 01 01 00 90 00,找到tag94后,后续长度为0C(12字节),对应AFL内容为08 01 02 00 10 01 02 01 18 01 01 00。
基于AFL构造READ RECORD指令
AFL由多个4字节的条目组成,每个条目对应一组需要读取的记录,逐条目拆分后构造读记录命令即可,每个条目结构为:[SFI标识, 起始记录号, 结束记录号, 脱机认证记录数]
单条READ RECORD指令构造规则:
- 指令头固定为
00 B2 - P1参数:当前要读的记录号,从条目的起始记录号开始,逐次加1直到结束记录号
- P2参数:将SFI值(条目标识字节高5位)左移3位,低3位补
100(即(SFI << 3) | 0x04) - Le固定填
00,请求返回完整记录内容
以上文AFL第一个条目08 01 02 00为例:
- 第1字节
08高5位为1,即SFI=1,计算得P2为0C - 起始记录号1,结束记录号2,需要发2条读记录指令:
- 读SFI1的第1条记录:
00 B2 01 0C 00 - 读SFI1的第2条记录:
00 B2 02 0C 00
- 读SFI1的第1条记录:
所有记录读取完成后,在返回的记录数据中查找tag为57的数据对象,即为需要的Track2等效数据,其他常用数据对应tag:5A为主账号、5F24为卡片有效期、5F20为持卡人姓名。
常见注意事项
- 无PDOL场景下不要在GPO数据域随意填充冗余字节,Mastercard卡会直接返回6700(长度错误)或6A80(数据域参数错误)
- 非接通信场景下不要读取AFL范围外的记录,卡端会直接返回错误甚至终止射频连接
- 部分Mastercard卡GPO响应中会携带
8C(卡片风险管理数据对象列表1)字段,不需要额外处理,提取到94tag对应的AFL即可推进后续读记录流程
内容的提问来源于stack exchange,提问作者user3770585
相关产品推荐
相关产品推荐

