8583报文(转)
1 8583报文
1.1 数据包格式
ISO 8583金融交易信息数据包由信息类型(MSG_TYPE_ID)、一个或多个位图(BIT_MAP)和按位图描述的顺序排列的数据元序列(ELEMENTS)等三段组成。
信息类型是一个4位数字的数字型字段,用来描述每一个交易信息的类别和功能,其中前两位数字标明信息类别,如授权信息、金融交易信息、管理信息,等等。在一个金融系统中,信息类型的定义应该是唯一的,无二义性的。网间交易具有不同的信息类型定义时应在交换报文的发送前和接收后完成类型转换处理。
位图由64位二进制比特位构成,每一位用1或0来表示与该比特位相对应的数据元存在或不存在。位图的第一位为1时,表示64位的位图后紧接着一个扩展的64位位图。本实施规范未使用扩展位图。
数据元指交易中一个数据项的实际内容,数据元在数据包中是否存在及存放位置由位图中的相应比特位确定。一些数据元有固定的长度,一些数据元为变长项。具有可变长度类型的数据元应在实际数据之前附加标明长度的前缀字节。
1.2 符号定义
本规范使用以下标识符来说明数据元的属性:
1.2.1 一般描述
标志符 |
说 明 |
a |
纯字母字符 |
n |
纯数字字符 |
an |
字母和数字字符 |
ans |
字母、数字和特殊字符 |
z |
磁道上第二磁道和第三磁道数据 |
b |
二进制数据(按比特计数) |
1.2.2 长度属性
标志符 |
说 明 |
数值 |
固定长的数据元 |
..数值 |
可变长度数据元,本规范所规定的最大长度 |
LLVAR |
表示该字段包含两个标明其长度在1-99 之间的子字段,“LL”表示数据长度 |
LLLVAR |
表示该字段包含三个标明其长度在1-999 之间的子字段,“LLL”表示数据长度 |
1.2.3 数据元值
ASCII 表示该字段采用ASCII码表示,长度按字节计。
BCD 表示该字段采用BCD码表示,即每四比特位表示一数据位。
BIN 二进制数据,长度按比特位表示。
1.2.4 数据属性
标志符 |
说 明 |
M |
必选项 |
ME |
强制相等返回项 |
O |
可选项 |
C1 |
按键时有该项 |
C2 |
刷卡时有该项 |
16 |
若请求存在时,响应必存在 |
C3 |
配密码键盘时有该项 |
1.2.5 数据项使用规则
a)所有独立的数据项按整字节计算。
b)以BCD码(Binary Code Decimal)表示的n型数据项,奇数长度(固定长度)n型数据项以字节边界右靠,左填0;例1234567表示为01234567共4个字节。可变长度n型数据(如主帐号域)以字节边界左靠,右填0;例:1234567表示为1234570共4个字节。
c)可变长度数据项的长度域,以独立数据项n型数对待。例LL表示为ll一个字节,LLL表示为0lll共2字节。
d)z型数据项与n型数据项类似,为16进制数据。
e)ans或an数据项为ASCII字符或二进制数据。
1.2.6 位图
消息的第二个部分是一个或两个位图,每个位图由64位(bit)组成,位图中的每一位用于表明消息中对应的数据域是否出现(1)或不出现(0)。如果有第二个位图,则主位图(第一个位图)的第一位bit01必须是1。
下面表示第一个位图的情况:
位 1 |
位2 |
位 3 |
位 4 |
... |
位 64 |
域1 ‘0’ |
域2 主帐号 |
域3 处理码 |
域4 交易金额 |
域... |
域64 消息认证码 |
下面表示包含有两个位图的情况:
位 1 |
位2 |
位 3 |
位 4 |
... |
位 64 |
域1 ‘1’ |
域2 主帐号 |
域3 处理码 |
域4 交易金额 |
域... |
域64 消息认证码 |
位 65 |
位66 |
位 67 |
位 68 |
... |
位 128 |
域65 ‘0’ |
域... |
域... |
域... |
域... |
域128 消息认证码 |
每个报文信息必须包含主位图,但是只有在第66域到128域之间的域存在,第二个位图才被包含。
1.3 解8583实例
有ISO8583报文如下(十六进制表示法):
60 00 03 00 00 60 31 00 31 07 30 02 00(TPDU,报文头,应用数据) 30 20 04 C0 20 C0 98 11(位图) 00 00 00 00 00 00 00 00 01 00 03 49 02 10 00 12 30 62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00 35 36 38 35 32 33 31 34 32 33 35 32 31 34 35 32 36 38 35 39 32 33 36 31 35 36 C6 24 83 4D 36 7E 9E 9E 20 00 00 00 00 00 00 00 00 13 22 00 00 08 00 05 00 36 37 41 32 32 39 39 41
1.3.1 第一步
POS终端上送POS中心的消息报文结构包括TPDU5个字节、报文头六个字节和应用数据2个字节三部分:
——TPDU说明:长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。
——应用数据说明:一般长度都是4个字节,压缩时用BCD码表示为2个字节的长度的数值。 所以上述报文中前五个字节为TPDU,即60 00 03 00 00
报文头占用六个字节,即 60 31 00 31 07 30应用数据占用2个字节,即 02 00 也就是"0200"
1.3.2 第二步
分析位图:
首先取第十四个字节,即0x30 ,转化为二进制为0011 0000,在该字节的第一位为0(从左往右)表示当前报文中只需包括64个域,也就是从当前字节开始连续8个字节为位图(包括当前字节),如要包括128个域,该位为1。
现在进入关键的位图分析,现在我们取到了表示位图的8个字节即30 20 04 C0 20 C0 98 11,
转为二进制:
00110000 00100000 00000100 11000000 00100000 11000000 10011000 00010001
位图中为1的位置即代表相应的域,在上面的二进制位中从左往右有第3位、第4位、第11位、第22位、第25位、第26位、第35位、第41位、第42位、第49位、第52位、第53位、第60位、第64位。
下面开始这些域中的数据,首先分析3域,3域为交易处理码,压缩成BCD码后占定长3个字节,我们从位图所占的8个字节后开始连续取3个字节,即 00 00 00,解压后即为“000000”,具体代表含义这里就不叙述了。
4域为交易金额,压缩成BCD码后占定长6个字节,同理取6个字节,即00 00 00 00 00 01,也就是金额0.01元,具体转换参考规范。
11域为受卡方系统跟踪号(流水号),压缩成BCD码占定长3个字节,同理取3个字节,即00 03 49,即000349。
22域为服务点输入方式码,压缩成BCD码占定长2个字节,同理取2个字节,即02 10,由于22域本身只占3个字节,压缩时左靠,右补0,所以转换为“021”,具体含义不再叙述。
25域为服务点条件码,压缩成BCD码占定长1个字节,同理取1个字节,即00,转换为“00”,“00”代表正常提交。
26域为服务点PIN获取码,压缩成BCD码占定长1个字节,同理取1个字节,即12,转换为“12”,表示服务点设备所允许输入的个人密码明文的最大长度为12。
解下来的35域由于不是定长,所以处理方法不同,先取一个字节,即30,转换为“30”,表示第二磁道的数据占用30个字节,取连续15个字节即62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00,这里不对这串数据进行说明了。
41域为受卡机终端标识码,占8个字节的定长域,取35 36 38 35 32 33 31 34。
42域为受卡方标识码,占15个字节的定长域,取32 33 35 32 31 34 35 32 36 38 35 39 32 33 36。
49域为交易货币代码,占3个字节的定长域,取31 35 36。
52域为个人标识码数据,占8个字节的定长二进制数域,取C6 24 83 4D 36 7E 9E 9E。
53域为安全控制信息,压缩成BCD码占8个字节定长域,取20 00 00 00 00 00 00 00。 60域为自定义域,为不定长域,先取长度(压缩成BCD码占两个字节),即00 13,转换为13即占60域占13个字节,压缩成BCD码占7个字节,取22 00 00 08 00 05 00。
64域为报文鉴别码,占定长8个字节,取最后八个字节36 37 41 32 32 39 39 41。