银联银行卡8583报文

银联银行卡8583报文

一、报文结构

8583报文是16进制数据,包含4个部分,分别是报文头、报文类型标识符、位图、报文域,结构如下:

8583报文结构

1、报文头

​ 一共46对16进制数=46个字节,全为必填域。

8583报文头

2、报文类型标识符

​ 由4个定长数字字符(ASCII字符)组成,4对16进制数=4字节。

​ 例如:16进制转ASCII码,0200表示金融请求报文,0210表示金融响应报文。

3、位图

​ 表示报文中有哪些域没有哪些域,一个报文可以有一个位图或两个位图。

​ 16进制数转为2进制数,第一个位图的第一位如果是1,表示有第二个位图。

​ 第一个位图:又称主位图,每个报文都有一个主位图,由8对16进制数(即8个byte字节=64个bit位=64个二进制位)组成。主位图第1位如果是1,表示有第二个位图,第二个位图第1位无效,从主位图和第二个位图第2位开始,每一位与一个域对应,1表示存在,0表示不存在。

4、报文域

​ 通过位图,可以知道报文存在哪些域。

二、报文示例

1、响应报文,示例:

30323130F23E40818AC0801000000000100000C13136363232343234323330303030303036393031303030303030303030303130303030303037313730393435343034383037353230393435343030363237313930313037323236303130303030383134333733303230303831343337333032303030303030303438303735323030303130303038202030313030303820202020202020202031353630333030303030303530303036303030303030303030303430313130303030303030383932303130303030303433353143533232303030303034353033313030303030202020303030303030303030303030303030303030303030333030303632303442303539

​ 解析步骤如下:

​ 1)获取报文类型标识符

​ 报文类型标识符是4位定长数字字符(ASCII字符)=4对16进制数,所以前4对16进制数:30 32 31 30,通过查询ASCII码表可知,其分别代表0210

​ 2)解析位图

​ 主位图数据:F2 3E 40 81 8A C0 80 10,其转化为二进制数:11110010 00111110 01000000 10000001 10001010 11000000 10000000 00010000,第一位是1,表示有第二个位图,00 00 00 00 10 00 00 C1,其转化为2进制数:00000000 00000000 00000000 00000000 00010000 00000000 00000000 11000001

​ 3)解析相关域

​ 按照位图信息查阅8583报文的128的域属性,整体报文解析如下:

30 32 31 30  (报文类型标志符) 
F2 3E 40 81 8A C0 80 10 00 00 00 00 10 00 00 C1 (2个位图)
3136(变长长度为16) 36323234323432333030303030303639    域2
32 31 30 30 30 30 域3
30 30 30 30 30 30 31 30 30 30 30 30 域4
30 37 31 37 30 39 34 36 35 30  域7
34 38 30 37 35 35 域11
30 39 34 36 35 30 域12
30 36 32 37 域13
31 39 30 31 域14
30 37 32 32 域15
36 30 31 30 域18
30 30 域25
3038(变长长度为08) 31 34 33 37 33 30 32 30 域32
3038(变长长度为08) 31 34 33 37 33 30 32 30 域33
30 30 30 30 30 30 34 38 30 37 35 35 域37
30 30 域39
30 31 30 30 30 38 20 20 域41
30 31 30 30 30 38 20 20 20 20 20 20 20 20 20 域42
31 35 36 域49
30 33 30(变长长度为30) 30 30 30 30 30 35 30 30 30 36 30 30 30 30 30 30 30 30 30 30 34 30 31 31 30 30 30 30 30 30 域60
30 38(变长长度为08) 39 32 30 31 30 30 30 30 域100
30 34 33(变长长度为43) 35 31 43 53 32 32 30 30 30 30 30 34 35 30 33 31 30 30 30 30 30 20 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  域121
30 31 33(变长长度为13) 31 32 33 31 32 33 31 32 33 31 32 33 31 域122

​ 根据16进制数查询ASCII码

// fld: 域 [000] 表示0域,[004]表示长度,[0210]表示解析出来的内容。需要注意的是报文没有0域,这里0域名
// 指的是报文的类型标志符
fld[000][004]=[0210]
fld[002][016]=[6224242300000069]
fld[003][006]=[010000]
fld[004][012]=[000000100000]
fld[007][010]=[0717094540]
fld[011][006]=[480752]
fld[012][006]=[094540]
fld[013][004]=[0627]
fld[014][004]=[1901]
fld[015][004]=[0722]
fld[018][004]=[6010]
fld[025][002]=[00]
fld[032][008]=[14373020]
fld[033][008]=[14373020]
fld[037][012]=[000000480752]
fld[039][002]=[00]
fld[041][008]=[010008  ]
fld[042][015]=[010008         ]
fld[049][003]=[156]
fld[060][030]=[000005000600000000004011000000]
fld[100][008]=[92010000]
fld[121][043]=[51CS22000004503100000   0000000000000000000]
fld[122][003]=[000]


2、请求报文,请求报文解析:

2E 02 30 33 30 34 30 30 30 31 30 30 30 30 20 20
20 34 38 30 31 30 30 30 30 20 20 20 30 30 30 30
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 
30 30 F2 38 44 81 A8 E0 80 10 00 00 00 00 00 00
00 01 31 36 36 32 32 35 30 30 30 30 30 30 30 30 
30 30 31 34 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 39 30 31 30 31 34 31 31 34 34 34 36
33 34 38 35 30 37 31 31 34 34 34 36 31 30 31 34 
37 35 33 31 30 32 32 30 30 30 38 34 38 30 31 31
30 30 30 30 38 34 38 30 31 30 30 30 30 32 39 36
32 32 35 30 30 30 30 30 30 30 30 30 30 31 34 3D
33 30 31 30 32 30 31 30 30 30 30 30 31 30 31 34
30 30 30 30 34 39 34 31 30 30 30 30 30 31 39 31
38 30 31 31 31 30 30 37 35 33 31 30 30 30 31 B2
E2 CA D4 C9 CC BB A7 5A 30 30 30 31 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 31 35 36 30 32 37 30 30 30
30 30 32 30 30 30 33 30 30 30 30 30 30 30 30 30 
30 30 30 31 31 30 30 30 43 46 41 46 46 31 43 36

​ 1)报文头46字节=46对16进制数

2E 02 30 33 30 34 30 30 30 31 30 30 30 30 20 20
20 34 38 30 31 30 30 30 30 20 20 20 30 30 30 30
30 30 30 30 30 30 30 30 30 30 30 30 30 30 

​ 2)报文类型标识符,4字节=4对16进制数

30 32 30 30 

​ 3)位图

F2 38 44 81 A8 E0 80 10 00 00 00 00 00 00 00 01 

​ 4)根据位图结合域的详细说明来解析结果如下:

fld[000][004]=[0200]
fld[002][016]=[6225000000000014]
fld[003][006]=[000000]
fld[004][012]=[000000000090]
fld[007][010]=[1014114446]
fld[011][006]=[348507]
fld[012][006]=[114446]
fld[013][004]=[1014]
fld[018][004]=[7531]
fld[022][003]=[022]
fld[025][002]=[00]
fld[032][008]=[48011000]
fld[033][008]=[48010000]
fld[035][029]=[6225000000000014=301020100000]
fld[037][012]=[101400004941]
fld[041][008]=[00000191]
fld[042][015]=[801110075310001]
fld[043][040]=[测试商户Z0001                           ]
fld[049][003]=[156]
fld[060][027]=[000002000300000000000011000]
fld[128][008]=[CFAFF1C6]

附:ASCII编码对照表

ASCII编码对照表

注:本文由博主搜集整理而来,不用于任何商业用途,如有侵权,请联系博主删帖!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近在做中国银行的一个快捷支付渠道,使用的是 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
Android 8583报文解析是指在Android开发中,对8583报文进行解析的过程。8583报文是一种用于金融交易的通信协议,常用于ATM机、POS机等设备的通信。在Android开发中,我们可以使用一些开源的库或者自己编写代码来实现对8583报文的解析。 在csdn中,我们可以找到一些相关的博客或者文章,介绍如何在Android中解析8583报文。这些文章通常会提供一些示例代码和详细的解释,帮助开发人员理解和掌握8583报文解析的过程。 一般来说,8583报文解析的过程包括以下几个步骤: 1. 接收报文:首先,我们需要获取到发送给Android设备的8583报文。这可以通过Socket连接、HTTP请求或者其他方式实现。 2. 报文解析:接下来,我们需要解析报文的各个字段。8583报文通常由多个域组成,每个域都有特定的含义和格式。我们可以使用Java的字符串处理方法,根据各个域的长度和数据类型,将报文分解成各个字段。 3. 字段解析:每个字段都有自己的说明和格式要求。在解析过程中,我们需要根据字段的定义,把报文中的数据按照规定的格式进行处理和转换。例如,日期字段可能需要转换成标准的日期格式,金额字段可能需要进行数值转换。 4. 结果返回:完成报文解析后,我们可以将解析得到的各个字段的值返回给调用方,供后续的业务逻辑处理。通常情况下,我们会将解析得到的数据封装成一个对象,方便程序的使用。 总结来说,Android 8583报文解析是一种将金融交易的通信报文按照规定的格式进行解析的过程。通过在csdn上查找相关文章和学习相关的库,我们可以掌握这一技术,为开发金融应用提供支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值