8583组包解包及银联3des签到消费java示例

这篇博客介绍了8583报文的构成,包括长度、报文头、位图和数据域。重点讨论了银联8583签到报文的详细数据,并展示了如何手动进行8583报文组包,包括银联3DES签到报文的格式和数据类型的转换规则。此外,还提供了银联签到及消费的Java代码实例,帮助理解8583报文处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值