ISO 8583报文

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxw136511485/article/details/72860685

    ISO 8583包(简称8583报文),金融交易卡原始电文-交易电文规范,是一个由国际标准化组织为其定义了消息格式和交易流程,以便于不同的系统能够交换交易请求和响应信息。8583报文交融交易信息数据包由消息类型、位图和按位图描述的顺序排列的数据系列组成。

(1).消息类型是一个4位数字的数字型字符,用来描述每一个交易信息的类别和功能,其中前两位数组标明信息类别,如授权信息、金融交易信息、管理信息,等等。在一个金融系统中,信息类型的定义应该是唯一的,无二义性的。网间交易具有不同的信息类型定义时应在交换报文的发送前和接收后完成类型转换处理。

(2).位图由64位或128位二进制位构成,每一位用1或0来表示与该位相对应的数据元存在或不存在。位图的第一位位1时,表示64位图后紧接着一个扩展的64位位图。

(3).数据元指交易中一个数据项的实际内容,数据元在数据包中是否存在及存放位置由位图中的相应位确定、一些数据元有固定的长度,一些数据元为变长。

    8583报文=报文长度(2个字节)+TPDU+报文头+报文体。

TPDU说明:长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。
报文头说明:总长度为12字节,压缩时用BCD码表示为6个字节长度的数值。

报文体说明:是由消息类型+位图+数据元组成。

(网上也有比较现成的工具,只要你提供报文,就可以解析出具体报文。)

PS:位图

    位图,Bitmap,由64位或128位二进制位构成!例如 

    位图:  00 20 00 00 00 C0 00 16

    转化为二进制:  00000000 00100000 00000000 00000000 00000000 11000000 00000000 000101100  (1位十六进制对应4位二进制)

    有效域 :  11域,41域, 42域 ,60域 ,62域 ,63域。

    所以,我们需要根据8583报文规范去查找这些数据域的描述(每一域代表什么意思,数据域长度,数据类型等等),就可以得到具体的意思。例如,

    2域表示 主账号,

    N..19(LLVAR),2个字节的长度值+最大19个字节的主账号,压缩时用BCD码表示的1个字节的长度值+用左靠BCD码表示的最大10个字节的主账号。

下面看一个交易实例。

1.签到请求交易,

00 5E 60 00 03 00 00 60 21 00 00 00 00 08 00 00 20 00 00 00 C0 00 16 00 00 48 35 34 37 31 39 30 34 39 38 39 38 33 32 30 31 39 33 39 39 31 37 30 32 00 12 00 00 00 00 00 30 00 32 53 65 71 75 65 6E 63 65 20 4E 6F 31 39 30 30 30 30 41 39 32 30 2D 30 38 32 30 30 32 37 33 39 35 00 03 30 30 31
报文解析

00 5E 长度

60 00 03 00 00 TPDU
60 21 00 00 00 00 报文头
08 00 消息类型
00 20 00 00 00 C0 00 16 Bitmap
00 00 48 ----11域 受卡方系统跟踪号
35 34 37 31 39 30 34 39 --41域 受卡机终端标识码
38 39 38 33 32 30 31 39 33 39 39 31 37 30 32 --42域 受卡方标识码
00 12 00 00 00 00 00 30 ---60域
00 32 53 65 71 75 65 6E 63 65 20 4E 6F 31 39 30 30 30 30 41 39 32 30 2D 30 38 32 30 30 32 37 33 39 35 --62域
00 03 30 30 31 --63域(001)
消息类型说明:一般长度都是4个字节,压缩时用BCD码表示为2个字节的长度的数值。
消息类型占用2个字节,即 08 00 也就是"0800" 

2.签到响应报文

00 74 60 00 00 00 03 61 31 00 00 00 00 08 10 00 38 00 00 0A C0 00 14 00 00 48 10 25 52 05 16 35 34 31 34 30 36 32 35 34 34 30 32 30 30 35 34 37 31 39 30 34 39 38 39 38 33 32 30 31 39 33 39 39 31 37 30 32 00 12 00 00 00 00 00 30 00 40 D1 C3 65 E4 00 E1 79 29 13 AF 07 CD 19 06 9A 07 D2 B9 1C C5 AE E9 84 62 B2 66 5F 24 00 00 00 00 00 00 00 00 AD C6 7D 84
报文解析

00 74 长度
60 00 00 00 03 TPDU
61 31 00 00 00 00 报文头
08 10 消息类型
00 38 00 00 0A C0 00 14 Bitmap
00 00 48 --11域
10 25 52 --12域 受卡方所在地时间
05 16 -13域 受卡方所在地日期
35 34 31 34 30 36 32 35 34 34 30 32 --37域 检索参考号
30 30 --39域 应答码 (00-交易成功)
35 34 37 31 39 30 34 39 -41域
38 39 38 33 32 30 31 39 33 39 39 31 37 30 32 ---42域
00 12 00 00 00 00 00 30 --60域
00 40
D1 C3 65 E4 00 E1 79 29 13 AF 07 CD 19 06 9A 07 D2 B9 1C C5 pik
AE E9 84 62 B2 66 5F 24 00 00 00 00 00 00 00 00 AD C6 7D 84 mak
62域长度为40位,前20个字节为PIN的工作秘钥的密文,后20个字节是MAC的工作秘钥的密文。(其中,“PIN工作秘钥”前16个字节是密文,后4个字节是checkvalue;前16个字节解出明文后,对8个数值0做双倍长秘钥算法,取结果的前四位与checkvalue的值比较应该是一致的;“MAC工作秘钥”前8个字节是密文,再8个字节是二进制0,后4个字节是checkvalue;前8个字节解出明文后,对8个数值0做单倍长秘钥算法,取结果的前4位与checkvalue的值比较应该是一致的)。
需要校验pik和mak,请参考POS 秘钥 这篇文章。

PS:
1. 数据类型。

POS终端与POS中心之间的交换消息中,各数据元类型如下所列:

00001—— A 字母向左靠,右部多余部分填空格。

00002—— AN 字母和/或数字,左靠,右部多余部分填空格。

00003—— ANS 字母、数字和/或特殊符号,左靠,右部多余部分填空格。

00004—— AS 字母和/或特殊符号,左靠,右部多余部分填空格。

00005—— B 二进制bit位。

00006—— DD 日。

00007—— hh 时。

00008—— LL 可变长域的长度值(二位数)。

00009—— LLL 可变长域的长度值(三位数)。

00010—— MM 月。

00011—— mm 分。

00012—— N 数值,右靠,首位有效数字前充零。若表示金额,则最右二位为角分。

00013—— S 特殊符号。

00014—— ss 秒。

00015—— VAR 可变长域。

00016—— X 借贷符号,在数值之前,D表示借,C表示贷。

00017—— YY 年。

00018—— Z 由ISO 7811和ISO 7813制定的磁条卡第二、三磁道的数据类型。

00019—— CN BCD压缩编码数值。

对可变长数据元,以下例说明:

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

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



猜你喜欢

转载自blog.csdn.net/zxw136511485/article/details/72860685