参考 Demo:https://github.com/WTCool666/Iso8583/tree/master
一、【8583】ISO8583报文解析
ISO8583报文(简称8583包)又称8583报文,是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。
【报文格式】
POS终端上送POS中心的消息报文结构包括TPDU、报文头和应用数据三部分:
TPDU:长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。
报文头:总长度为12字节,压缩时用BCD码表示为6个字节长度的数值。
在POS上送的请求/通知报文中,该数值由POS终端应用程序在打包上送时根据POS终端参数和当前状态填入应用类别、软件总版本号、终端状态和软件分版本号(具体指各厂商的程序版本号),用于POS中心根据数值进行相应的处理。
在POS中心返回的应答报文中,由POS中心填入处理要求,其他域保持原值返回,POS将根据收到报文头中的处理要求进行相应处理。
ISO8583Msg:信息类型域(2字节)+位图域(一般8字节,如果使用到65~128域则为16字节)+报文数据域。
在线16进制转2进制:https://www.jyshare.com/unit-conversion/7997/
16进制到ASCII字符串在线转换工具:https://coding.tools/cn/hex-to-ascii#google_vignette
【示例】
8583报文大部分情况下用在POS终端与后台收单系统的数据交换,一般情况下一段完整的报文由以下几个部分组成:
[长度(2字节)] + [TPDU(5字节)]+[报文头(6字节)]+[8583数据]
例如,一个demo报文报文:
005A 6000160000 602200000000 0200 7020000020C08000 19062051320000000261206000000000000200000000733706205132000000026120d191120100000000003030303031313131313032323530313533313131313131015600
报文长度:00 5A=90个字节
TPDU:60 00 16 00 00
Header:60 22 00 00 00 00
ISO8583Msg:信息类型0200 + 位图7020000020C08000+ 各域数据。
由位图数据可得域是 2 3 4 11 35 41 42,再看规范中的各域信息定义可知:
0111000000100000000000000000000000100000110000001000000000000000
2 3 4 11 35 41 42
Len: 005a
TPDU: 6005010000
Head: 602200000000
MsgType: 0200
BitMap: 7020000020c08000
[field:2] [len:19] [06205132000000026120]
[field:3] [600000]
[field:4] [000000020000]
[field:11] [000073]
[field:35] [len:37] [06205132000000026120d19112010000000000]
[field:41] [3030303031313131]
[field:42] [313032323530313533313131313131]
[field:49] [015600]
二、报文结构
8583报文=信息类型域+位图域+报文数据域
前面10个字节的BCD码(也就是20个BCD码,亦是20个数字)表示报头,在上面报文中报头是<02 00 70 20 00 00 20 C0 82 00>
其中前面四个数字表示 信息类型(MTI),上面报文的信息类型是<02 00>
后面的16个BCD码为 位图域。上面报文的信息类型是<70 20 00 00 20 C0 82 00>
后面N个数字表示报文数据
1、信息类型<02 00>
其中每位数字都有他的含义。不做翻译
第一位:8583 version number
第二位:message class
第三位:message sub-class
第四位:transaction originator
2、位图域<70 20 00 00 20 C0 82 00>
开头不为1,则表示64位的位图。
将上面的位图转换成二进制,为:
111000000100000000000000000000000100000110000001000000000000000
不足64位,前面补0,为:
0111000000100000000000000000000000100000110000001000000000000000
现在看是数了,能够看出2、3、4、11、 35、 41、 42、 49这些位置是1.则表示在8583报文中,的2、3、4、11、 35、 41、 42、 49域是传输了数据的。
3、报文数据域
在解读数据域之前,你应该先了解报文的数据类型和代表符
三、8583报文的相关知识
位:二进制中,一个0或1,表示位
Bcd码:四个位表示一个bcd码(可以理解成八进制数中1位)
字节:八个位表示个字节(可以理解成十六进制数中1位)
N…x 代表数字类型 x代表位数 …代表变长,若x为技术,则自动补0,凑足一个bcd码
N4:4位定长数字
N6:6位定长数字
N…6:6位变长数字
AN…x AN代表数字或字母,用ANSCII码解析,;x代表位数; …代表变长
AN4:4位定长数字或字符
AN6:6位定长数字或字符
AN…6:6位变长数字或字符
ANS 代表数字、字母或特殊字符,用ANSCII码解析
ANS4:4位定长数字或字符、特殊字符
ANS6:6位定长数字或字符、特殊字符
ANS…6:6位变长数字或字符、特殊字符