银联8583报文规范详解

银联8583报文规范详解

自己的理解

在这里插入图片描述

转载的内容

以下来自转载地址
https://www.jianshu.com/p/203ed7f632cf

一.什么是8583报文规范?
1.8583全称:
ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。
2.8583位图:
8583包前面一段为位图,用来确定包的字段域组成情况。
其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础。
3.8583数据域:
8583的报文总共有64个域,每个域都有各自不同的含义和作用,一些自定义域里面还可以分成其他数据域。

一条完整的8583报文格式可以看如下图所示:
在这里插入图片描述
简单的讲:
8583报文=tpdu(这个是固定的,报文接收放提供)+报文头+数据域
其中,位图包含在数据域当中,指明改数据域是由什么内容组成。
底下这段16机制的数据是位图元素:
702404C03CC09939
根据银联给我们的规定:
位图位置:1 域(在数据域的编号为1的域中)
格式:定长
类型:B16(二进制16位,16*8=128bit)
描述:
如将位图的第一位设为’1’,表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。
如使用某数据域,应在位图中将相应的位设位’1’,如使用41域,需将位图的41位设为’1’。
选用条件:如使用65到128域,需设位图域第一位为’1’

根据上面提示可以把位元素 转化如下:
| 2 || 3 || 4 || 11 || 14 || 22 ||25 || 26 || 35 || 36 || 37 || 38 || 41 || 42 || 49 || 52 || 53 || 56 || 59 || 60 || 61 || 64 |
可以从上面就可以得到改数据域是由哪些域组成。

4.详细数据域
请参考销售点终端(POS)应用规范(QCUP009.X-2015)

二.详细例子
临时找了个某厂商对接文档报文,作为例子讲解下如何手动进行解析8583报文内容:
余额查询:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内容描述比较多,我把55域给截掉。
原报文:
01 08 60 00 03 00 00 61 32 00 00 00 00 02 00 60 24 06 c0 20 c0 9a 11 16 e5 c5 7a f2 c1 b6 b2 7a 91 78 53 bd 46 12 48 6d 31 00 00 00 00 76 23 08 07 10 00 01 00 12 24 06 f4 9b 97 e5 bf 2a 81 a3 8f ed 27 6d 7a 12 4d e8 c7 09 a3 1a e5 f3 01 30 30 30 30 30 30 30 39 38 35 30 32 39 30 30 35 33 31 31 31 39 36 32 31 35 36 aa a7 71 b4 4a 71 a6 a1 26 00 00 00 00 00 00 00 01 23 9f 26 08 02 25 0b c9 9f c9 24 0d 9f 27 01 80 9f 10 13 07 01 01 03 a0 00 00 01 0a 01 00 00 00 00 00 f4 9c d5 f5 9f 37 04 a7 1b cb 45 9f 36 02 03 bc 95 05 00 00 00 00 00 9a 03 18 02 01 9c 01 31 9f 02 06 00 00 00 00 00 00 5f 2a 02 01 56 82 02 7c 00 9f 1a 02 01 56 9f 03 06 00 00 00 00 00 00 9f 33 03 e0 e1 c8 9f 34 03 00 00 00 9f 35 01 22 9f 1e 08 31 31 36 30 39 30 30 36 00 19 01 00 00 03 00 06 00 00 00 00 34 39 41 41 33 32 45 39

根据8583的规范:
01 08 60 00 03 00 00 61 32 00 00 00 00 报文头
02 00 消息类型(0)
60 24 06 c0 20 c0 9a 11 位元素
解析后的内容
位图:
01100000 00100100 00000110 11000000 00100000 11000000 10011010 00010001
分别对应:
| 2 || 3 || 11 || 14 || 22 || 23 || 25 || 26 || 35 || 41 || 42 || 49 || 52 || 53 || 55 || 60 || 64 |
总共存在以上域内容

16 e5 c5 7a f2 c1 b6 b2 7a 91 78 53 bd 46 12 48 6d 2域加密后的卡号,前面16为长度
31 00 00 3域处理码,上图所指31xxxx
00 00 76 11域POS终端交易流水号
23 08 14域卡的有效期,这个域是卡片信息存在时出现
07 1 22域服务点输入方式码,指密码的输入方式
00 00 1 23域卡片序列号,出现方式同14域
00 25域固定00
12 26域内容,当22域指明PIN可输入且持卡人输入了PIN
24 35域二磁道加密数据长度24
06 f4 9b 97 e5 bf 2a 81 a3 8f ed 27 6d 7a 12 4d e8 c7 09 a3 1a e5 f3 01 35域数据

30 30 30 30 30 30 30 39 41域8位ASCII码即:00000009,pos终端代码
38 35 30 32 39 30 30 35 33 31 31 31 39 36 32
42域商户代码,15位ASCII码即:850290053111962
31 35 36 49域货币代码,RMB代码156
aa a7 71 b4 4a 71 a6 a1 52域加密后的密码
26 00 00 00 00 00 00 00 53域安全信息
01 23 9f 26 08 02 25 0b c9 9f c9 24 0d 9f 27 01 80 9f 10 13 07 01 01 03 a0 00 00 01 0a 01 00 00 00 00 00 f4 9c d5 f5 9f 37 04 a7 1b cb 45 9f 36 02 03 bc 95 05 00 00 00 00 00 9a 03 18 02 01 9c 01 31 9f 02 06 00 00 00 00 00 00 5f 2a 02 01 56 82 02 7c 00 9f 1a 02 01 56 9f 03 06 00 00 00 00 00 00 9f 33 03 e0 e1 c8 9f 34 03 00 00 00 9f 35 01 22 9f 1e 08 31 31 36 30 39 30 30 36 00
以上55域IC参数
19 01 00 00 03 00 06 00 00 00 00 60域数据,前面的19为长度
34 39 41 41 33 32 45 39 64域mac校验值

三.结束
以上解析的例子不是银联标准规范,而是其他第三方牌照公司对接文档的例子,银联规范的内容大体和上面相同。
相关8583具体内容请查看文档:销售点终端(POS)应用规范(QCUP009.X-2015)

这是一份归纳文档,如有不足,请见谅

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最近在做中国银行的一个快捷支付渠道,使用的是 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报文支持64128两种,但是并非每次请求都会将所有都请求过去,BItMap就起到了标识哪些是有效的请求,接收方也会根据BitMap中约定的值对进行解析。   那么BitMap又是如何工作的呢?          首先,BItMap分为8字节和16字节两种情况,分别表示支持64128,其第一位值为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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值