8583报文示例
8583报文构成
长度 + 报文头【TPDU + msgHead + msgType(报文/消息类型)】 + 位图 + 各数据域
银联8583签到报文示例
报文为:
0063600049000060320032050108000020000000C0001600007431323334353637383132333435363738393132333435360011000000000030003753657175656E6365204E6F32343934393130303030303130343138313243413835393239310003313233
在实际传输报文中,传输的是byte数组,这里用16进制来表示byte数组
其中,各字段的详细数据如下:
长度:0063
报文头:
- TPDU:6000490000
- msgHead:603200320501
- msgType(报文/消息类型):0800
- 位图:0020000000C00016
数据域: 00007431323334353637383132333435363738393132333435360011000000000030003753657175656E6365204E6F32343934393130303030303130343138313243413835393239310003313233
8583手动组包
银联签到报文规范
下图为银联3des签到报文格式说明:
3des签到,即我们将一段报文(byte数组)发送给服务端(这里用的是Poster模拟器),然后服务端进行验证,若验证通过,会下发工作秘钥。而发送的这段报文,需要进行8583组包,组包的数据,通常给到的是String类型(也有可能不是),需要将其转化成byte数组传给服务端,而各个数据域转byte数组会有不同规则。
8583报文数据类型
这里数据类型分为三种:BCD、ASCII、BINARY
数据长度的类型也分为三种:定长、LLVAR不定长、LLLVAR不定长
详细属性的解释见(8583各数据域属性说明https://download.youkuaiyun.com/download/weixin_40582843/11169088)
银联3des签到报文组包
数据源
现在开始对银联3des签到报文组包,所用到的字段有(这里只用必须的字段,即上图所示请求格式中标识为M的字段):
长度:未计算
TPDU:6000490000
msgHead:603200320501
msgType(报文/消息类型):0800(银联签到报文格式中,0800代表签到请求)
位图:未计算
各数据域:
- 11域:“000074”
- 41域:“12345678”
- 42域:“123456789123456”
- 60域:“00000000003”
- 62域:
“53657175656E6365204E6F3234393439313030303030313034313831324341383539323931” - 63域:“123”
组包
数据域
-
11域,类型为BCD,属性为n6,压缩时用BCD码表示3个字节的定长域(注:这里的BCD类型,表示出现的‘字符’只会在0-9之间,定长,表示固定长度为6位,即n后的数字6)
- 即“000074”转为byte数组后,用16进制表示为{0x00,0x00,0x74},为3个字节;
- 查ascii码表,可以知道“7”用二进制表示为“0011 0111”,“4”用二进制表示为“0011 0100”,这里“74”两个字符便是2个字节了,去掉前4位,用二进制表示为“0111 0100”,用16进制表示为0x74,即为一个字节;
- “000074”转化后,便是0x00,0x00,0x74,去掉0x前缀后表示为000074
-
41域,类型为ASCII,属性为ans8,表示8个字节的定长字符域
- 查ascii码,可知"12345678"转为16进制表示为{0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38},刚好8个字节,去掉0x前缀后为,3132333435363738
-
42域,类型为ASCII,属性为ans15,为15个字节的定长字符域,表示为313233343536373839313233343536
-
60域,类型为BCD,属性为n…017,格式为LLLVAR,表示长度最大为17个字节的不定长字符域
- “00000000003”,长度为11位,用BCD码表示时,长度需为偶数,可以选择左靠右补0或右靠左补0的方式(看业务需求),我使用的poster模拟器中,要求此数据域为左靠右补0,补0后数据为“000000000030“,类比11域的转化,最后的数据用16进制表示为000000000030;
- 但此数据域为LLLVAR不定长域,需要在数据前用2个字节表示其长度,这里的长度为未补0之前的长度,即11,(长度为BCD的类型,不够3个字节时右靠左补0),最终结果为0011;
- 即60域最终数据为0011000000000003;
-
62域,类型为BINARY,属性为b…084,格式为LLLVAR,表示长度最大为84字节的不定长字符域
- 一般类型为BINARY时,传过来的数据都是byte数组了,这个例子中,用16进制表示byte数组为,“53657175656E6365204E6F3234393439313030303030313034313831324341383539323931”,不需要转换(因为8583报文传输的便是byte数组)
- 由于是不定长,这里byte数组长度为37,长度压缩时用BCD码表示2个字节,转化后为0037
- 即62域最终数据为003753657175656E6365204E6F3234393439313030303030313034313831324341383539323931
-
63域,类型为ASCII,属性为ans…003,格式为LLLVAR,为最多3个字节的不定长字符域
- 最终数据为0003313233
各数据域连起来的结果为:
00007431323334353637383132333435363738393132333435360011000000000030003753657175656E6365204E6F32343934393130303030303130343138313243413835393239310003313233
位图
位图的定义:
在所有的报文中都需要主位元表。它决定消息中包含了哪些数据字段。这些位是从左向右解释的,“1”表示该字段在消息中出现,“0”则表示未出现,第n位指示第n个数据字段。
如果第一位设置为“1”,表示有扩展位元表。
只有当消息中出现第65-128数据字段时,扩展位元表才出现。扩展位元表的描述和主位元表的描述一致。
在此签到报文中,最多只有64域,故无扩展位元表,且主位元表的第一位应设置为0,其他位,若有该字段,则设置为1,否则设置为0,故11,41,42,60,62,63位需设置为1,其它位设置为0
位元表用二进制表示为100000000000000000000000000000110000000000000000010110
转为16进制表示为0020000000C00016<