不是,而且比较从第一步就错了。ISO 8583 定义的是一种报文格式:一个 MTI、一到两个位图、 最多 128 个带编号的数据域,用于卡发起的交易。整套规范一个人能装进脑子里。
ISO 20022 不定义任何一条报文。它定义的是一套数据字典和建模方法,存放在一个中央库里,
从中派生出许多互相独立的报文集。你实际要实现的是那些报文集,它们按族命名:pacs 是行间支付、
pain 是客户到银行的指令、camt 是账务报告,而卡域是 caaa、
cain 和 catm。
所以"从 ISO 8583 迁到 ISO 20022"不是一件事。它是每条链路各自一套报文集,每条链路按自己的节奏迁或不迁。
ISO 8583 自己也不是一个东西,而且这个分裂就发生在同一个卡组织内部。MTI 的第一位标的是版本,
而 Mastercard 自己的规范两版都在用:授权报文是 1987 版,所以以 0 开头 ——
0100、0200;清算报文是 1993 版,以 1 开头,比如 1240。
同一个卡组织、同一笔交易,两个版本的标准,而且两边的字段字典并不一致。这份对照在
授权与清算的差异里。
ISO 8583 靠位置识别字段。位图说明 128 个域里哪些出现,解析器按顺序往下走。报文本身不说明任何字段的含义 ——你需要规范,而且往往需要某个卡组织自己的那一版,这就是为什么"同一个标准"的两个实现之间通常还得有一份映射文档才能互通。
ISO 20022 靠名字识别字段,用 XML,嵌在结构里。报文自带标签,没见过规范的人也能大致看出一个值想表达什么。
| 同一样东西 | ISO 8583 | ISO 20022(卡域族) |
|---|---|---|
| 卡号 | DE2 | 卡片数据块里的 <PAN> |
| 金额与币种 | DE4 加 DE49,两个独立域 | 一个金额元素,币种作为属性挂在上面 |
| 响应码 | DE39 | 一个响应块,含结果与原因 |
| 输入方式 | DE22 | 读卡结构上的具名属性 |
| 报文类型 | MTI,四位数字 | 报文标识本身,例如 caaa.002 |
体积差异是这个设计的直接结果。一条紧凑的 ISO 8583 授权是几百字节,同样内容用 XML 加上元素名要几倍于此。 在每秒承载数千笔授权的链路上,这个比例是设计约束,不是细节。
在收单到发卡这条链路上没有,而大多数卡域工程就发生在这条链路上。Visa、Mastercard、银联的授权链路 跑的是各自的 ISO 8583 方言,现在仍然是。
ISO 20022 确实有卡域报文族,而且在某些地方是生产在跑的:
caaa —— 受理方到收单方。终端与收单机构之间的对话。cain —— 收单方到发卡方。如果哪天在这里被采用,它取代的就是 8583 方言。catm —— 终端管理。终端的配置下发与密钥分发。这几个标识不是我们定义的 —— ISO 20022 报文定义的完整目录由注册机构发布在 iso20022.org, 卡域族和支付族并列在那里。本页关于某个报文标识的说法如果对你要紧,去那里核。
主要在欧洲使用的 nexo 标准就建在这几族之上。所以一条欧洲的受理方到收单方链路可能已经是 ISO 20022, 而它后面那一跳收单到发卡仍然是 ISO 8583。关于同一笔交易的这两句话同时成立,这也是这个比较里大量混乱的来源。
是大额和跨境支付,不是卡。2025 年 11 月 22 日,Swift 上跨境支付的共存期结束, 原先承载这类流量的 MT 族不再满足 CBPR+ 的要求:
| 原来 | 现在 | 承载 |
|---|---|---|
MT103 | pacs.008 | 客户汇款 |
MT202 / MT205 | pacs.009 | 金融机构间划转 |
MT940 / MT941 / MT942 | camt.053 / camt.052 / camt.054 | 账务报告 |
还有一个已经定下的时点。从 2026 年 11 月 14 日起,CBPR+ 报文中完全非结构化的通信地址将被拒收, 而且没有兜底通道。只要你所在的机构还碰电汇,这一条是带截止日期的,卡这一侧则没有。
两种格式都有只在生产里才暴露、规范上看不出来的失效方式,而且不是同一批。
DE48 里装的是一样东西
还是十五个子域,取决于你在说谁的方言;长度前缀读偏一个字节,后面整条报文都变成噪声。
我们那篇解析失败的结构性原因把常见的几种走了一遍。
取决于你手上有哪几条,每条的答案都不一样。决定它的事实是这些:
上面没有说你该关心哪一条,只说了每种标准在哪里生效,你可以拿它对着自己的链路图核一遍。