iso8583报文自学笔记

一、8583报文组成

TPDU

报文头

应用数据

ISO8583 Msg

ID

目的

地址

源地址

应用类别定义

软件

总版本号

终端

状态

处理

要求

保留使用(软件分版本号)

交易数据

60H

NN NN

NN NN

N2

N2

N1

N1

N6

不定长度

2字节的报文长度+5字节的tpdu+6字节的报文头+2字节的应用数据说明+(第14字节为位图的第一位,第14位若小于8,位图8字节,若大于等于8,位图16个字节)+各个域。

二、tpdu详解

TPDU:长度为5个字节,共10位编码,前两位为TPDN ID 一般为“60”,中间4位为TPDU 目的地址,最后4位为TPDU 源地址为“0000”,默认值为“6000030000”。

三、报文头详解

总长度为12字节,压缩时用BCD码表示为6个字节长度的数值

1、应用类别定义:

60:磁条卡金融支付类

61:IC卡金融支付类

62:磁条卡增值业务类支付

63:IC卡增值业务类支付

2、软件版本号

软件版本号

说   明

10

2001年人民银行POS规范之前版本

11

2001年人民银行POS规范版本

21

2002年银联POS规范版本

22

2004年银联POS规范版本

3、终端状态

终端状态

含义

0

正常交易状态

1

测试交易状态

 
4、处理要求

处理要求编码

处理要求说明

0

无处理要求

1

下传终端磁条卡参数

2

上传终端磁条卡状态信息

3

重新签到

4

                                               通知终端发起更新公钥信息操作

5

下载终端IC卡参数

6

TMS参数下载

5、保留使用:暂时不用,填全“0”。
四、应用数据详解
所有域使用查看《中国银联pos终端规范》。
五、符号定义

——     M   强制域(Mandatory),此域在该消息中必须出现否则将被认为消息格式出错。

——     C   条件域(Conditional),此域在一定条件下出现在该消息中,具体的条件请参考备注说明。

——     O   选用域(Optional),此域在该消息中由发送方自选。。

——     Space   此域在该种消息中不出现。

——     A       字母a-z

——     n       数字0-9

——     s       特殊字符

——     an      字母和数字字符

——     ans     字母、数字和特殊字符

——     MM      月

——     DD      日

——     YY      年

——     hh      小时

——     mm      分

——     ss      秒

——     LL      允许的最大长度为99

——     LLL     允许的最大长度为999

——     VAR     可变长度域

——     b       数据的二进制表示,后跟数字表示位(bit)的个数

——     B       用于表示变长的二进制数,后跟数字表示二进制数据所占字节(Byte)的个数

——     z       按GB/T 15120和GB/T 17552的2、3磁道编码

cn          BCD压缩编码数值
六、对可变长数据元,以下例说明:

——     变量XYZ的数据类型为ANS...999(LLLVAR),则表示:该变量中可含字母、数字和特殊符号,最长不超过999个字符,长度由三位数字确定。

——     变量XYZ的数据类型为N...999(LLLVAR),则在压缩时,其长度位用右靠的BCD码压缩,而其后紧随的数字内容用左靠的BCD码压缩。这是为了保证有效内容和其位数中间无缺省填充值。若不为偶数位,左靠的数字内容后补零。由于有长度位表征该域有效内容的长度,因此后补零不会改变该域的真实值。

本文档中声明的压缩变量属性是针对POS终端与POS中心之间的消息,POS中心与任何金融机构之间的消息将全部采用ASCII码且不压缩的格式。
 
 
 
 

转载于:https://www.cnblogs.com/anderson0/p/4777819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值