ISO 8583 是金融交易消息的全球标准。它是卡支付、ATM 交易和银行间通信背后的协议。本指南介绍消息结构、MTI、位图、数据元素,以及如何在实践中解析这些消息。
什么是 ISO 8583?
ISO 8583 定义了在系统之间交换金融交易信息的消息格式。它被以下系统使用:
- 支付卡网络(Visa、Mastercard)
- ATM 网络
- 销售点系统
- 银行交换系统
- 支付处理商
为什么 ISO 8583 很重要
每次您使用卡时:
- 终端向收单行发送 ISO 8583 消息
- 收单行路由到卡网络
- 网络发送到发卡行
- 发卡行以 ISO 8583 消息响应
- 响应流回到终端
这在毫秒内完成,全球每天发生数十亿次。
消息结构
ISO 8583 消息由以下部分组成:
+------------------+
| MTI | 消息类型指示符(4位数字)
+------------------+
| 位图 | 8 或 16 字节,指示存在的字段
+------------------+
| 数据元素 | 可变数量的字段
+------------------+
消息类型指示符(MTI)
MTI 标识消息类型和版本。
MTI 结构
MTI 是一个 4 位数字:
位置 1:版本
位置 2:消息类别
位置 3:消息功能
位置 4:消息来源
版本代码
| 代码 | 版本 |
|---|---|
| 0 | ISO 8583:1987 |
| 1 | ISO 8583:1993 |
| 2 | ISO 8583:2003 |
消息类别
| 代码 | 类别 | 描述 |
|---|---|---|
| 1 | 授权 | 卡授权请求 |
| 2 | 金融 | 金融交易 |
| 3 | 文件操作 | 批处理 |
| 4 | 冲正 | 交易冲正 |
| 5 | 对账 | 结算 |
| 8 | 网络管理 | 系统消息 |
消息功能
| 代码 | 功能 | 描述 |
|---|---|---|
| 0 | 请求 | 初始请求 |
| 1 | 请求响应 | 对请求的响应 |
| 2 | 通知 | 通知(不需要响应) |
| 3 | 通知响应 | 对通知的响应 |
| 4 | 信息 | 信息性消息 |
| 8 | 保留 | ISO 保留使用 |
消息来源
| 代码 | 来源 | 描述 |
|---|---|---|
| 0 | 收单行 | 来自收单银行 |
| 1 | 收单行重发 | 收单行消息重发 |
| 2 | 发卡行 | 来自发卡银行 |
| 3 | 发卡行重发 | 发卡行消息重发 |
常见 MTI
| MTI | 描述 |
|---|---|
| 0100 | 授权请求 |
| 0110 | 授权响应 |
| 0200 | 金融交易请求 |
| 0210 | 金融交易响应 |
| 0220 | 金融交易通知 |
| 0230 | 金融交易通知响应 |
| 0400 | 冲正请求 |
| 0410 | 冲正响应 |
| 0800 | 网络管理请求 |
| 0810 | 网络管理响应 |
位图
位图指示消息中存在哪些数据元素。
主位图
8 字节(64 位)——每一位代表一个数据元素:
位 1:数据元素 1
位 2:数据元素 2
...
位 64:数据元素 64
如果位设置为 1,则该数据元素存在。
次位图
如果位 1 被设置,则跟随一个次位图:
位 1 被设置 → 次位图存在
次位图覆盖元素 65-128
读取位图
示例位图:723C048000000000
转换为二进制:
7 = 0111
2 = 0010
3 = 0011
C = 1100
...
每个 '1' 表示相应的字段存在。
数据元素
ISO 8583 定义了最多 128 个数据元素。
常见数据元素
| 字段 | 名称 | 格式 | 长度 |
|---|---|---|---|
| 2 | 主账号(PAN) | LLVAR | 最多 19 |
| 3 | 处理代码 | N | 6 |
| 4 | 交易金额 | N | 12 |
| 7 | 传输日期/时间 | N | 10 |
| 11 | 系统跟踪审计号 | N | 6 |
| 12 | 本地交易时间 | N | 6 |
| 13 | 本地交易日期 | N | 4 |
| 14 | 有效期 | N | 4 |
| 22 | POS 输入方式 | N | 3 |
| 25 | POS 条件代码 | N | 2 |
| 35 | 磁道 2 数据 | LLVAR | 最多 37 |
| 37 | 检索参考号 | AN | 12 |
| 38 | 授权标识响应码 | AN | 6 |
| 39 | 响应码 | AN | 2 |
| 41 | 卡受理终端 ID | ANS | 8 |
| 42 | 卡受理方 ID 代码 | ANS | 15 |
| 43 | 卡受理方名称/位置 | ANS | 40 |
| 52 | PIN 块 | B | 8 |
| 53 | 安全相关控制信息 | N | 16 |
| 55 | ICC 系统相关数据 | LLVAR | 最多 999 |
| 64 | 消息认证码 | B | 8 |
数据格式
| 代码 | 格式 | 描述 |
|---|---|---|
| N | 数字 | 仅数字(0-9) |
| AN | 字母数字 | 字母和数字 |
| ANS | 字母数字+特殊字符 | 字母、数字、特殊字符 |
| B | 二进制 | 原始二进制数据 |
| Z | 磁道 2 | 磁道 2 数据格式 |
长度编码
| 类型 | 编码 | 示例 |
|---|---|---|
| 固定 | 无长度前缀 | "HELLO" 始终 5 字符 |
| LLVAR | 2 位长度前缀 | "05HELLO" |
| LLLVAR | 3 位长度前缀 | "005HELLO" |
实际示例
授权请求(0100)
MTI: 0100
位图: 723C048000000000
存在的字段:
- 2: PAN (4123456789012345)
- 3: 处理代码 (000000)
- 4: 金额 (000000010000)
- 7: 日期/时间 (0115103000)
- 11: STAN (123456)
- 14: 有效期 (2512)
- 22: POS 输入方式 (051)
- 41: 终端 ID (TERM0001)
- 42: 商户 ID (MERCH0001)
授权响应(0110)
MTI: 0110
位图: 7230000002000000
存在的字段:
- 2: PAN(回显)
- 3: 处理代码(回显)
- 4: 金额(回显)
- 7: 日期/时间(回显)
- 11: STAN(回显)
- 38: 授权码 (ABC123)
- 39: 响应码 (00)
ATM NDC 格式
NDC(NCR Diebold 兼容)是 ATM 使用的 ISO 8583 子集。
NDC 特定元素
| 字段 | NDC 用途 |
|---|---|
| 52 | PIN 块(ISO 9564) |
| 53 | 密钥管理信息 |
| 55 | EMV 芯片数据 |
| 61 | ATM 终端数据 |
| 62 | ATM 金融数据 |
| 63 | ATM 网络数据 |
Wincor 格式
Wincor(现为 Diebold Nixdorf)ATM 使用类似但不同的格式。
Wincor 差异
- 某些元素的字段分配不同
- 字段 60-63 中的专有扩展
- 不同的消息路由约定
解析 ISO 8583 消息
逐步解析
- 读取 MTI(前 4 字节或字符)
- 读取位图(接下来的 8 或 16 字节)
- 对于位图中每个设置的位:
- 根据格式读取数据元素
- 如果是 LLVAR/LLLVAR 则处理长度前缀
- 验证所有必需字段都存在
常见解析问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 字段数量错误 | 位图读取错误 | 验证位图解析 |
| 消息截断 | 长度计算错误 | 检查 LLVAR/LLLVAR 处理 |
| 无效字符 | 格式不匹配 | 验证 N/AN/ANS 格式 |
| 二进制数据问题 | BCD 与二进制 | 确认编码 |
最佳实践
- 始终先解析位图——它决定了哪些字段存在
- 处理主位图和次位图——检查位 1
- 尊重长度前缀——必须正确解析 LLVAR/LLLVAR
- 验证字段格式——数字字段应仅包含数字
- 记录原始消息——对调试至关重要
在线体验
使用我们的 消息解析器工具:
- 解析 ISO 8583 消息
- 提取 MTI 和位图
- 解码各个数据元素
- 了解消息结构
该工具支持各种格式,包括 ATM NDC 和 Wincor。
该工具完全在浏览器中运行——数据不会离开您的设备。