65.9K
CodeProject 正在变化。 阅读更多。
Home

ISO 8583 入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (54投票s)

2010 年 8 月 7 日

CPOL

20分钟阅读

viewsIcon

576533

本文介绍了 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
辅助位图。存在则为 '1',否则为 '0'

字段 2
主账号 (PAN)

字段 3
处理码

字段 4
交易金额

 

字段 64
报文认证码 (MAC)
代码

一个报文至少包含一个称为主位图的位图,指示数据元素 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: 感谢阅读本文。感谢您的宝贵时间。阅读愉快。

 

© . All rights reserved.