8583报文举例解读及推荐阅读

一、推荐阅读

https://www.cnblogs.com/fenglan/p/6088690.html

这篇博客生动形象的解释了8583报文,首先推荐给之前一点都不了解8583报文的同学。

然后参照了下面博客,尝试自己理解

https://blog.csdn.net/cbacq/article/details/51495593

若阅读了以上篇博客,还有不懂的,再来看看本文,看能否有一些收获。

若还有不懂的,则需要你来补充了。

 

二、一个完整的8583报文

02 00 70 20 00 00 20 C0 82 00 19 06 20 51 32 00 00 00 02 61 20 60 00 00 00 00 00 02 00 00 00 00 73 37 06 20 51 32 00 00 00 02 61 20 d1 91 12 01 00 00 00 00 00 30 30 30 30 31 31 31 31 31 30 32 32 35 30 31 35 33 31 31 31 31 31 31 01 56 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

 

三、报文结构

 

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位变长数字或字符、特殊字符

 

 五、举例解读

此时我们需要找一份8583报文的域列表来对照着解读了

可以参照百度百科:

https://baike.baidu.com/item/8583%E5%8D%8F%E8%AE%AE/5754381?fr=aladdin#4

https://baike.baidu.com/item/8583协议/5754381?fr=aladdin#5

接下来我们分别找到百度百科里,2、3、4、11、 35、 41、 42、 49的说明。

 

举个例,11域

百度百科里域的说明:

Bit11系统跟踪号(Systems Trace Audit Number)

位图位置:11

格式:定长

类型:N6

结合我们的报文<00 50 18>

field 11, 流水号, n6, 定长, 用6个BCD码(即3字节的BCD码)表示, 流水号为“005018”。

 

举个例,42域

百度百科里域的说明:

域42 受卡方标识码

变量属性

ans15,15位定长的字母、数字和特殊字符

域描述:受卡方的标识码,即商户代码。

结合我们的报文<30 31 31 30 30 30 30 30 31 30 30 30 30 30 31>

field 42, 商户号,ans15, 定长, ASCII码表示;这里的商户号为:“011000001000001”

这里30用ascii码解读就是0;31用ascii码解读就是1;(自己找一张ascii码对照表解读)

 

百度百科里域的说明:

Bit35二磁道数据(Track 2 Data)

位图位置:35

格式:LLVAR

类型:Z..37

结合我们的报文 <37 76 89 20 00 10 17 26 45 67 3d 13 08 20 14 78 00 00 00 00>

field 35, 二磁道数据, z..37(LLVAR), 第一个字节表示域的长度(37)。35域是个自定义域。

 

 z..37(LLVAR)  表示37变长字符. llvar表示用几位数字来表示后面数据的长度。一个L表示以为数此处有两个L,表示有该域的前两位用来表示数据的长度。若有三个L 则应该前面补0,用四位数表示数据的长度,若有四个L,自然也是用四位数字表示数据长度

如z..130(LLLVAR)  <01 30 31 31 30 30 30 30 30 31 30 30 30 30 30 31 ... ...>,则前面四位0130表示数据长度,后面有130位表示数据内容

 

 

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
最近在做中国银行的一个快捷支付渠道,使用的是 ISO8583 协议,一开始用的是JPOS框架,但是感觉框架比较臃肿,而且档也比较少。在等待银行专线的过程中,自己闭门造车做了一个简单的8583解析框架 —— Simple8583,将程序重写了一遍,渠道中的代码量少了不少,这几天中行的接口在测试环境终于调试完成了。抽空分享一下这段时间自己学到的知识。 数据类型与编码格式: 根据接触到的数据类型将数据分为如下几种类型:          CHAR(asc编码,直接使用字符串的getBytes(ENCODING)方法获取字节数组)   BINARY(二进制编码,在打包时将8位01值组装为一个字节),             NUMERIC(BCD编码,即8421码),                LLVAR(变长域,采用ASC编码,每个LLVAR类型的域前会有1字节的域字节长度,表示长度的字节用BCD编码表示)                LLLVAR(变长域,与LLVAR域类似,不同之处在于每个LLLVAR域前会有2字节的域字节长度,长度同样以BCD编码表示)             LLVAR_NUMERIC(变长域,采用BCD编码,前有1字节的长度,长度为域值的长度,而非字节长,如域值为123456,编码后长度为3字节,但是表示域长的字节值为6)       如果用到其它数据类型可以在IsoType中进行添加,并在IsoField中添加处理操作 BitMap:        BitMap是ISO8583的精髓所在,ISO8583支持64域和128域两种,但是并非每次请求都会将所有域都请求过去,BItMap就起到了标识哪些域是有效的请求域,接收方也会根据BitMap中约定的值对域进行解析。   那么BitMap又是如何工作的呢?          首先,BItMap分为8字节和16字节两种情况,分别表示支持64域和128域,其第一位值为1,表示BitMap为16字节,否则为8字节。       其次,BitMap中的每一位对应数据域的第几域,有效域会置为1,比如01001000表示第二域和第5域为有效位。 在Simple8583中具体的实现是通过BitMap类实现的,具体可参考源码。 mti:            mti即 message type identifier消息类型标识,为4位bcd编码的数字标识符,用于描述信息的类型。 同一个mti可以用于标识多个不同的交易,比如一般常用的0200可以用来表示消费交易,消费撤销,分期付款消费和分期付款撤销,但是对于同一个mti标识的数据域类型定义是类似的。           具体的实现,我将Simple8583的xml件设置为了两部分,一部分为公用的头,如msgLength,tpdu,bitmap等,另外一部分分按照mti的不同分为多个package体。 粗略的实现流程:          1)组装请求的Map数据(只组装需要的数据域,key值为对应的数据域或包头的值)          2)请求数据进入SimpleClient代理,SimpleClient根据传入的值解析xml件(jaxb实现,做了缓存)          3)根据传入值的mti寻找对应的IsoPackage类,对找到的IsoPackage类进行clone(避免污染),对clone值中的域进行值处理和格式化         4)生成BitMap,计算Mac值(如有)          5)使用ByteArrayOutputStream将组装成的IsoPackage域值进行拼装成为一个大的byte数组,在byte前拼装两个字节的长度          6)通过Socket将数据发送并接受响应(读取前两个字节长度,根据长度获取其剩余),根据IsoPackage解析域,解析得到BitMap后根据BitMap对数据域进行解析,并将值都放入到对应的field中          7)将数据都放在Map中返回,并进行MAC校验(如有) 标签:Simple8583

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值