银联则及终端iso8583报文规范的理解

本文详细解析了ISO8583标准在终端与银联平台的应用差异,介绍了报文结构、数据类型及示例,并提供了开源代码实现的指导。
面对标准iso8583,相信有很多的人知道,也看过相关的文档。初学者面对iso8583接口文档,首先需要弄清楚,是关于终端则的还是关于银联平台则的。

    如果你是针对终端的则一般是《销售点终端(POS)应用规范(QCUP 009.1-2010).pdf》会含有POS二个字样。

    如果是针对银联则的则一般是《中国银联银行卡联网联合技术规范V2.1(境内卷)(QCUP 006-2011)》会含银联银行卡等字样。

    终端则的报文组成:

    报文长度(2字节表示)+TPDU(11字节)+报文类型(4字节,2字节BCD表示)+位图(8字节)+报文内容。

     报文长度不好理解,可以参看“关于报文长度的理解”。  

    报文内容会涉及的类型(不一定与文档里的一样,但是需要它们归集总结):

        1)纯数字类型: 基本上BCD表示。(如处理码)

        2)字母类型:基本上ASCII表示。(如商户号、终端号)

        3)2或3位长域,在表示方式上有区别:

            长度域BCD表示,数据域ASCII表示。(如F44、F54等域)

            长度域BCD表示,数据域也BCD表示。(如卡号、二磁道)

        需要注意的是,可能会认为F64: 64bit如何表示呢?其实这就是一个8字节的字母类型来处理即可。

以下是一个请求报文实例:

0000h: 60 00 14 00 00 60 31 00 31 10 02 02 00 30 20 04 ; `....`1.1....0 .
0010h: 80 20 C0 88 11 00 00 00 00 00 00 00 00 05 00 16 ; . ..............
0020h: 52 02 20 00 29 62 25 00 00 00 00 00 14 D3 01 02 ; R. .)b%.........
0030h: 01 00 00 00 30 30 30 30 30 31 39 33 38 30 31 31 ; ....000001938011
0040h: 31 30 30 35 30 39 34 30 31 30 32 31 35 36 06 00 ; 10050940102156..
0050h: 00 00 00 00 00 00 00 14 22 00 00 01 00 05 00 38 ; ........"......8
0060h: 46 37 41 45 35 34 39                            ; F7AE549


Bit[000] = [004] [0200]
Bit[003] = [006] [000000]
Bit[004] = [012] [000000000005]
Bit[011] = [006] [001652]
Bit[022] = [003] [022]
Bit[025] = [002] [00]
Bit[035] = [029] [6225000000000014D301020100000]
Bit[041] = [008] [00000193]
Bit[042] = [015] [801110050940102]
Bit[049] = [003] [156]
Bit[053] = [016] [0600000000000000]
Bit[060] = [014] [22000001000500]
Bit[064] = [008] [8F7AE549]

---------------------------------------------------------------------------------------------------------------

    银联即平台则的报文组成部分:

    报文长度(4字节ASCII)+TPDU(46字节)++报文类型(4字节ASCII)+位图(16字节)+报文内容。

    所有涉及到的数据类型都不需要BCD,即全用ASCII表示即可。

以下是一个请求报文实例。

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

0000h: 2E 02 30 33 30 34 30 30 30 31 30 30 30 30 20 20 ; ..030400010000
0010h: 20 34 38 30 31 30 30 30 30 20 20 20 30 30 30 30 ;  48010000   0000
0020h: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 ; 0000000000000002
0030h: 30 30 F2 38 44 81 A8 E0 80 10 00 00 00 00 00 00 ; 00.8D...........
0040h: 00 01 31 36 36 32 32 35 30 30 30 30 30 30 30 30 ; ..16622500000000
0050h: 30 30 31 34 30 30 30 30 30 30 30 30 30 30 30 30 ; 0014000000000000
0060h: 30 30 30 30 39 30 31 30 31 34 31 31 34 34 34 36 ; 0000901014114446
0070h: 33 34 38 35 30 37 31 31 34 34 34 36 31 30 31 34 ; 3485071144461014
0080h: 37 35 33 31 30 32 32 30 30 30 38 34 38 30 31 31 ; 7531022000848011
0090h: 30 30 30 30 38 34 38 30 31 30 30 30 30 32 39 36 ; 0000848010000296
00A0h: 32 32 35 30 30 30 30 30 30 30 30 30 30 31 34 3D ; 225000000000014=
00B0h: 33 30 31 30 32 30 31 30 30 30 30 30 31 30 31 34 ; 3010201000001014
00C0h: 30 30 30 30 34 39 34 31 30 30 30 30 30 31 39 31 ; 0000494100000191
00D0h: 38 30 31 31 31 30 30 37 35 33 31 30 30 30 31 B2 ; 801110075310001.
00E0h: E2 CA D4 C9 CC BB A7 5A 30 30 30 31 20 20 20 20 ; .......Z0001
00F0h: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
0100h: 20 20 20 20 20 20 20 31 35 36 30 32 37 30 30 30 ;        156027000
0110h: 30 30 32 30 30 30 33 30 30 30 30 30 30 30 30 30 ; 0020003000000000
0120h: 30 30 30 31 31 30 30 30 43 46 41 46 46 31 43 36 ; 00011000CFAFF1C6

总结:相对终端则,平台则在组包、解析较为容易。

一般解析iso8583的开源代码,没有全部实现上面的类型,可能需要自己对源代码进行修改。本人在参考j8583开源代码,对其进行修改,基本实现上述功能,有感兴趣可以给我留言。

源代码:

    iso8583_cups:平台则

    iso8583_term:终端则

最近在做中国银行的一个快捷支付渠道,使用的是 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、付费专栏及课程。

余额充值