ISO 8583 Parser
免费 · 速查 · 约 12 分钟 · 最后更新 2026-08-21

ISO 8583 是什么

ISO 8583 是银行卡系统之间互相通信用的报文格式。 刷一次卡,一条 ISO 8583 报文会从终端走到收单方,再经卡组织送到发卡行,由发卡行回答同意还是拒绝。 一条报文由三部分组成:四位 MTI 说明这是什么类型的报文,位图说明哪些域出现了, 然后是数据域本身。下面这些内容都在本页讲完——结构、一条拆解到位的示例报文、以及查码值用的各张表。
本页内容: ISO 8583 到底是什么 · 一条报文长什么样 · 拆一条真实报文 · 实际会碰到的那几个域 · 各类码表 · 各家实现不一样的地方 · 常见问题

ISO 8583 到底是什么

它是一份关于银行卡交易报文的国际标准。它描述的不是网络、不是接口、也不是产品,而是「字节该怎么排」——好让两个从没打过交道的系统,对同一条支付请求的含义达成一致。这也是一份 1987 年的标准至今还承载着全世界大部分卡交易的原因:格式活得比所有建在它上面的技术都长。

它有 198719932003 三个版本,你最可能遇到的还是 1987 版。版本之间的差别在于有哪些域、某些域多宽,所以版本不是无关紧要的细节:同样的字节在两个版本下可以解出不同结果。MTI 的第一位就告诉你这是哪一版。

几乎没人跑纯粹的 ISO 8583。Visa、Mastercard、各国本地转接机构都有自己的一套:域号相同,但私有域各填各的、各自还有额外的码值,有时字符编码也不一样。标准给的是信封,卡组织的规范才告诉你信里写了什么。两者说法不一致时,以你手上那份接口规范为准。

一条报文长什么样

从左往右分三段读。

1. MTI——四位数字,说明这是什么报文

每一位各管一件事:

位置含义取值举例
第 1 位版本0 = 1987、1 = 1993、2 = 2003
第 2 位报文类别1 授权、2 金融、4 冲正、8 网络管理
第 3 位报文功能0 请求、1 响应、2 通知、3 通知响应
第 4 位报文来源0 收单方、2 发卡行、1/3 同上但是重发

所以 0100 是 1987 版、收单方发出的授权请求,0110 是它的响应。0400 是冲正请求,0800 是签到、心跳这类网络管理报文。把四位分开读,比背一张 MTI 清单快得多。

2. 位图——这条报文里有哪些域

位图是 64 个二进制位,通常写成 16 个十六进制字符。n 位是 1,就表示第 n 个数据域出现了,按域号从小到大排列;没出现的域就是真的不在报文里,不补位、不留占位符。这就是这个格式的诀窍:不需要额外的结构说明也能很紧凑,因为位图本身就是结构说明

第 1 位是特殊的:它不表示 DE1,而表示后面还跟着第二个位图,把范围扩到 DE128。第 1 位是 0 的话,报文到 DE64 就结束,位图也只有 16 个十六进制字符。

位图相关的问题大多出自两个地方:从 0 开始数位,以及忘了位图可能是 8 个原始字节而不是 16 个十六进制字符。两种情况都会让后面的域整体错开一位。

3. 数据域——值本身

每个域要么是定长,要么自己带长度前缀:

类型前缀怎么读
FIX没有取正好声明的那么多个字符。DE4 永远是 12 位。
LLVAR2 位先读两位当长度,再取那么多个字符。那两位不属于值本身。
LLLVAR3 位同理,长度占三位。用在可能超过 99 个字符的域上,比如 DE55。

声明的长度算的是值的字符数,而不总是字节数:Hex/BCD 下两个数字压进一个字节,而二进制域的长度按字节还是按位算,取决于具体规范。解析器出现「一个域一个域地往后错」时,先查长度的单位。

拆一条真实报文

下面是一条完整的授权请求,用的是测试卡号和占位终端号,不含任何真实持卡人数据。

010072200000008080001641111111111111110000000000000010000821143000123456TERM0001702

从左往右拆开:

字节读出来是什么
0100MTI1987 版、授权、请求、来自收单方
7220000000808000位图第 2、3、4、7、11、41、49 位是 1——这七个域按此顺序跟在后面。第 1 位是 0,所以没有第二个位图。
16 4111111111111111DE2 卡号LLVAR:16 是长度,后面 16 位才是卡号
000000DE3 处理码消费,付方和收方账户都未指定
000000001000DE4 金额1000 个最小货币单位。结合 DE49 = 702(新加坡元,两位小数)就是 10.00 新元
0821143000DE7 传输时间8 月 21 日 14:30:00 GMT。域里不带年份。
123456DE11 系统跟踪号收单方当天用的流水号
TERM0001DE41 终端号只在这个商户内部唯一,不是全局唯一
702DE49 币种新加坡元的 ISO 4217 数字码

注意:DE49 没读之前,DE4 是没有含义的。先币种、后金额这个顺序,是金额差出一百倍最常见的来源。

上面这条报文可以直接粘进首页的解析器,看它逐域拆开。

实际会碰到的那几个域

一共有 128 个数据域,但实际工作中的问题几乎都集中在这十来个上:

名称为什么总被问到
DE2卡号前 6–8 位决定路由给哪家发卡行;日志里一律掩码。
DE3处理码是消费还是取现,决定计价、额度和利息。
DE4交易金额最小货币单位、无小数点。不看 DE49 就没有含义。
DE11系统跟踪号只在当天、只在该收单方范围内唯一,会回绕重用。
DE22输入方式卡是怎么读进来的,牵涉责任划分。
DE37检索参考号整个交易生命周期不变,对账时实际可用的关联键。
DE39响应码00 是成功,其余都是原因。
DE41/DE42终端号 / 商户号交易发生在哪,也是持卡人发起争议时针对的对象。
DE49币种决定 DE4 的小数位。要先读它。
DE55芯片数据TLV 格式的芯片数据——芯片交易被拒的原因就在这里面。

域字典里有全部 128 个域的长度、格式和说明。

各类码表

ISO 8583 的工作大部分不是解析报文,而是查某个值是什么意思。值得存下来的几张表:

各家实现不一样的地方

有四个地方,标准到此为止、接下来得看别人的文档。每一个都让人花过一整周。

常见问题

ISO 8583 现在还在用吗?

在用,而且全世界绝大部分卡授权流量都走它。ISO 20022 在账户间转账和实时支付上增长很快,一些卡组织也在迁移,但卡这条线上跑的还是 8583,未来若干年也还会是。两者是并存关系,不是谁取代了谁。

ISO 8583 和 ISO 20022 有什么区别?

8583 是按位置排布的紧凑字节,是为 1980 年代的线路设计的;20022 是 XML 或 JSON,数据模型丰富得多。8583 用少得多的字节表达少一些的信息,这正是它能在对时延敏感的卡组织网络上活下来的原因。它们是两种格式做部分重叠的事,不是同一个东西的两个版本。

做 ISO 8583 必须买那份标准吗?

基础结构——MTI、位图、域号、长度——不需要,这部分公开资料很充分,本站也讲了。但你的报文里真正出现的那些私有域和额外码值,得拿到你所在卡组织或处理机构的规范。那部分不公开,也推不出来。

解析器为什么解到几个域之后就错位了?

基本上都是长度单位或者编码问题:二进制域的长度按字节给、却当成字符读;Hex/BCD 的域被当成 ASCII 读;或者位图发的是 8 个原始字节、却按 16 个十六进制字符读。找到最后一个解对的域,查它的长度规则。

延伸阅读