day01_应用选择
2026/8/21 10:02:09 网站建设 项目流程

好的,我帮你把**应用选择(Application Selection)**这一整个阶段的完整逻辑串起来,形成一个清晰的知识框架。这部分是你后续学习GPO(获取处理选项)、读记录、脱机认证等阶段的基础。

---

## 应用选择阶段总览

**一句话概括**:终端和卡片互相确认“我们要用哪个支付应用(比如银联贷记/借记)来交易”的过程。

```text
┌─────────────────────────────────────────────────────────────────┐
│ 应用选择(Application Selection) │
├─────────────────────────────────────────────────────────────────┤
│ 输入:终端支持的AID列表 + 卡片返回的PSE目录AID列表 │
│ 输出:选中的一个完整AID + 卡片的FCI(含PDOL等交易参数) │
│ 核心命令:SELECT(A4)+ READ RECORD(B2) │
└─────────────────────────────────────────────────────────────────┘
```

---

## 一、完整流程图

```text
开始

├─ 第1步:SELECT PSE
│ 发送:00 A4 04 00 0E 1PAY.SYS.DDF01
│ 目的:找到PSE目录的位置(获得SFI)
│ 关键输出:TAG 88 的值(SFI编号)

├─ 第2步:READ RECORD(循环读取)
│ 发送:00 B2 xx 0C 00(xx为记录号,P2=0C表示SFI=1)
│ 目的:把PSE目录里所有AID读出来
│ 关键输出:所有TAG 4F(ADF名/AID)
│ 退出条件:收到 6A83(记录未找到)

├─ 第3步:匹配与选择
│ │
│ ├─ 人工选择(按键指定品牌)
│ │ 直接用指定的完整AID发送 SELECT
│ │
│ └─ 智能选择(自动匹配)
│ ├─ 完全匹配:终端AID == 卡片AID(长度+内容完全相同)
│ ├─ 部分匹配:卡片AID 以 终端AID 为前缀
│ ├─ 优先级:完全匹配 > 部分匹配
│ └─ 按优先级排序后依次尝试 SELECT

├─ 第4步:SELECT AID(最终确认)
│ 发送:00 A4 04 00 xx [选中的完整AID]
│ 关键输出:
│ ├─ TAG 87:PDOL指示符(告诉终端要送哪些数据)
│ ├─ TAG 9F38:PDOL(处理选项数据对象列表)
│ ├─ TAG 9F12:应用首选名称
│ └─ TAG BF0C:发卡行数据(含公钥证书等)

└─ 进入下一阶段:GPO(获取处理选项)
```

---

## 二、关键APDU命令汇总

| 步骤 | 命令(CLA INS P1 P2 Lc Data) | 响应关键 | 说明 |
| :--- | :--- | :--- | :--- |
| **SELECT PSE** | `00 A4 04 00 0E 315041592E5359532E4444463031` | `88 01` → SFI=1 | 固定文件名 `1PAY.SYS.DDF01` |
| **READ RECORD** | `00 B2 01 0C 00` | `4F XX [AID]` | P2 = (SFI<<3) \| 0x04,循环直到6A83 |
| **SELECT AID** | `00 A4 04 00 08 A000000333010102` | `9F38` PDOL | 使用完整AID(非短前缀) |

---

## 三、核心知识点拆解

### 1. AID(应用标识符)到底是什么?

- **结构**:RID(5字节,注册应用提供者标识符)+ PIX(3~11字节,专有应用标识符扩展)
- **举例**:`A000000333`(银联RID)+ `010102`(贷记扩展)= `A000000333010102`
- **关键规则**:匹配时**从左往右按字节比较**,不分大小写(本来就是hex数据)

### 2. 匹配机制详解

| 维度 | 完全匹配 | 部分匹配(模糊匹配) |
| :--- | :--- | :--- |
| **条件** | 终端AID长度 == 卡片AID长度,且内容完全相同 | 卡片AID长度 >= 终端AID长度,且卡片前N字节 == 终端AID |
| **优先级** | **高**(先尝试) | 低(完全匹配失败后才尝试) |
| **典型用途** | Visa完整AID(如 `A0000000031010`) | 银联根RID(如 `A000000333`) |
| **SELECT时发送** | 使用匹配到的终端AID | 使用**卡片返回的完整AID**(不能用短的RID) |

### 3. 人工 vs 智能 选择

| 维度 | 人工选择 | 智能选择 |
| :--- | :--- | :--- |
| **触发** | 用户/收银员按键指定品牌 | 程序自动匹配 |
| **场景** | 传统POS机(有人值守) | 非接闸机、ATM、手机Pay |
| **控制参数** | 终端类型(Terminal Type)配置 | 终端能力(Tag 9F33) |
| **匹配策略** | 通常走完全匹配 | 先完全匹配 → 再部分匹配 |
| **降级机制** | 失败直接报错 | 可降级到人工选择(如有键盘) |

---

## 四、记住这5条口诀(面试/开发避坑用)

1. **“先PSE后记录”** —— 先SELECT PSE找到SFI,再用READ RECORD读AID列表。
2. **“完全优先于部分”** —— 匹配时完全匹配永远排在部分匹配前面。
3. **“SELECT用长的”** —— 发SELECT AID时必须用卡片返回的完整AID,不能用短的RID。
4. **“人工看按键,智能看配置”** —— 人工/智能由终端类型参数决定,不是由交易金额决定。
5. **“6A83是结束信号”** —— 读目录时收到6A83表示“读完了”,不是错误。

---

## 五、应用选择阶段输出(给下一步GPO的准备)

SELECT AID成功后,终端拿到了这些关键数据,用于后续阶段:

| 数据 | 用途 |
| :--- | :--- |
| **TAG 9F38(PDOL)** | 告诉终端要构造哪些数据(如金额、国家代码)发给卡片 |
| **TAG 87(PDOL指示符)** | 指示终端PDOL是否强制/可选 |
| **TAG 9F12(应用首选名称)** | 显示给用户看(如“ICBC PBOC Card”) |
| **TAG BF0C(发卡行数据)** | 内含发卡行公钥证书,用于脱机认证 |

---

## 六、一张图记住所有关键TAG

```text
SELECT PSE 响应
├── 6F (FCI模板)
│ ├── 84: DF名称 (1PAY.SYS.DDF01)
│ └── A5 (FCI专用模板)
│ ├── 88: SFI ← 关键!告诉你去哪读目录
│ ├── 5F2D: 语言偏好
│ └── BF0C: 发卡行数据

READ RECORD 响应
└── 70 (记录模板)
└── 61 (应用模板)
├── 4F: AID ← 关键!候选应用
├── 50: 应用标签
└── 9F12: 应用首选名称

SELECT AID 响应
└── 6F (FCI模板)
└── A5 (FCI专用模板)
├── 4F: AID (确认)
├── 87: PDOL指示符
├── 9F38: PDOL ← 关键!下一步GPO的数据字典
└── BF0C: 发卡行数据
```

---

## 七、下一步学什么?

应用选择完成后,交易流程进入:

1. **GPO(获取处理选项)** —— 用PDOL构造数据发给卡片,获取AIP和AFL
2. **读应用数据** —— 根据AFL读卡片上的持卡人记录(如PAN、有效期等)
3. **脱机认证** —— 验证卡片真伪(静态/动态数据认证)
4. **持卡人验证** —— PIN校验、签名等
5. **联机处理** —— 发往收单行/发卡行授权

如果你准备好了,我们可以从 **“GPO(GET PROCESSING OPTIONS)”** 开始讲,那是应用选择之后的第一道坎。😊

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询