应用选择流程Application Selection在EMV交易中终端POS机通过 SELECT选择 命令与卡片交互。你提到的“发送金额、货币单元等给卡片”这属于 PDOL处理选项数据对象列表 的处理环节。完整交互步骤步骤 方向 命令/数据 说明1 终端 → 卡片 SELECTDF名或PSE 选择应用如Visa、Mastercard2 卡片 → 终端 FCI文件控制信息 返回应用信息可能包含 PDOL3 终端 → 卡片 GPO获取处理选项 带上PDOL要求的数据金额、货币、交易类型等4 卡片 → 终端 AIP AFL 这是你提到的关键返回数据你提到的三种返回情况GPO响应返回情况 TAG / 格式 含义 处理方式情况1返回 80 无TAG无Length只有Value 这是老式/简化格式直接返回应用交互特征AIP和AFL无TLV结构 按固定偏移解析AIP和AFL情况2返回 77 TLV格式带TAGLengthValue 这是标准TLV格式里面包含AIP、AFL可能还有其他数据如应用余额等 需递归解析TLV提取所需数据情况3返回 6985 状态字SW169, SW285 表示“条件不满足”或“应用被否决”终端需重新选择候选应用列表 回退到应用选择步骤尝试列表中的下一个应用AFL应用文件定位器详解你提到4字节/组AFL是一个列表每组 4个字节用于告诉终端去读哪些文件/记录来获取完整的应用数据如持卡人姓名、PAN、有效期等。字节序号 字段名 含义 说明第1字节 SFI短文件标识符 文件号高3位有效 用于定位要读取的文件第2字节 记录起始号 从哪条记录开始读 通常从1开始第3字节 记录结束号 读到哪条记录结束 包含结束记录第4字节 记录参与偏移量或记录数/哈希索引 用于离线数据认证2. 读取应用数据Read Record终端根据AFL解析出的(SFI, 起始记录, 结束记录)组合循环发送 READ RECORD读记录 命令。每条记录返回的数据都是 TLV格式。终端会解析出5F34设备使用限制57PAN5F24有效期9F1F持卡人姓名等。流程图简化理解终端 卡片| ||---- SELECT(DF) ------||--- FCI (含PDOL) -----||---- GPO (带金额等) ---||--- 80 (无TLV) -------| → 直接取AIPAFL| 或 77 (TLV) ---------| → 解析出AIPAFL| 或 6985 (拒绝) ------| → 重新选候选应用| ||--- READ RECORD循环 ---||--- TLV数据记录 ------| → 解析PAN、有效期等3. TLV 编码规则你提到“5个1111”、“81、82”等这是BER-TLV基本编码规则每个数据对象由 TAG Length Value 组成。TAG 字节解析重点TAG字节 含义 示例单字节TAG0x00~0x7E 简单类型 9F 开头的不一定是单字节需看具体值多字节TAG0x1F开头或0x7F等 扩展类型 9F01、9F02 等TAG中的高两位b8,b7 表示类别通用、应用、上下文、私有 0x80以上多为应用/私有类TAG中的第6位b6 表示是否构造型Constructed即Value是否包含子TLV 0x60 ~ 0x7F 或 0xE0 ~ 0xFF 多为构造型例如82 02 78 00 → TAG0x82Length2Value0x7800。4.2 Length 编码81/82 的含义Length 值范围 编码方式 示例0 ~ 127 单字节bit80 0x0C 12 字节128 ~ 255 两字节81 Len 81 FF 255 字节256 ~ 65535 三字节82 Len_High Len_Low 82 01 00 256 字节5. 建议记忆口诀辅助选择应用看PDOLGPO响应看77/80。AFL四字节文件、起、止、哈希偏移。TAG若为8X可能是AIP或长度标记。长度若过12781/82来扩充。【完整代码级处理伪代码C语言风格】// 1. SELECTselect_response sendAPDU(0x00A404000C, dfName);PDOL parseTLV(select_response, 0x9F38);// 2. GPOgpo_data buildPDOLValue(PDOL, amount, currency, ...);gpo_response sendAPDU(0x80A80000, gpo_data);// 3. 处理 GPO 响应if (gpo_response[0] 0x80) {// 格式1纯数据AIP gpo_response[1..2];AFL gpo_response[3..end];} else if (gpo_response[0] 0x77) {// 格式2TLVAIP parseTLV(gpo_response, 0x82);AFL parseTLV(gpo_response, 0x94);} else if (gpo_response[0] 0x69 gpo_response[1] 0x85) {// 拒绝selectNextApplication();return;}// 4. 解析 AFL 并读取记录for each group in AFL (4 bytes each) {SFI group[0] 3;startRec group[1];endRec group[2];for (rec startRec; rec endRec; rec) {P2 (SFI 3) | 0x04;record sendAPDU(0x00B2, rec, P2, 0x00);// 解析记录中的 TLV提取 PAN, 有效期, CVM 等PAN parseTLV(record, 0x5A);expiry parseTLV(record, 0x5F24);}}