ISO 8583 入门






4.85/5 (54投票s)
本文介绍了 ISO 8583 报文格式的基础知识。
引言
当我们使用信用卡/借记卡/ATM 卡时,数据会在系统之间传输。基于卡的交易通常需要在多个系统之间进行。例如,在商店进行的购买可能需要经过商户终端、收单网络或多个网络,最终到达持卡人账户所在的发卡行。交易会携带关于交易类型、使用的卡、商户、交易金额、安全信息等方面的信息。授权或拒绝交易的响应需要通过相同的路径返回到终端。
不同系统之间的数据交换需要遵循标准格式以实现集成、交换和互操作性。存在许多此类标准。在医疗保健行业,HL7、DICOM(医学数字成像和通信)是系统实现的协议;同样,在金融界,存在用于各种数据交换的标准(协议),如 ISO8583、ISO7816 等。ISO(国际标准化组织)是世界各国国家标准化机构的联合会。ISO 8593 是金融交易卡发起的、被广大支付行业(包括收单行和发卡行)采用的报文交换规范。该标准还可以进一步扩展,以支持 POS(销售点终端)和商户收单机构之间进行的交易。ISO 8583 规定了报文结构、格式和内容、数据元素以及数据元素的值。应用程序规范可以保留在私有级别(实施者),而结算所使用的报文(方法)不属于 ISO 的范畴。
持卡人发起的交易包括购买、取款、存款、退款、撤销、余额查询、支付和账户间转账。ISO 8583 还定义了用于安全密钥交换、总额核对和其他管理目的的系统间报文。
特别是,万事达卡和维萨卡网络都基于 ISO 8583 标准进行交易,其他机构和网络也一样。
ISO 8583 报文结构
ISO 报文由三个主要部分组成:报头、应用数据和报尾。报头和报尾包裹着应用数据,用于路由和报文完整性。应用数据包括 ISO 报文,其中包含报文类型指示符(MTI)、位图(指示存在哪些数据元素)和 ISO 数据元素(报文的字段)。
应用数据
字段 # | 描述 |
0 | MTI 报文类型指示符 |
1 - 位图 | 64(或 128)位,指示其他字段是否存在 |
2 - 128 | 位图中指定的其他字段 |
总体来说,我们可以将数据通过管道传输的顺序可视化,如下所示:
现在我们可以详细了解应用数据的不同组成部分。
报文类型指示符 (MTI)
这是一个 4 位数字字段,用于对报文的高级功能进行分类。报文类型指示符包括 ISO 8583 版本、报文类别、报文子类别和交易发起方。ISO 8583 标准的不同版本在报文类型指示符的第一个位置表示。
0xxx | ISO 8583:1987 版本 |
1xxx | ISO 8583:1993 版本 |
2xxx | 供 ISO 使用 |
3xxx | 供 ISO 使用 |
4xxx | 供 ISO 使用 |
5xxx | 供 ISO 使用 |
6xxx | 供 ISO 使用 |
7xxx | 供 ISO 使用 |
8xxx | 供国家使用 |
9xxx | 供专用使用 |
报文类别
报文类别 | 描述 |
x1xx | 授权报文 |
x2xx | 金融报文 |
x3xx | 文件操作报文 |
x4xx | 撤销和退单报文 |
x5xx | 对账报文 |
x6xx | 管理报文 |
x7xx | 费用收取报文 |
x8xx | 网络管理报文 |
x9xx | 供 ISO 使用 |
报文子类别
报文子类别 | 描述 |
xx00 | 请求,需要批准 |
xx10 | 对请求的响应 |
xx20 | 对已执行的操作的通知,无需批准但仍需要响应 |
xx30 | 对通知的响应 |
xx40 | 通知 |
xx50 – xx90 | 供 ISO 使用 |
第四位递增一表示重复请求(除了 x300 报文)。例如:1100 = 授权请求;1101 授权请求重复。
交易发起方
交易发起方 | 描述 |
0 | 收单行 |
1 | 收单行重复 |
2 | 发卡行 |
3 | 发卡行重复 |
4 | 其他 |
5 | 其他重复 |
6 - 9 | 供 ISO 使用 |
因此,通过了解 MTI 值,我们可以识别报文的类型。例如:如果 MTI 值为 1200,则从上表可以找到其他详细信息。第一位是版本号,MTI 中的值为 1,因此报文版本基于 ISO 8583:1993。第二位是报文类别,MTI 中的值为 2,因此该报文是金融报文。第三位是报文子类别/功能,MTI 中的值为 0,因此给定的报文是请求报文。第四位是交易发起方,MTI 中的值为 0,因此报文来自收单行。将所有这些综合起来,我们发现 MTI 值为 1200 的报文是由收单行发送的 ISO 1993 金融请求报文。
所以,如果进行总结,报文类别/类型是 (n4 - 4 位数字值) 是所有 ISO 8583 报文所必需的,以便识别报文类别,而报文类型可以是以下值之一(这是一个部分列表):
MTI | 描述 |
x100 | 授权请求 |
x101 | 授权请求重复 |
x102 | 授权完成确认 |
x103 | 授权完成确认重复 |
x110 | 授权响应 |
x112 | 授权完成响应 |
x120 | 授权通知 |
x121 | 授权通知重复 |
x122 | 授权通知完成确认 |
x123 | 授权通知完成确认报告 |
x130 | 授权通知响应 |
x132 | 授权通知完成响应 |
x200 | 金融请求 |
x210 | 金融响应 |
x220 | 金融通知 |
x230 | 金融通知响应 |
x300 | 收单行文件更新请求 |
x302 | 发卡行文件更新请求 |
x310 | 收单行文件更新响应 |
x312 | 发卡行文件更新响应 |
x320 | 收单行文件更新通知 |
x322 | 发卡行文件更新通知 |
x330 | 收单行文件更新通知响应 |
x332 | 发卡行文件更新通知响应 |
x400 | 收单行撤销请求 |
x402 | 发卡行撤销请求 |
x410 | 收单行撤销请求响应 |
x412 | 发卡行撤销请求响应 |
x420 | 收单行撤销通知 |
x422 | 发卡行撤销通知 |
x430 | 收单行撤销通知响应 |
x432 | 发卡行撤销通知响应 |
x5xx | 对账请求报文 |
x6xx | 管理请求报文 |
x800 | 网络管理请求 |
x810 | 网络管理请求响应 |
位图(s)
位图是一种在 ISO 8583 报文中用于指示数据元素是否存在技术的索引。数据元素在特定报文中是否存在由对应位置的 1 表示;0 表示数据元素在该位置不存在。每个应用程序交易都包含一个位图。位图由 64 位组成,从左侧开始编号,以位 1 开头。位图的第一个位代表辅助位图。如果任何 ISO 报文不支持辅助位图处理,则位图的第一个位为 '0'。
位 1 | 位 2 | 位 3 | 位 4 | … | 位 64 |
字段 1 | 字段 2 | 字段 3 | 字段 4 | 字段 64 |
一个报文至少包含一个称为主位图的位图,指示数据元素 1 到 64 的存在。
辅助位图可能位于数据元素一,因此主位图的第一个位告诉我们是否存在辅助位图。辅助位图指示数据元素 65 到 128 的存在。
在最新版本的 ISO 8583 标准中,一个报文最多可以包含三个位图。位图可以作为 8 字节(二进制)传输,有时也会将 8 字节解包成 16 个十六进制字符 1-9,A-F(ASCII)。
数据元素
数据元素是携带交易本身信息的字段。在原始 ISO 8583 (1987) 标准中最多有 128 个数据元素,在后来的版本中最多有 192 个数据元素。每个数据元素都有指定的含义和格式。ISO 8583 还包含一些通用数据元素和系统特定数据元素,它们被不同基于 ISO 8583 的标准以不同方式使用。
例如:位值 2 分配给主账号,3 分配给处理码,4 分配给交易金额,依此类推。位值 128 用于报文认证码字段。ISO 为每个数据元素指定了数据格式和大小。ISO 还指定了特定报文的哪些数据元素是必需的或可选的。
数据元素格式
ISO-8583 指定了不同种类的字段,主要分为以下几类:
• 固定长度
• 数字
• 字母数字
• 二进制
• 可变长度
• 最大长度 99
• 数字
• 字母数字
• 二进制
• 最大长度 999
• 数字
• 字母数字
• 二进制
• 嵌套报文
每个数据元素都有一个标准格式。这包括字段允许的内容(数字、二进制等)以及允许的长度。这通过在以下部分中描述的允许内容后跟长度的约定来表示。
字段类型属性
缩写 | 含义 |
a | 字母(包括空格) |
n | 仅数字值 |
s | 仅特殊字符 |
an | 字母数字 |
为 | 仅字母和特殊字符 |
ns | 仅数字和特殊字符 |
ans | 字母、数字和特殊字符 |
b | 二进制数据 |
z | 根据 ISO 7811 和 ISO 7813 定义的磁道 2 和 3 编码集 |
h | 十六进制数据 |
LL、LLL | 后续可变字段的长度。“LL” - 两位长度指示符(1 字节 BCD)“LLL - 3 位长度指示符(2 字节 BCD) |
..17 ..125
| 长度最多为 17 的可变字段。“..” 是一个两位长度指示符(1 字节 BCD),指定定义后面可变数据长度的数字位数。 长度最多为 125 个字符的可变字段。“…” 是一个三位长度指示符(2 字节 BCD),指定定义后面可变数据长度的数字位数。
|
数据元素可以具有固定长度或可变长度。长度指示符位于报文中可变长度字段之前。
固定长度数据元素
固定长度数据元素在 ISO 8583 标准中有定义长度,报文中不需要长度指示符。这些通过在允许内容后包含长度来表示,例如数据元素 3 的格式为 'n6',表示一个 6 位数字的固定长度字段。
可变长度数据元素
其他数据元素可能具有可变长度,并且长度指示符包含在报文中该数据元素之前。长度指示符本身具有定义的长度:例如,一位长度指示符仅足以满足长度从 1 到 9 的可变长度字段,而三位长度指示符可以支持高达 999 的字段值。
可变长度字段由两个点“..”后跟字段的最大长度表示。长度指示符由 'L' 字符数表示,对应于长度指示符的长度,例如数据元素 2 的格式为 n..19,LLVAR,表示一个最多 19 位数字的字段,带有一个 2 位长度指示符。
问题不在于复杂性,而在于多样性。ISO-8583 没有规定字段的表示方式,因此一个数字字段可以表示为 ASCII 字符序列、EBCDIC 字符、BCD 等。
可变长度字段有一个指定其长度的前缀,但其表示方式并未定义,不同的供应商使用不同的表示方式(例如 BCD、EBCDIC、二进制值)。
示例报文
[参考附录 A 关于数制基础知识]示例 1:0800 报文
# | 名称 | 值 | 十六进制值 |
0 | MTI | 0800 | 08 00 |
1 | 主位图 | 指示字段 3、11 和 41 的存在 | 20 20 00 00 00 80 00 00 |
3 | 处理码 | 000000 | 00 00 00 |
11 | 系统跟踪审计号 | 000001 | 00 00 01 |
41 | 收单行终端标识 | 29110001 | 32 39 31 31 30 30 30 31 |
这是我们的 0800 报文的二进制表示:
080020200000008000000000000000013239313130303031
在上面的例子中,0800 是报文类型指示符;第一位表示版本号。
• 0 表示 1987 版本
第二位是报文类别
• 8 表示网络管理
第三位是报文子类别/功能
• 0 表示请求
最后一位用于描述交易发起方
• 0 表示收单行
所以“0800”是 1987 年版本网络管理请求。
接下来是字段 1,主位图。
主位图
字节型 | 十六进制值 | 位值 | 字段 # |
0 | 20 | 0010 0000 | 3 |
1 | 20 | 0010 0000 | 11 |
2 | 00 | 0000 0000 |
|
3 | 00 | 0000 0000 |
|
4 | 00 | 0000 0000 |
|
5 | 80 | 1000 0000 | 41 |
6 | 00 | 0000 0000 |
|
7 | 00 | 0000 0000 |
所以我们已经解析了 MTI(0800)位图(2020000000800000),我们知道字段 3、11 和 41 存在,所以我们的下一个字段是编号 3。
在我们的示例中,字段 #3 使用 BCD 表示,因此值“000000”仅用三个字节表示,其值为“00 00 00”。字段 #11 的值“000001”也一样,表示为“00 00 01”。在我们的示例中,字段 #41 是一个 8 字节的字母数字字段,表示为 8 个 ASCII 字符。
报文: 08002020 00000080 00000000 00000001
32393131 30303031
MTI: 0800
位图: 20200000 00800000
字段 03: 000000
字段 11: 000001
字段 41: 3239313130303031 (ASCII 码表示 "29110001")
示例 2:另一个 0800 报文
# | 名称 | 值 | 十六进制值 |
0 | MTI | 0800 | 08 00 |
1.a | 主位图 | 指示存在辅助位图以及字段 3、11 和 41 | A0 20 00 00 00 80 00 10 |
1.b | 辅助位图 | 指示字段的存在 70 | 04 00 00 00 00 00 00 00 |
3 | 处理码 | 000000 | 00 00 00 |
11 | 系统跟踪审计号 | 000001 | 00 00 01 |
41 | 收单行终端标识 | 29110001 | 32 39 31 31 30 30 30 31 |
60 | 保留供专用 使用 | 测试报文 | 00 10 54 45 53 54 20 4D 45 53 53 47 |
70 | 网络管理信息代码 | 301 | 03 01 |
在上一个示例中,存在两个新字段 #60 和 #70。这是我们的报文表示:
报文: 0800A020 00000080 00100400 00000000
00000000 00000001 32393131 30303031
00105445 5354204D 45535347 0301
MTI: 0800
主位图: A0200000 00800010
辅助位图: 04000000 00000000
字段 03: 000000
字段 11: 000001
字段 41: 3239313130303031 (ASCII 码表示 "29110001")
字段 60: 0010 54455354204D45535347 (长度=10, 值="TEST MESSG")
字段 70: 0301
我们来解析一下这个位图:
主位图
字节型 | 十六进制值 | 位值 | 字段 # |
0 | A0 | 1010 0000 | 存在辅助位图以及 #3 |
1 | 20 | 0010 0000 | 11 |
2 | 00 | 0000 0000 |
|
3 | 00 | 0000 0000 |
|
4 | 00 | 0000 0000 |
|
5 | 80 | 1000 0000 | 41 |
6 | 00 | 0000 0000 |
|
7 | 10 | 0001 0000 | 60 |
辅助位图
字节型 | 十六进制值 | 位值 | 字段 # |
0 | 04 | 0000 0100 | 70 |
1 | 00 | 0000 0000 |
|
2 | 00 | 0000 0000 |
|
3 | 00 | 0000 0000 |
|
4 | 00 | 0000 0000 |
|
5 | 80 | 0000 0000 |
|
6 | 00 | 0000 0000 |
|
7 | 00 | 0000 0000 |
为了使开发者感到复杂,不同的供应商在处理奇数长度 BCD 字段时选择不同的填充样式。因此,为了表示“003”,一个供应商可能使用两个字节,值为“00 03”,而另一个供应商可能使用“00 30”。
可变长度字段也是如此,字段长度和字段值都可以右填充或左填充,这并未由 ISO-8583 定义,只是不同实现的实际情况。
然后是嵌套字段,某些实现使用“保留供专用使用”字段来携带其他 ISO-8583 报文。这些报文通常被打包为外部报文看到的可变长度二进制字段。
真实场景示例
真实的例子可以帮助我们理解在授权请求和响应期间交换的信息类型。
示例授权请求
字段 # | 描述 | 值 | 注释 |
0 | MTI | 0100 | 授权请求 |
2 | 主账号 (PAN) | 4321123443211234 |
|
3 | 处理码 | 000000 |
|
4 | 交易金额 | 000000012300 | 即 123.00 |
7 | 传输日期/时间 | 0304054133 | MMYYHHMMSS |
11 | 系统跟踪审计号 | 001205 |
|
14 | 到期日期 | 0205 | YYMM |
18 | 商户类型 | 5399 |
|
22 | POS 输入模式 | 022 | 刷卡 |
25 | POS 条件码 | 00 |
|
35 | 4321123443211234=02051 | 2312312332 | 磁道 2 |
37 | 检索参考号 | 206305000014 |
|
41 | 终端 ID | 29110001 |
|
42 | 商户 ID | 1001001 |
|
49 | 货币 | 840 | 美元 |
示例授权响应
字段 # | 描述 | 值 | 注释 |
0 | MTI | 0110 | 授权响应 |
2 | 主账号 (PAN) | 4321123443211234 |
|
3 | 处理码 | 000000 |
|
4 | 交易金额 | 000000012300 | 即 123.00 |
7 | 传输日期/时间 | 0304054133 | MMYYHHMMSS |
11 | 系统跟踪审计号 | 001205 |
|
14 | 到期日期 | 0205 | YYMM |
18 | 商户类型 | 5399 |
|
22 | POS 输入模式 | 022 | 刷卡 |
25 | POS 条件码 | 00 |
|
35 | 4321123443211234=02051 | 2312312332 | 磁道 2 |
37 | 检索参考号 | 206305000014 |
|
38 | 授权号 | 010305 |
|
38 | 响应码 | 00 | 已批准 |
41 | 终端 ID | 29110001 |
|
42 | 商户 ID | 1001001 |
|
49 | 货币 | 840 | 美元 |
传输协议
一旦我们有了给定 ISO-8583 报文的二进制表示,我们就必须使用某种通信协议(例如 TCP/IP、UDP/IP、X.25、SDLC、SNA、ASYNC、QTP、SSL 等)通过网络传输它。
ISO-8583 不定义任何通信协议;因此,不同的供应商选择了不同的协议。许多实现(尤其是旧的实现)需要支持某种路由信息(例如 CICS 事务名称),因此它们使用不同类型的报头。其中一些(尤其是基于流的)也需要某种报尾。
传输协议由以下部分组成:
• 可选报头
• ISO-8583 报文数据
• 可选报尾
基于 TCP/IP 的实现可能使用几个字节来指示报文长度,因此前面描述的 0800 示例将发送为:
00 46 08 00 A0 20 00 00 00 80 00 10 04 00 00 00
00 00 00 00 00 00 00 00 00 01 32 39 31 31 30 30
30 31 00 10 54 45 53 54 20 4D 45 53 53 47 03 01
0046 是以网络字节序表示的报文长度。
但这只是一种指定报文长度的方式,其他实现可能选择发送四个 ASCII 字节,例如:
30 30 34 36 08 00 A0 20 00 00 00 80 00 10 04 00
00 00 00 00 00 00 00 00 00 00 00 01 32 39 31 31
30 30 30 31 00 10 54 45 53 54 20 4D 45 53 53 47
03 01
30303436 是“0046”的 ASCII 表示。
其中一些对这些报头进行了奇怪的操作,标记拒绝的报文(例如,你发送一个 0100,但没有收到一个带有合适响应码的 0110,而是收到了你自己的 0100,报头中带有某种专有标志,指示例如暂时性失败,如目标不可达)。
结论
ISO8583 有许多不同的实现,以及许多本地变体。尽管 ISO 8583 定义了一个通用标准,但它通常不直接被系统或网络使用。相反,在不同的交易网络上存在许多不同的标准,所有这些标准都基于 ISO 8583,但具有专有变体。
附录 A
数制
数制的基本值是集合在重复之前具有的不同值的数量。例如,十进制有一个基数,即 0 到 9 的 10 个值。不同的数制及其基值如下:
- 二进制 = 2 (0, 1)
- 八进制 = 8 (0 - 7)
- 十进制 = 10 (0 - 9)
- 十二进制 = 12 (罗马人用于某些目的)
- 十六进制 = 16 (0 - 9, A-F)
- 二十进制 = 20 (玛雅人使用)
- 六十进制 = 60 (巴比伦人使用)
二进制数制在计算机中常用。详细讨论请参阅任何基础计算机科学书籍。
半字节 (Nibble)
半字节是四位一组,或一个字节(一个字节是 8 位)的一半。由于一个半字节包含四位,因此有十六种(24)可能的值,所以一个半字节对应一个十六进制数字(因此,它通常被称为“十六进制数字”或“hexit”)。一个完整的字节由两个十六进制数字表示。因此,通常将一个字节的信息显示为两个半字节。三组半字节可以称为三字节 (tribble)。在网络或电信上下文中,半字节通常称为半字节 (semioctet)。
BCD
二进制编码的十进制数字(0-9)使用四位表示。位的有效组合及其相应值如下:
二进制值 | 数字 |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
二进制组合 1010 到 1111 是无效的,不使用。
如果计算机每字节存储一个 BCD 数字,则称为普通 BCD。未使用的半字节可以是全 0 或全 1。
如果每字节存储两个 BCD 数字,则称为压缩 BCD。这发生在数据通过通信链路传输数字时。压缩 BCD 减少了传输数字所需的时间,因为传输的每个数据字节都发送了两个 BCD 数字。
考虑以压缩 BCD 格式存储数字 56。
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | < 位号 |
0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
|
MSB |
|
|
|
|
|
| LSB |
上半部分半字节存储值5,而下半部分半字节存储值6。因此,(56)10 的 BCD 等价物是 (0101 0110)BCD。
EBCDIC
EBCDIC(扩展二进制编码的十进制交换码)是一种 8 位字符编码。EBCDIC 是独立于 ASCII 开发的。EBCDIC 是一种 8 位编码,而 ASCII 是 7 位编码。单个 EBCDIC 字节占用八位,分为两个部分或半字节。前四位称为区域 (zone),表示字符的类别,而后四位称为数字 (digit),标识特定字符。
EBCDIC/ASCII 表等效
字符 | EBCDIC | ASCII | 字符 | EBCDIC | ASCII |
十六进制/二进制 | 十六进制/二进制 | 十六进制/二进制 | 十六进制/二进制 | ||
A | C11100 0001 | 41 0100 0001 | S | E21110 0010 | 53 0101 0011 |
B | C21100 0010 | 42 0100 0010 | T | E31110 0011 | 54 0101 0100 |
C | C3 1100 0011 | 43 0100 0011 | U | E4 1110 0100 | 55 0101 0101 |
D | C4 1100 0100 | 44 0100 0100 | V | E5 1110 0101 | 56 0101 0110 |
E | C5 1100 0101 | 45 0100 0101 | W | E6 1110 0110 | 57 0101 0111 |
F | C6 1100 0110 | 46 0100 0110 | X | E7 1110 0111 | 58 0101 1000 |
G | C7 1100 0111 | 47 0100 0111 | Y | E8 1110 1000 | 59 0101 1001 |
H | C8 1100 1000 | 48 0100 1000 | Z | E9 1110 1001 | 5A 0101 1010 |
我 | C9 1100 1001 | 49 01001 001 | 0 | F0 1111 0000 | 30 0011 0000 |
J | D1 1101 0001 | 4A 0100 1010 | 1 | F1 1111 0001 | 31 0011 0001 |
K | D2 1101 0010 | 4B 0100 1011 | 2 | F2 1111 0010 | 32 0011 0010 |
L | D3 1101 0011 | 4C 0100 1100 | 3 | F3 1111 0011 | 33 0010 0110 |
M | D4 1101 0100 | 4D 0100 1101 | 4 | F4 1111 0100 | 34 0011 0100 |
N | D5 1101 0101 | 4E 0100 1110 | 5 | F5 1111 0101 | 35 0011 0101 |
O | D6 1101 0110 | 4F 0100 1111 | 6 | F6 1111 0110 | 36 0011 0110 |
P | D7 1101 0111 | 50 0101 0000 | 7 | F7 1111 0111 | 37 0011 0111 |
Q | D8 1101 1000 | 51 0101 0001 | 8 | F8 1111 1000 | 38 0011 1000 |
R | D9 1101 1001 | 52 0101 0010 | 9 | F9 1111 1001 | 39 0011 1001 |
|
|
| 空格 | 40 0100 0000 | 20 0010 0000 |
示例
46 (十进制) = 101110 (二进制) = 2E (十六进制) = 0100 0110 (BCD) = 34 36 (ASCII) = F4 F6 (EBCDIC)
最后 remarks: 感谢阅读本文。感谢您的宝贵时间。阅读愉快。