400000…、510000…),仅校验位按 Luhn 算法配平;终端号、商户号是 TERM0001 这类明显的占位值;密文和 PIN 块是随手编的十六进制。不含任何真实持卡人、真实商户或真实银行的信息。
下面每条报文都是纯 ASCII 文本:4 个字符的 MTI,位图写成 16 个十六进制字符(有副位图时 32 个),然后按域号升序排数据域。这是最适合学习和粘贴给工具的表示法——不用先跟字节编码搏斗。但有三件事要先说清:
16 就是后面跟 16 个字符。唯一反直觉的是芯片示例的 DE55:EMV 数据以十六进制文本呈现,所以它的 LLL 前缀写的是 174——174 个十六进制字符,即 87 个字节。换成压缩 BCD 的线上报文,同一个前缀按字节数就该写 087。400000******7899;本页表格给的是原值,想在工具里看到一样的,把「卡号脱敏」勾掉即可。这条报文在讲什么:一笔 50.00 美元的超市(MCC 5411)消费授权请求。卡是刷的——DE22 902:完整读磁、终端没有密码键盘——所以走签名。二磁道数据放在 DE35 里一起上送。
0100723C448028C08000164000001234567899000000000000005000081009302100012309302108102812541190200334000001234567899=2812101123450000622209000123TERM0001TESTMERCH000001840
MTI 0100 · 主位图 723C448028C08000 · 置位 16 个域:2、3、4、7、11、12、13、14、18、22、25、35、37、41、42、49。(位图可以用位图计算器自己复算。)
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 2 | 主账号 PAN | 4000001234567899 | 测试号段卡号(LLVAR,前缀 16),Luhn 校验通过 |
| 3 | 处理码 | 000000 | 普通消费、默认账户——任意值都能用 DE3 速查拆开看 |
| 4 | 交易金额 | 000000005000 | 5000 个最小货币单位;配合 DE49=840(USD,2 位小数)→ 50.00 美元 |
| 7 | 传输日期时间 | 0810093021 | MMDDhhmmss,GMT:8 月 10 日 09:30:21 |
| 11 | 系统跟踪号 STAN | 000123 | 请求和 0110 响应就靠它配对 |
| 12 | 本地交易时间 | 093021 | 受理方当地 hhmmss |
| 13 | 本地交易日期 | 0810 | 受理方当地 MMDD |
| 14 | 卡有效期 | 2812 | YYMM:2028 年 12 月——与二磁道里的有效期一致 |
| 18 | 商户类型 MCC | 5411 | 超市 / 杂货店 |
| 22 | POS 输入方式 | 902 | 90 = 完整读磁;2 = 终端不能输 PIN——见 DE22 速查 |
| 25 | POS 条件码 | 00 | 正常有卡交易 |
| 35 | 磁道 2 数据 | 4000001234567899=2812101123450000 | 卡号 = 有效期(2812)+ 服务码(101)+ 自定义数据;LLVAR,前缀 33 |
| 37 | 检索参考号 RRN | 622209000123 | 常见拼法(并非标准强制):儒略日 6222(2026 年第 222 天)+ 小时 09 + STAN |
| 41 | 终端标识 | TERM0001 | 占位终端号 |
| 42 | 商户标识 | TESTMERCH000001 | 占位商户号,定长 15 位 |
| 49 | 交易货币代码 | 840 | 美元——DE4 的小数点就是它给的 |
这条报文在讲什么:发卡行批准了这笔 50.00 美元的消费。DE39 00 是结论,DE38 654321 是打印在小票上的授权码。注意响应回了什么:配对用的关键域(STAN、RRN、金额)原样回显,只在请求里有意义的域(磁道、输入方式、MCC)则不再出现。
0110723800000EC080001640000012345678990000000000000050000810093023000123093021081062220900012365432100TERM0001TESTMERCH000001840
MTI 0110 · 主位图 723800000EC08000 · 置位 13 个域:2、3、4、7、11、12、13、37、38、39、41、42、49。
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 2 | 主账号 PAN | 4000001234567899 | 回显请求值 |
| 3 | 处理码 | 000000 | 回显:消费 |
| 4 | 交易金额 | 000000005000 | 回显:50.00 美元——若这里变小,就是部分批准 |
| 7 | 传输日期时间 | 0810093023 | 比请求晚两秒——这是响应自己的时间戳 |
| 11 | 系统跟踪号 STAN | 000123 | 与请求相同——配对键 |
| 12 | 本地交易时间 | 093021 | 回显请求值 |
| 13 | 本地交易日期 | 0810 | 回显请求值 |
| 37 | 检索参考号 RRN | 622209000123 | 请求响应共用同一参考号 |
| 38 | 授权标识响应码 | 654321 | 发卡行分配的授权码 |
| 39 | 响应码 | 00 | 批准——其余取值都是拒绝原因,见 DE39 查询 |
| 41 | 终端标识 | TERM0001 | 回显 |
| 42 | 商户标识 | TESTMERCH000001 | 回显 |
| 49 | 交易货币代码 | 840 | 美元 |
这条报文在讲什么:ATM 上从储蓄账户取现 200.00 美元。DE3 011000 拆开读:交易类型 01(取现)、借记方账户 10(储蓄)。卡在 ATM 上刷磁(DE22 901——磁条、可输 PIN),持卡人输了密码,所以 DE52 带着加密 PIN 块。和上面的 0100 不同,0200 批准即记账——这个差别正是下一节 0400 冲正存在的前提。
02007238448128C090001640000012345678990110000000000200000810093045000124093045081060119010006424242334000001234567899=2812101123450000622209000124ATM00001TESTATM000000018409A8B7C6D5E4F3210
MTI 0200 · 主位图 7238448128C09000 · 置位 17 个域:2、3、4、7、11、12、13、18、22、25、32、35、37、41、42、49、52。
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 2 | 主账号 PAN | 4000001234567899 | 同一张合成测试卡 |
| 3 | 处理码 | 011000 | 01 取现 · 借记方 10 储蓄账户 · 贷记方 00 未指定 |
| 4 | 交易金额 | 000000020000 | 20000 个最小单位 → 200.00 美元 |
| 7 | 传输日期时间 | 0810093045 | 8 月 10 日 09:30:45 GMT |
| 11 | 系统跟踪号 STAN | 000124 | 本笔交易的新跟踪号 |
| 12 | 本地交易时间 | 093045 | 当地 hhmmss |
| 13 | 本地交易日期 | 0810 | 当地 MMDD |
| 18 | 商户类型 MCC | 6011 | ATM 取现 |
| 22 | POS 输入方式 | 901 | 刷磁读卡,终端可输 PIN |
| 25 | POS 条件码 | 00 | 正常 |
| 32 | 受理机构标识码 | 424242 | ATM 所属机构(LLVAR,前缀 06)——冲正的 DE90 里会再次出现 |
| 35 | 磁道 2 数据 | 4000001234567899=2812101123450000 | 磁条原样读出的内容 |
| 37 | 检索参考号 RRN | 622209000124 | 跟着这笔交易走完清算与差错处理全程 |
| 41 | 终端标识 | ATM00001 | 占位 ATM 终端号 |
| 42 | 商户标识 | TESTATM00000001 | 占位 ATM 所有方 |
| 49 | 交易货币代码 | 840 | 美元 |
| 52 | PIN 数据 | 9A8B7C6D5E4F3210 | 8 字节加密 PIN 块,写成 16 个十六进制字符——合成值,解不出任何真密码 |
这条报文在讲什么:批准,出钞。多出来的一笔是 DE54:发卡行把可用余额带回来,供 ATM 打印。1002840C000000098500 拆开读:账户 10(储蓄)· 金额类型 02(可用余额)· 币种 840 · C 贷方 · 000000098500 → 余额 985.00 美元。(DE54 的子域布局各网络不尽相同,这里只作演示。)
0210723800000EC084001640000012345678990110000000000200000810093047000124093045081062220900012465432200ATM00001TESTATM000000018400201002840C000000098500
MTI 0210 · 主位图 723800000EC08400 · 置位 14 个域:2、3、4、7、11、12、13、37、38、39、41、42、49、54。
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 2 | 主账号 PAN | 4000001234567899 | 回显 |
| 3 | 处理码 | 011000 | 回显:储蓄账户取现 |
| 4 | 交易金额 | 000000020000 | 回显:200.00 美元 |
| 7 | 传输日期时间 | 0810093047 | 响应自己的时间戳 |
| 11 | 系统跟踪号 STAN | 000124 | 配对键,不变 |
| 12 | 本地交易时间 | 093045 | 回显 |
| 13 | 本地交易日期 | 0810 | 回显 |
| 37 | 检索参考号 RRN | 622209000124 | 回显 |
| 38 | 授权标识响应码 | 654322 | 授权码 |
| 39 | 响应码 | 00 | 批准 |
| 41 | 终端标识 | ATM00001 | 回显 |
| 42 | 商户标识 | TESTATM00000001 | 回显 |
| 49 | 交易货币代码 | 840 | 美元 |
| 54 | 附加金额 | 1002840C000000098500 | 可用余额 985.00 美元(LLLVAR,前缀 020) |
这条报文在讲什么:ATM 没等到(或没能处理)上面那条 0210,超时后要求发卡行把这笔 200.00 美元取现撤销。冲正有自己的 STAN(000125)和时间戳,但沿用原交易的 RRN——DE90 里装的则是被冲正那笔交易的"指纹"。
0400F238048108C080000000004000000000164000001234567899011000000000020000081009354500012509354508109010006424242622209000124ATM00001TESTATM00000001840020000012408100930450000042424200000000000
MTI 0400 · 主位图 F238048108C08000 + 副位图 0000004000000000 · 置位 15 个域:2、3、4、7、11、12、13、22、25、32、37、41、42、49、90。位图第一个字符是 F,因为 bit 1 置位:DE90 的域号超过 64,主位图后面必须紧跟副位图——手工拼冲正报文最容易漏的就是这一步。
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 2 | 主账号 PAN | 4000001234567899 | 与原交易同卡 |
| 3 | 处理码 | 011000 | 与原 0200 相同 |
| 4 | 交易金额 | 000000020000 | 全额 200.00 美元——全额冲正;部分冲正会改这里(并用 DE95) |
| 7 | 传输日期时间 | 0810093545 | 比原交易晚五分钟——超时计时器到点才发出 |
| 11 | 系统跟踪号 STAN | 000125 | 新 STAN:冲正是一条独立报文,不是重发 |
| 12 | 本地交易时间 | 093545 | 冲正自己的当地时间 |
| 13 | 本地交易日期 | 0810 | MMDD |
| 22 | POS 输入方式 | 901 | 沿用原交易 |
| 25 | POS 条件码 | 00 | 正常 |
| 32 | 受理机构标识码 | 424242 | 与原交易同一受理机构 |
| 37 | 检索参考号 RRN | 622209000124 | 原交易的 RRN——留着它,下游系统才能把两笔串起来 |
| 41 | 终端标识 | ATM00001 | 同一台 ATM |
| 42 | 商户标识 | TESTATM00000001 | 同一所有方 |
| 49 | 交易货币代码 | 840 | 美元 |
| 90 | 原始数据元素 | 020000012408100930450000042424200000000000 | 42 位数字、五个紧排子域——下表逐段拆开 |
DE90 是定长 42 位数字的拼接,用来唯一指认被冲正的原交易。切开看:
| 位置 | 子域 | 值 | 对应 |
|---|---|---|---|
| 1–4 | 原 MTI | 0200 | 被冲正的金融请求 |
| 5–10 | 原 STAN | 000124 | 原 0200 的 DE11 |
| 11–20 | 原 DE7 | 0810093045 | 原 0200 的传输时间戳 |
| 21–31 | 原受理机构标识 | 00000424242 | 原 0200 的 DE32,左补零到 11 位 |
| 32–42 | 原转发机构标识 | 00000000000 | 全零——原交易没有 DE33 |
冲正为什么存在、什么时候升级成 0420 通知、重发(0401/0421)怎么用,单独一篇讲透:冲正、超时与重发。
这条报文在讲什么:"你还活着吗?"——回声测试。没有卡、没有钱:只有 DE7、一个 STAN 和 DE70 301(回声测试)。签到用 DE70 001、签退 002——同样的骨架,换个代码而已。这是你能见到的最短的真实 ISO 8583 报文,恰好也是学副位图的最佳教材。
0800822000000000000004000000000000000810120000000200301
MTI 0800 · 主位图 8220000000000000 + 副位图 0400000000000000 · 置位 3 个域:7、11、70。DE70 的域号是 70,超过 64,所以哪怕这么小的报文也得把 bit 1 置上、再挂一张副位图——于是 32 个十六进制字符的位图,包着的只有 19 个字符的数据。
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 7 | 传输日期时间 | 0810120000 | 8 月 10 日 12:00:00 GMT |
| 11 | 系统跟踪号 STAN | 000200 | 0810 靠它对上这条 0800 |
| 70 | 网络管理信息码 | 301 | 回声测试;001 = 签到,002 = 签退,101 = 换密钥 |
这条报文在讲什么:"活着。"应答方回显 STAN 和 DE70,再加一个 DE39 00。
081082200000020000000400000000000000081012000100020000301
MTI 0810 · 主位图 8220000002000000 + 副位图 0400000000000000 · 置位 4 个域:7、11、39、70。
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 7 | 传输日期时间 | 0810120001 | 一秒之后 |
| 11 | 系统跟踪号 STAN | 000200 | 回显——配对键 |
| 39 | 响应码 | 00 | 受理成功 |
| 70 | 网络管理信息码 | 301 | 回显:应答的正是这次回声测试 |
签到时序、心跳间隔、密钥交换的完整讲解见0800 / 0810 网络管理报文。
这条报文在讲什么:一笔 25.00 美元的餐厅(MCC 5812)接触式芯片消费,联机输入 PIN,卡片生成了 ARQC——一枚"请发卡行来决定"的密文。芯片贡献的所有数据以 BER-TLV 格式装进 DE55。
0100723C468008C08200165100001234567895000000000000002500081010153300020110153308102812581205100100622210000201TERM0002TESTMERCH00000284017482023C00950500000480009A032608109C01005F2A0208409F02060000000025009F100706010A03A000009F1A0208409F2608A1B2C3D4E5F607189F2701809F3303E0F8C89F34030200009F3602003C9F37041A2B3C4D
MTI 0100 · 主位图 723C468008C08200 · 置位 17 个域:2、3、4、7、11、12、13、14、18、22、23、25、37、41、42、49、55。先看 ISO 8583 这一层:
| DE | 域名 | 原始值 | 在这条报文里的含义 |
|---|---|---|---|
| 2 | 主账号 PAN | 5100001234567895 | 测试号段(510000…),Luhn 校验通过 |
| 3 | 处理码 | 000000 | 消费 |
| 4 | 交易金额 | 000000002500 | 2500 个最小单位 → 25.00 美元——DE55 里的 9F02 是它的镜像 |
| 7 | 传输日期时间 | 0810101533 | 8 月 10 日 10:15:33 GMT |
| 11 | 系统跟踪号 STAN | 000201 | 跟踪号 |
| 12 | 本地交易时间 | 101533 | hhmmss |
| 13 | 本地交易日期 | 0810 | MMDD——DE55 里的 9A 带年份存了同一天 |
| 14 | 卡有效期 | 2812 | 2028 年 12 月 |
| 18 | 商户类型 MCC | 5812 | 餐厅 |
| 22 | POS 输入方式 | 051 | 05 = 接触式芯片,1 = 可输 PIN |
| 23 | 卡片序列号 | 001 | 该卡号下的第一张卡 |
| 25 | POS 条件码 | 00 | 正常 |
| 37 | 检索参考号 RRN | 622210000201 | 还是"儒略日 + 小时 + STAN"的惯用拼法 |
| 41 | 终端标识 | TERM0002 | 占位值 |
| 42 | 商户标识 | TESTMERCH000002 | 占位值 |
| 49 | 交易货币代码 | 840 | 美元——DE55 里的 5F2A 与之呼应 |
| 55 | IC 卡数据 / EMV | 8202…3C4D(87 字节) | BER-TLV,下表逐 tag 拆解。注意 LLL 前缀是 174——数的是十六进制字符而不是字节(见编码约定) |
再看 DE55 的载荷,逐 tag 对照——和解析器的 TLV 解码输出完全一致(把这段值单独贴进 EMV TLV 解析器也能得到同样结果):
| Tag | 名称 | 值 | 在这条报文里的含义 |
|---|---|---|---|
82 | 应用交互特征 AIP | 3C00 | 卡片支持 DDA、持卡人验证、终端风险管理、发卡行认证 |
95 | 终端验证结果 TVR | 0000048000 | 只置了两个位:字节 3 b3「联机 PIN 已输入」、字节 4 b8「交易超过底限」——没有任何失败,只是必须联机 |
9A | 交易日期 | 260810 | YYMMDD:2026-08-10,与 DE13 一致 |
9C | 交易类型 | 00 | 消费——DE3 前两位在 EMV 层的孪生兄弟 |
5F2A | 交易货币代码 | 0840 | 美元,与 DE49 一致 |
9F02 | 授权金额 | 000000002500 | 25.00——必须与 DE4 相符,因为这个金额参与了密文计算 |
9F10 | 发卡行应用数据 IAD | 06010A03A00000 | 发卡行私有块(CVN、CVR……),布局因发卡行/卡组而异 |
9F1A | 终端国家代码 | 0840 | 终端在美国 |
9F26 | 应用密文 | A1B2C3D4E5F60718 | ARQC 本体——合成的 8 字节;真实值是对 9F02、9F37、ATC 等数据算出的 MAC |
9F27 | 密文信息数据 CID | 80 | 声明密文类型:ARQC——请求联机授权 |
9F33 | 终端性能 | E0F8C8 | 支持手输/磁条/芯片;支持 PIN、签名、免验证;具备 SDA/DDA/CDA 能力 |
9F34 | 持卡人验证结果 CVM | 020000 | 联机加密 PIN,结果「未知」——验它的是发卡行,不是终端 |
9F36 | 应用交易计数器 ATC | 003C | ATC = 60:这颗芯片的第 60 笔交易 |
9F37 | 不可预知数 | 1A2B3C4D | 终端出的随机挑战值,被绑进 ARQC |
一个值得重复的结构要点:就算报文其余部分是文本,DE55 也是二进制 TLV。在本页的 ASCII 表示里它以十六进制字符出现、长度前缀数字符(174);在真实的 BCD/二进制链路上前缀数的是字节(87)。这一步搞错,DE55 之后的每个域都会错位。
搜"ISO 8583 示例报文"搜到的片段,贴进任何解析器十有八九失败。几乎总是这四个原因之一,按顺序排查:
0200 在 ASCII 里是 30323030,压缩 BCD 里是 0200,EBCDIC 里是 F0F2F0F0。用错约定去读,后面每个边界都错。如果你拿到的十六进制串里满眼 F0…F9,先怀疑 EBCDIC;如果金额正好错位一半,先怀疑把 ASCII 当成了 BCD。本页的样例从构造上就避开了这四条:无头、单一编码、无空白。想现场看看失败长什么样?随便拿上面一条,删掉中间任意一个字符,重新解析。
以上全部是纯 ISO 8583:1987:标准域、标准格式、不带任何网络私有扩展。真实的 Visa、Mastercard、银联、Amex 报文建在同一副骨架上,但恰好在这些示例保持沉默的地方分道扬镳——私有域(DE48、DE60–63、DE120–127)、报文头、编码约定。同一个 MTI 0100 在哪儿都是授权请求;DE48 里装什么则各家各的。所以:用这些样例学结构,私有域布局以你对接端的接口规范为准——任何公开示例都替代不了它。「同是 ISO 8583 为什么解析口径不同」另有一篇细讲:各卡组报文差异。