粗略解释8583金融报文
注意:(此文章是以小白之眼来看的,如有资深人士发现错误欢迎指正交流)
8583协议是基于ISO8583报文国际标准的包格式的通讯协议,主要是用来解决金融系统之间的报文交换的,说白了就是信息数据的传递。一般使用的是64域报文,最长到128域。
首先明白8583报文细分来有6个部分:
长度 | TPDU | 报文头 | 消息类型 | 位图 | 数据(8583) |
在说报文之前要了解两个东西
(1)BCD码:二进码十进数,用4位二进制数来表示1位十进制数中的0~9这10个数码。
如:BCD码表示TPDU 6000160000 "60h,00h,16h,00h,00h"(5个字节).
ASCII码:ASCII大家一定都很了解,在报文中多次使用的ASCII码,现将数据对照ASCII码表转换成ASCII码,再转换成16进制数,就是最终数据。
如:ASCII码表示TPDU 6000160000 用ASCII码表示6对应54,1对应49,0对应48 将其转换为16进制可表示为"36h,30h,30h,30h,31h,32h,30h,30h,30h,30h"(10个字节).
到此应该对这两种编码有所了解,在报文中两种码都有使用到
理解说明还是直接拿例子说事,更加明了
如例:
0080600016000060220000000002007020000020C0820019062051320000000261206000000000000200000000733706205132000000026120d191120100000000003030303031313131313032323530313533313131313131015600449f260892b6ae9a9b102ed69f2701809f101307010103a0a010010a010000001037513a22be
长度说明:长度指的是TPDU+报文头+消息类型+位图+数据的总长度。
如:0080 就表示这段报文的长度,是使用16进制数表示的0076(16进制)--123(10进制)---128个字符---256字节
TPDU说明:长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。(每个银行,对应的TPDU值各不相同,接入银行时,相应的银行会提供相应值的)
如:6000160000
报文头说明:总长度为12字节,压缩时用BCD码表示为6个字节长度的数值。
如:60 22 0 0 000000
磁条卡金融支付类应用为:60
软件版本号 22
终端状态 0(正常交易状态)
处理要求 0(无处理要求)
保留使用 000000
消息类型说明:0200(只是截取了一部分便于理解,了解更多的话,去查查资料)
0200/0210 金融类请求/应答报文
余额查询请求/应答
取现请求/应答
存款请求/应答
存款撤销请求/应答
位图说明:bit map域, 指示哪些域存在, 容易计算出, 位图是使用16进制数表示的,最终转为2进制,可以看出哪些域中存在数据。
70 20 00 00 20 C0 82 00
将位图转化为二进制为:
0111000000100000000000000000000000100000110000001000001000000000
第几位中存有数据则改为表示为1,使用64时第一位为0,当使用延长域是第一位表示为1也就是128域
所以上面的位图中几个域存在:2, 3, 4, 11, 35, 41, 42, 49, 55.
数据说明:
<19 06 20 51 32 00 00 00 02 61 20>
field 2, 账号, n..19, LLVAR, 一字节表示长度(19), 账号是19位, 前面补0后, 用10字节BCD表示.
2域是BCD表示的,所以实际存在2域中的数据是19位,但是在存储时是BCD码所以在末尾补0,截取的时候需要截取20位。
<60 00 00>
field 3, 处理码, n6, 定长, 用3字节BCD表示
<00 00 00 02 00 00>
field 4, 交易金额, n12, 定长, 用6字节BCD表示, 这里的金额是200.00元
<00 00 73>
field 11, 流水号, n6, 定长, 用3字节BCD表示.流水号为"000073".
<37 06 20 51 32 00 00 00 02 61 20 d1 91 12 01 00 00 00 00 00>
field 35, 二磁道数据, z..35, LLVAR, 一字节表示长度(37), 后面是19字节BCD表示的磁道数据
<30 30 30 30 31 31 31 31>
field 41, 终端号, ans8, 定长, ASCII表示, 这里终端号为"00001111"
<31 30 32 32 35 30 31 35 33 31 31 31 31 31 31>
field 42, 商户号, ans15, 定长, ASCII表示, 这里商户号为"102250153111111"
<01 56>
field 49, 货币代码, n3, 定长, 前面补0后,用两字节BCD表示, 这里货币代码为"156"
<00 44 9f 26 08 92 b6 ae 9a 9b 10 2e d6 9f 27
01 80 9f 10 13 07 01 01 03 a0 a0 10 01 0a 01
00 00 00 10 37 51 3a 22 be>
field 55, 这是IC卡交易的相关数据, 最大长度是255, 这一域用的IC卡数据一般在PBOC/EMV规范里
都有自己的定义(包括格式), 所以,一般在报文里的格式跟它们在PBOC/EMV里定义的一致.一般是TLV(tag+lenght+value)表示一个数据.简单介绍一下数据的意义.
"00 44":长度, 表示44个字节
"9f 26 08 92 b6 ae 9a 9b 10 2e d6":应用密文(application cryptogram), TLV, b8
"9f 27 01 80":密文信息数据(cryptogram information data), TLV, b1
"9f 10 13 07 01 01 03 a0 a0 10 01 0a 01 00 00 00 10 37 51 3a 22 be":
发卡行应用数据(issuer application data), TLV, 变长,最大32字节. b..32.
最后想要说明:8583报文128域中的数据存储方式有四种分别是:1-int,2-binary 3-ASCII码/*一个ascii码占两个偏移量 长度*2
当存储方式为ASCII时,数据的长度需要*2,当为变长域时,存储的长度也是长度的1/2,这是针对组成代码来说的。
目前我的理解就这么多,通俗易懂的写出来。
如有不明白或者需要解析合成代码的私聊我。