面对标准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字节的字母类型来处理即可。
以下是一个请求报文实例:
01 | 0000h: 60 00 14 00 00 60 31 00 31 10 02 02 00 30 20 04 ;
`....` 1.1 .... 0 . |
02 | 0010h: 80 20 C0 88 11 00 00 00 00 00 00 00 00 05 00 16 ;
. .............. |
03 | 0020h: 52 02 20 00 29 62 25 00 00 00 00 00 14 D3 01 02 ;
R. .)b%......... |
04 | 0030h: 01 00 00 00 30 30 30 30 30 31 39 33 38 30 31 31 ;
.... 000001938011 |
05 | 0040h: 31 30 30 35 30 39 34 30 31 30 32 31 35 36 06 00 ; 10050940102156 .. |
06 | 0050h: 00 00 00 00 00 00 00 14 22 00 00 01 00 05 00 38 ;
........"...... 8 |
07 | 0060h: 46 37 41 45 35 34 39 ;
F7AE549 |
10 | Bit[ 000 ]
= [ 004 ]
[ 0200 ] |
11 | Bit[ 003 ]
= [ 006 ]
[ 000000 ] |
12 | Bit[ 004 ]
= [ 012 ]
[ 000000000005 ] |
13 | Bit[ 011 ]
= [ 006 ]
[ 001652 ] |
16 | Bit[ 035 ]
= [ 029 ]
[6225000000000014D301020100000] |
17 | Bit[ 041 ]
= [ 008 ]
[ 00000193 ] |
18 | Bit[ 042 ]
= [ 015 ]
[ 801110050940102 ] |
20 | Bit[ 053 ]
= [ 016 ]
[ 0600000000000000 ] |
21 | Bit[ 060 ]
= [ 014 ]
[ 22000001000500 ] |
22 | Bit[ 064 ]
= [ 008 ]
[8F7AE549] |
---------------------------------------------------------------------------------------------------------------
银联即平台则的报文组成部分:
报文长度(4字节ASCII)+TPDU(46字节)++报文类型(4字节ASCII)+位图(16字节)+报文内容。
所有涉及到的数据类型都不需要BCD,即全用ASCII表示即可。
以下是一个请求报文实例。
01 | Bit[000]
= [004] [0200] |
02 | Bit[002]
= [016] [6225000000000014] |
03 | Bit[003]
= [006] [000000] |
04 | Bit[004]
= [012] [000000000090] |
05 | Bit[007]
= [010] [1014114446] |
06 | Bit[011]
= [006] [348507] |
07 | Bit[012]
= [006] [114446] |
08 | Bit[013]
= [004] [1014] |
09 | Bit[018]
= [004] [7531] |
12 | Bit[032]
= [008] [48011000] |
13 | Bit[033]
= [008] [48010000] |
14 | Bit[035]
= [029] [6225000000000014=301020100000] |
15 | Bit[037]
= [012] [101400004941] |
16 | Bit[041]
= [008] [00000191] |
17 | Bit[042]
= [015] [801110075310001] |
18 | Bit[043]
= [040] [测试商户Z0001 ] |
20 | Bit[060]
= [027] [000002000300000000000011000] |
21 | Bit[128]
= [008] [CFAFF1C6] |
23 | 0000h: 2E 02 30 33 30 34 30 30 30 31 30 30 30 30 20 20 ;..030400010000 |
24 | 0010h: 20 34 38 30 31 30 30 30 30 20 20 20 30 30 30 30 ; 48010000 0000 |
25 | 0020h: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 ;0000000000000002 |
26 | 0030h: 30 30 F2 38 44 81 A8 E0 80 10 00 00 00 00 00 00 ;00.8D........... |
27 | 0040h: 00 01 31 36 36 32 32 35 30 30 30 30 30 30 30 30 ;..16622500000000 |
28 | 0050h: 30 30 31 34 30 30 30 30 30 30 30 30 30 30 30 30 ;0014000000000000 |
29 | 0060h: 30 30 30 30 39 30 31 30 31 34 31 31 34 34 34 36 ;0000901014114446 |
30 | 0070h: 33 34 38 35 30 37 31 31 34 34 34 36 31 30 31 34 ;3485071144461014 |
31 | 0080h: 37 35 33 31 30 32 32 30 30 30 38 34 38 30 31 31 ;7531022000848011 |
32 | 0090h: 30 30 30 30 38 34 38 30 31 30 30 30 30 32 39 36 ;0000848010000296 |
33 | 00A0h: 32 32 35 30 30 30 30 30 30 30 30 30 30 31 34 3D ;225000000000014= |
34 | 00B0h: 33 30 31 30 32 30 31 30 30 30 30 30 31 30 31 34 ;3010201000001014 |
35 | 00C0h: 30 30 30 30 34 39 34 31 30 30 30 30 30 31 39 31 ;0000494100000191 |
36 | 00D0h: 38 30 31 31 31 30 30 37 35 33 31 30 30 30 31 B2 ;801110075310001. |
37 | 00E0h: E2 CA D4 C9 CC BB A7 5A 30 30 30 31 20 20 20 20 ;.......Z0001 |
38 | 00F0h:
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ; |
39 | 0100h: 20 20 20 20 20 20 20 31 35 36 30 32 37 30 30 30 ; 156027000 |
40 | 0110h: 30 30 32 30 30 30 33 30 30 30 30 30 30 30 30 30 ;0020003000000000 |
41 | 0120h: 30 30 30 31 31 30 30 30 43 46 41 46 46 31 43 36 ;00011000CFAFF1C6 |
总结:相对终端则,平台则在组包、解析较为容易。
一般解析iso8583的开源代码,没有全部实现上面的类型,可能需要自己对源代码进行修改。本人在参考j8583开源代码,对其进行修改,基本实现上述功能,有感兴趣可以给我留言。
源代码:
iso8583_cups:平台则
iso8583_term:终端则