深入理解金融交易报文Iso8583协议

前言

最初,金融系统只有IBM这些大公司来提供设备,象各种主机与终端等,后来有很多大大小小的公司进入,怎样设计一个报文协议,解决各公司金融系统之间的报文交换,暂且称该协议叫做ISO8583协议。例如“回头客会员管理系统”POS机上应用的就是8583报文。

金融行业涉及到的数据内容是比较少的,如交易类型、帐号、帐户类型、密码、交易金额、交易手续费、日期时间、商户代码、2磁3磁数据、交易序列号等,都总结起来不过100个左右的数据。我们可以简单的设计ISO8583,定义128个字段,将所有金融数据字段按照顺序排列,分别对应128个字段。每个数据类型占固定的长度,要发送一个报文时,就将128个字段按照顺序连起来,然后将整串数据包发送出去。

任何金融软件收到ISO8583包后,直接按照我们定义的规范解包即可,因为整个报文的128个字段都预先定义好了。比如第1个字段是“交易类型”,长度为4位,第2个字段位是“帐号”,为19位等等。接收方就可以先取4位,再取接着的19位,依次类推,直到整个数据包128个字段都解完为止。

思考

有几个问题要思考下:

  1. 我怎么知道每个字段的数据类型呢,是数字还是字符?
  2. 每个传送的报文都把128个字段都传过去,有时候我可能只需要其中5个字段。
  3. 如果我某些字段的长度不固定,属于变长怎么办。

第一个问题:我在定义ISO8583时除了定义每个字段表示什么,还规定其内容是数字或是字符等类型。可能出现的类型有以下几种:字母、数字、特殊字符、年月日等时间、二进制数据。比如“商户类型”字段定义其长度是15,类型为字母。如果“商户类型”同时包括数字和字母呢?那我们就定义一个字段可以同时属于多个类型。

第二个问题:其本质就是如果我只传128个字段的5个字段,接收方怎么知道我传了哪几个字段。我在报文前面加上个包头,用16个字节,即128个bit来表示128个字段中的某个字段是否存在。每个bit如果是1就表示对应的字段在本次报文中存在,如果是0就是不存在。比如,我要发送5个字段,分别属于128个字段中的第2、3、6、8、9字段,我就可以将128bit的报文头填成011001011000000000………0。

我们把这16个字节称为bit map,即位图,用来表示某个位是否存在。考虑到很多时候报文不需要128个字段,可以将报文头由128bit减到64bit,把ISO8583的128个字段中最常见的都放到前64个字段中,只有在需要的时候才把剩下的64bit放到报文里面?

我把64bit报文头的第一位bit用来代表特殊含义,如果该bit为1,则表示64bit后面跟了剩下的64bit报文头;如果第一位bit为0,则表示64bit后面直接是数据字段内容。因为报文头第二个64bit属于有时候有,所以我们叫它Extended bit map扩展位图,报文头最开始的64bit我们叫它Primary bit map主位图。我们直接把扩展位图固定放到128个字段的第一个字段,而主位图每个数据包都有,就强制性放在所有128个字段的前面。

第三个问题:比如第2个字段是“帐号”,是不定长的,可能有的银行帐号是19位,有的是17位等,在字段的开头加上“帐号”的长度。比如帐号是0123456789,一共10位,我们变成100123456789,接收方收到该字段后,它知道ISO8583规定第2个字段“帐号”是变长的,会先取前面2位出来,然后根据长度获取帐号。在规范里面定义某个字段的属性是“LLVAR”,其中LL表示长度,VAR表示数据,两个LL表示两位长,最大是99,三位就是“LLLVAR”,最大是999。

另外考虑到有些人有特殊的要求,我们将128个字段中的部分定义为自定义字段,算是一种扩展。

字段域定义

typedef struct ISO8583
{
    int bit_flag;       /*域数据类型0 -- string, 1 -- int, 2 -- binary*/
    char *data_name;    /*域名*/
    int length;         /*数据域长度*/
    int length_in_byte; /*实际长度(如果是变长)*/
    int variable_flag;  /*是否变长标志0:否 2:2位变长, 3:3位变长*/
    int datatyp;        /*0 -- string, 1 -- int, 2 -- binary*/
    char *data;         /*存放具体值*/
    int attribute;      /*保留*/
       
} ISO8583;
ISO8583 Tbl8583[128] =
{
    /* FLD 1 */ { 0, "BIT MAP,EXTENDED ", 8, 0, 0, 2, NULL, 0 },
    /* FLD 2 */ { 0, "PRIMARY ACCOUNT NUMBER ", 22, 0, 2, 0, NULL, 0 },
    /* FLD 3 */ { 0, "PROCESSING CODE ", 6, 0, 0, 0, NULL, 0 },
    /* FLD 4 */ { 0, "AMOUNT, TRANSACTION ", 12, 0, 0, 1, NULL, 0 },
    /* FLD 5 */ { 0, "NO USE ", 12, 0, 0, 0, NULL, 0 },
    /* FLD 6 */ { 0, "NO USE ", 12, 0, 0, 0, NULL, 0 },
    /* FLD 7 */ { 0, "TRANSACTION DATE AND TIME ", 10, 0, 0, 0, NULL, 0 },
    /* FLD 8 */ { 0, "NO USE ", 8, 0, 0, 0, NULL, 0 },
    /* FLD 9 */ { 0, "NO USE ", 8, 0, 0, 0, NULL, 0 },
    /* FLD 10 */ { 0, "NO USE ", 8, 0, 0, 0, NULL, 0 },
    /* FLD 11 */ { 0, "SYSTEM TRACE AUDIT NUMBER ", 6, 0, 0, 1, NULL, 0 },
    /* FLD 12 */ { 0, "TIME, LOCAL TRANSACTION ", 6, 0, 0, 0, NULL, 0 },
    /* FLD 13 */ { 0, "DATE, LOCAL TRANSACTION ", 4, 0, 0, 0, NULL, 0 },
    /* FLD 14 */ { 0, "DATE, EXPIRATION ", 4, 0, 0, 0, NULL, 0 },
    /* FLD 15 */ { 0, "DATE, SETTLEMENT ", 4, 0, 0, 0, NULL, 0 },
    /* FLD 16 */ { 0, "NO USE ", 4, 0, 0, 0, NULL, 0 },
    /* FLD 17 */ { 0, "DATE, CAPTURE ", 4, 0, 0, 0, NULL, 0 },
    /* FLD 18 */ { 0, "MERCHANT'S TYPE ", 4, 0, 0, 0, NULL, 0 },
     /* 省略部分参考规范文档。 */
    /* FLD 123 */ { 0, "NEW PIN DATA ", 8, 0, 3, 2, NULL, 0 },
    /* FLD 124 */ { 0, "NO USE ", 999, 0, 3, 0, NULL, 0 },
    /* FLD 125 */ { 0, "NO USE ", 999, 0, 3, 0, NULL, 0 },
    /* FLD 126 */ { 0, "NO USE ", 999, 0, 3, 0, NULL, 0 },
    /* FLD 127 */ { 0, "NO USE ", 999, 0, 3, 0, NULL, 0 },
     /* FLD 128 */ { 0, "MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL, 0 }
       
};

字段域解释

1、信息类型(message type)

位图位置 格式 类型 描述
- 定长 N4 数据包的第一部分,定义数据包的类型。
数据类型由数据包的发起者设定,应遵循以下要求:
数据包开始部分必须是信息类型;
对不支持的信息类型能给出拒绝应答。
0100授权交易
0110授权交易答复
0200金融交易
0210金融交易答复
0240查询交易
0250查询交易答复
0400冲正交易
0410冲正交易答复
0800管理交易
0810管理交易答复

2、位图(Bit Map) - 基本位图和扩展位图

位图位置 格式 类型 描述
01 定长 B16 如将位图的第一位设为’1’,表示使用扩展位图,否则表示只使用基本位图。
如使用某数据域,应在位图中将相应的位设位’1’,如使用41域,需将位图的41位设为’1’。
选用条件:如使用65到128域,需设位图域为’1’

3、Bit02主帐号(Primary Account Number )

位图位置 格式 类型 描述
02 变长,LLVAR N..22 唯一的确认一个用户交易的基本帐号。
由于银行电子服务系统涉及多个应用系统,而帐号长度最多为22位,故将原标准的19长度改为22位。

4、Bit03 处理代码 (Processing Code )

位图位置 格式 类型 描述
03 定长 N6 用于描述交易对客户帐户造成何种影响的代码。
处理代码和信息码一起可唯一定义一种交易的类型。
处理代码由以下三部分组成:
位置描述
  1-2交易动作码
  3-4付出帐户类型,用于借记类,如查询、代收费、转场交易。
  5-6收入帐户类型,用于代收费、转帐等。
其中:
ff : 付出帐户
tt: 收入帐户
视主机而定

5、Bit04 交易金额 (Amount, Transaction)

位图位置 格式 类型 描述
04 定长 N12 帐户人要求交易的交易金额,不含任何处理和交易费用。
金额的表示和货币代码有关,应能表示相应货币的最小单位。参ISO4217有关货币代码定义。
如“000000000100”用于表示美元,表示1.00元;如用于表示意大利货币,则表示100里拉。
对于查询等交易,应设交易金额为“000000000000”。

6、Bit07交易日期和时间(Transmission Date and Time)

位图位置 格式 类型 描述
07 定长,MMDDhhmmss N10 本地交易日期和时间

7、Bit11系统跟踪号(Systems Trace Audit Number)

位图位置 格式 类型 描述
11 定长 N6 终端交易的跟踪号码。
交易发起终端填写,和“交易日期、时间”、信息类型等合在一起可唯一定义某一个终端的唯一一笔交易。即是说,在同一天,对一终端,同一类交易的系统跟踪号应保证不同。系统跟踪号在交易过程中不能修改。使用此域来匹配请求和通知类交易的返回。
应用系统使用此域来检查收到的授权、金融、自动冲正、结算、管理和网管等类交易的应答包是否是其请求包的应答。
系统跟踪号不用于匹配自动冲正交易,也不用于在预授权消费时匹配前面的预授权交易。参90域。
对于银行电子服务系统,其系统跟踪号是交易流水号。

8、Bit12本地交易时间(Time ,Local Transaction)

位图位置 格式 类型 描述
12 定长,hhmmss N6 交易在终端上发生的时间。
本地交易时间在交易处理过程中不能改变。在自动冲正,存贮转发时,本地交易时间不能改变。

9、Bit13本地交易日期(Date ,Local Transaction)

位图位置 格式 类型 描述
13 定长,MMDD N4 交易在终端上发生的时间。
本地交易时间不能改变,在自动冲正、存储转发交易时,本地交易时间也不能改变。

10、Bit14有效期(Date ,Expiration)

位图位置 格式 类型 描述
14 定长,YYMM N4 卡的有效期,年年月月
由于卡类写磁格式不同,收单行可能提不出卡的有效期,授权机构从卡的二磁道中提取卡的有效期。如卡,无二磁道,收单行应要求手工录入卡的有效期。
选用条件:100、200、400等交易如没有2、3磁道时,一定要有此域。

11、Bit15结算日期(Date ,Settlement)

位图位置 格式 类型 描述
15 定长,MMDD N4 银行电子服务系统和主机结算的时间,格式月月日日。
结帐日期前发生的交易参加当天结算。
在结算时,结帐日期也用于计算处理、交易费用。

12、Bit17获取日期(Date ,Capture)

位图位置 格式 类型 描述
17 定长,MMDD N4 从主机获取交易的记帐日期。通常用于主机和商户清算。

13、Bit18商户类型(Merchant’s Type)

位图位置 格式 类型 描述
18 定长 N4 定义商户产品和服务类型的代码
商户类型用于金融、授权交易,用于指定服务点的类型。它主要有以下用途:
决定预授权交易得到确认的最长时间;
控制合法限额;
为交易授权处理,控制网络操作规则;
欺诈检测;
用于商户分类报表;
交易费用处理。
根据ISO8583标准,应使用相应的国家标准。
商户类型代码表如下:
商户类型代码行业类型说明
4215邮递服务
4511民航
4722旅游
4782过桥费
4789其他运输服务
4614电信服务
5542加油站
5812餐馆
5999购物
6010金融机构-人工现金支付
6011金融机构-自动现金支付
6012金融机构-各类服务
7011酒店、旅馆
7299各类个人服务:洗衣、美容、
7399各类商业服务:停车场、租车、广告、其他服务
7699各类维修服务:维修、洗车、拖车
7996娱乐:电影、剧院、体育、游戏
8099医疗服务
8111法律服务
8999各类专业服务:会计、教育、装修、工程
选用条件:服务点终端发起的交易一定要有此域。

14、Bit22服务点输入方式(Point-of-Service Entry Mode)

位图位置 格式 类型 描述
22 定长 N3 在服务终端上定义PIN和PAN的输入方式。
服务点输入方式包含以下两个方面组合而成:
位置描述
1-2在服务终端上PAN有效期输入方式
3-3在服务终端上PIN的输入方式
PAN的输入方式编码如下:
PAN输入方式描述
00不知
01手工
02读磁卡
03条码扫描仪(BAR)
04光学符号阅读器(OCR)
05集成电路卡(IC卡)
PIN的输入方式编码如下:
PIN输入方式描述
0不知
1终端能接收PIN
2终端不能接收PIN
选用条件:服务点终端发起的交易一定要有此域。

15、Bit25服务点条件代码(Point-of-Service Condition Code)

位图位置 格式 类型 描述
25 定长 N2 定义交易发生的服务点类型
用法说明:下面是CYBERBANK支持的服务点条件代码。
服务点条件代码服务点终端类型
2自动柜员机(ATM)
10银行终端(10)
14POS
20电话银行

16、Bit32收单机构标识码(Acquirer institution Identification)

位图位置 格式 类型 描述
32 LLVAR N..11 在金融交易中此域表示交易发生的银行机构的标识码
应答数据包必须和请求数据包此域相同。

17、Bit33向前机构标识码(Forwarding Institution Identification Code)

位图位置 格式 类型 描述
33 LLVAR N..11 在金融交易中此域表示帐户所在的银行机构的标识码。
在网管交易800/810中,本域含有交易发起机构的代码。
应答数据包必须和请求数据包此域相同。

18、Bit35二磁道数据(Track 2 Data)

位图位置 格式 类型 描述
35 LLVAR N..37 写在卡二磁道的数据。数据组成遵循ISO7811-1985标准,数据中包含域分隔符,但不包含卡启始、结束符、LRC等。
收卡行应检测卡的二磁道是否符合国际标准。
为支持国际交换收单行应将二磁道中的分隔符换为“=”。除此外不能对二磁道数据进行任何修改,如修改PAN的校验字、有效期、服务码等。

19、Bit36三磁道数据(Track 3 Data)

位图位置 格式 类型 描述
36 LLLVAR N..104 写在卡三磁道的数据。数据应组成遵循ISO4909标准,数据中包含域分隔符,但不包含卡启始、结束符、LRC等。
注意:长度说明为3位数字长。

20、Bit37检索索引号(Retrieval Reference Number)

位图位置 格式 类型 描述
37 定长 AN12 检索索引号用来在任何时间标识一个金融、授权、自动冲正交易。
检索索引号不要求打印在持卡人的帐单上。它的主要目的是在收单行和授权行之间定义一个数据项用于跟踪和检索交易。授权机构可以将检索索引号打印在客户的对帐单上。
检索索引号由收单行分配。
选用条件:可包含在收单机构的交易请求中。如在交易请求中有,则应答数据中一定应原样返回。

21、Bit38授权码(Authorization Identification)

位图位置 格式 类型 描述
38 定长 AN6 交易授权机构返回的返回代码。
授权码用于在服务点终端上信用卡授权;
授权机构按网络操作规定,可选使用本域。

22、Bit39返回码(Response Code)

位图位置 格式 类型 描述
39 定长 AN2 对一交易定义其处理结果的编码。
返回码用于说明授权机构对金融(授权)交易的处理状态;也用来指明自动冲正交易的冲正原因;还用来指出目标主机已接收到文件修改、结算、管理、网管等交易请求。
返回码应尽可能准确,应尽可能描述清楚所遇到的问题和状态。网络交换主机、收单行主机有可能会按不同的返回码收取不同的交易处理费用,并执行不同的处理过程。

23、Bit41收卡单位终端标识码(Card Acceptor Terminal Identification)

位图位置 格式 类型 描述
41 定长 ANS8 定义在收单单位中定义一个服务终端的标识码,在同一商户中服务终端标识码应唯一。

24,Bit42收卡商户定义码(Card Acceptor Identification Code)

位图位置 格式 类型 描述
42 定长 ANS15 在本地和网络中定义交易单位(商户)的编码。

25、Bit43收卡商户位置(Card Acceptor Location)

位图位置 格式 类型 描述
43 定长 ANS40 在本地和网络中定义收卡单位(商户)的国家、省。城市等。
选用条件:如对外卡网络,一定要包含此域。

26、Bit44附加返回数据(Additional ResponseData)

位图位置 格式 类型 描述
44 LLVAR ANS..25 在金融(授权)交易中授权机构返回的其他信息。

27、Bit48附加数据-私用(Additional Data-Private)

位图位置 格式 类型 描述
48 LLLVAR ANS…999 银行电子服务系统使用此域作以下用途
存放批量查询的返回数据
其格式与输出格式表对应

28、Bit49交易货币代码(Currency Code,Transaction)

位图位置 格式 类型 描述
49 定长 AN3 按ISO4217定义的交易货币代码,用来表示“交易金额”(field04)所用的货币种类。
交易货币代码是指在收单单位进行交易所用的交易种类。

29、Bit50结算货币代码(Currency Code,Settlement)

位图位置 格式 类型 描述
50 定长 AN3 按ISO4217定义的结算货币代码,用来表示结算金额、结算处理费、结算交易费等所用的货币种类。
结算货币代码是指在进行结算和清算过程中所用的货币种类。

30、Bit52用户密码(PIN)数据(PIN Data)

位图位置 格式 类型 描述
52 定长 B16 用户在服务终端上交易用于识别用户合法性的一些数字。
PIN在分行主机用分行主机密钥按ANSIX9.8标准加密,形成密文块。
选用条件:如果在终端上输入了密码,就需要此域。

31、Bit53密码相关控制信息(Security Related Control)

位图位置 格式 类型 描述
53 定长 AN16 本域提供有关密码块的附加信息,用于指出用于PIN计算的PIN key,用于MAC计算的MAC key。
本域格式如下表所示:
0-1格式代码2N“20”
2-3PIN加密算法2N“01”:DES
4-5密文块格式2N“01”:ANSI
6PIN密钥索引1N‘1’或‘2’
7MAC密钥索引1N‘1’或‘2’
8-11MAC检查数据4B
12-15填充4N
在BOC信用卡网络中PIN和MAC各使用两个密钥—‘1’号和’2’密钥,交易中计算PIN和MAC时只能各用某一个KEY,同时需将所用的KEY索引号填写此域。
选用条件:如果有PIN域或MAC域,一定需有此域。

32、Bit54附加金额(Additional Amounts)

位图位置 格式 类型 描述
54 LLLVAR ANS…120 此域由授权行主机将客户的余额返回给收单终端,以显示或打印在客户回单上。
在此域中最多可有6个余额返回,每个余额返回格式如下:
位置描述
0-1处理码3-4或5-6位定义的帐号类型
2-3金额类型:01-帐户金额
02-可用金额
03-拥有金额
04-应付金额
40-可用取款限额
56-可用转帐限额
4-6金额的货币代码
7‘D’-借记金额,’C’-贷记金额
8-19余额数目
六个余额中必须返回可用余额,在ATM、POS上显示可用余额

33、Bit64信息确认码(MAC)

位图位置 格式 类型 描述
64 定长 B16 数据包的最后一个域,用于验证信息来源的合法性,以及数据包中数据是否未被篡改。
MAC的计算参ANSIX.99,(最后八字节未满八位者左补零,右补零?)
为提高效率,在发送者和接收者之间,只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域,它们将参加MAC的计算。

位图域名
2基本帐号
3处理代码
4交易金额
11系统跟踪号
12本地交易时间
13本地交易日期
32收单机构代码
38授权码
39返回码
41收单终端代码
49交易货币代码
95替换金额
选用条件:只使用了1-64域的数据包使用此域。

34、Bit70管理信息码(System Management Indormation Code)

位图位置 格式 类型 描述
70 定长 N3 用于定义和维护银行电子服务系统内部通讯网络状态和应用工作状态。
网络管理信息代码用于管理清算日期”cutoff”,通讯”sign on/sign off”,”key exchange”等。
支持以下一些网络管理信息码
NMIC网络管理信息码动作
001签到(Sign on)
002签退(Sign off)
101交换密钥(Key exchange)
201结帐日期切换(Cutoff)
202结帐日期切换完成
301测试(Echo test)

35、Bit74贷记交易笔数(Transaction Number)

位图位置 格式 类型 描述
74 定长 N10 贷记金融交易总的成功交易次数
CYBERBANK软件在收到如下一个处理代码时会增加贷记交易次数。
交易码交易服务
00贷记,购物与服务
01贷记,取现
02贷记,调整(客户调整)

36,Bit75贷记自动冲正交易笔数(Credits,Reversal Number)

位图位置 格式 类型 描述
75 定长 N10 贷记收单行自动冲正、“ChargeBack”等交易总的交易次数
CYBERBANK软件在收到如下一个处理代码时会增加贷记自动冲正交易笔数
交易码交易服务
20贷记,退货
21贷记,存款
22贷记,调整(客户修改)

36、Bit75贷记自动冲正交易笔数(Credits,Reversal Number)

位图位置 格式 类型 描述
75 定长 N10 贷记收单行自动冲正、“ChargeBack”等交易总的交易次数
CYBERBANK软件在收到如下一个处理代码时会增加贷记自动冲正交易笔数
交易码交易服务
20贷记,退货
21贷记,存款
22贷记,调整(客户修改)

37、Bit76借记交易笔数(Debits,Number)

位图位置 格式 类型 描述
76 定长 N10 借记金融交易总的成功交易次数
CYBERBANK软件在收到如下一个处理代码时会增加借记交易次数。
交易码交易服务
00借记,购物与服务
01借记,取现
02借记,调整(客户调整)

38、Bit77借记自动冲正交易笔数(Debits,Reversal Number)

位图位置 格式 类型 描述
77 定长 N10 借记收单行自动冲正、“ChargeBack”等交易总的交易次数
CYBERBANK软件在收到如下一个处理代码时会增加借记重发交易次数,并在清算表报中反映。
交易码交易服务
20借记(!!!),退货
21借记,存款
22借记,调整(客户修改)

39、Bit78转帐交易笔数(Transfers,Number)

位图位置 格式 类型 描述
78 定长 N10 转帐的交易总次数。
系统在收到如下一个处理代码的金融交易时会增加转帐交易的次数。
交易码交易服务
40客户相关帐户间转帐

40、Bit79转帐自动冲正交易笔数(Transfers,Reversal Number)

位图位置 格式 类型 描述
79 定长 N10 转帐的自动冲正交易总次数。
系统在收到如下一个处理代码的自动冲正交易时会增加转帐自动冲正交易的次数。
交易码交易服务
40客户相关帐户间转帐

41、Bit80查询交易笔数(Inquiries,Number)

位图位置 格式 类型 描述
80 定长 N10 成功的查询交易次数。
系统软件在收到如下一个处理代码时会增加查询交易次数。
交易码交易服务
30查询可用金额

42、Bit81授权交易笔数(Authorization,Number)

位图位置 格式 类型 描述
81 定长 N10 成功的授权交易总额。在收到一个授权交易时系统将授权交易笔数加一。

43、Bit83贷记交易费金额(Credits,Transaction FeeAmount)

位图位置 格式 类型 描述
83 定长 N12 净交易费用,如交易金额为正。

44、Bit85借记交易费金额(Debits,Transaction FeeAmount)

位图位置 格式 类型 描述
85 定长 N12 净交易费用,如交易金额为负。

45、Bit86贷记交易金额(Credits,Amount)

位图位置 格式 类型 描述
86 定长 N16 贷记金融交易总的交易金额,不含任何费用。
系统在收到如下一个处理代码时会增加贷记交易金额,并在清算表报中反映。
交易码交易服务
20贷记,退货
21贷记,存款
22贷记,调整(客户修改)

46、Bit87贷记自动冲正金额(Credits,Reversal Amount)

位图位置 格式 类型 描述
87 定长 N16 信用卡自动冲正交易的总金额,不含任何费用。

47、Bit88借记交易金额(Debits,Amount)

位图位置 格式 类型 描述
88 定长 N16 借记金融交易总的交易金额,不含任何费用。
系统在收到如下一个处理代码时会增加借记交易金额,并在清算表报中反映。
交易码交易服务
00借记,购物与服务
01借记,取现
02借记,调整(客户调整)

48、it89借记自动冲正交易金额(Debits,Reversal Amount)

位图位置 格式 类型 描述
89 定长 N16 借记自动冲正交易的总金额,不含任何费用。

49、Bit90原交易的数据元素(Original Data Elements)

位图位置 格式 类型 描述
90 定长 N42 存放原交易的一些数据,用于修改或自动冲正。
数据由以下五部分组成:
位置描述
1-4信息类型码
设为原交易的信息类型代码
5-10系统跟踪号
原交易系统跟踪号
11-20交易日期和时间
原交易的交易日期和时间
21-31原收单机构
原交易的收单机构
不足11位的机构代码,左补‘0’
32-42原向前机构
原交易的收单机构
不足11位的机构代码,左补‘0’

50、Bit91文件修改编码(File Update Code)

位图位置 格式 类型 描述
91 定长 AN1 用此域指示某文件怎样维护。
CYBERBANK支持以下一些修改代码:
1增加记录
2改变记录
3删除记录
5查询
7增加文件

51、Bit94服务指示码(Service Indicator)

位图位置 格式 类型 描述
94 定长 AN7 指示文件修改服务。

52、Bit95代替金额(Replacement Amounts)

位图位置 格式 类型 描述
95 定长 N42 客户修改或部分取消已完成的交易,最后实际发生的交易金额,交易的原交易金额存放在90域。
本域由以下4部分组成
Sub-ElementAmountAttribute
交易实际金额N12
结算实际金额N12
实际交易费用X+N8
实际结算费用X+N8

53、Bit97净结算金额(Net Settlement Amount)

位图位置 格式 类型 描述
97 定长 X+N16 此域为净结帐金额。
502交易中用于发送当天的净结算金额
例:“C0000000020000000”,表示贷方(’+’?)200000.00元。
“D0000000020000000”,表示借方(’-’?)200000.00元。

54、Bit99结算机构码(Settlement Institution Identification)

位图位置 格式 类型 描述
99 LLVAR N..11 此域存放接收清算信息的机构代码。返回数据包此域必须和请求数据包一致。

55、Bit100接收机构码(Receiving Institution Identification)

位图位置 格式 类型 描述
100 LLVAR N..11 金融交易此域存放授权机构代码。
网管类交易,800/820交易,此域存放请求的目的机构代码。
返回数据包此域必须和请求数据包一致。

56、Bit101文件名(FileName)

位图位置 格式 类型 描述
101 LLVAR ANS..17 发送机构设置的文件名。

57、Bit102帐号1(Account Identification1)

位图位置 格式 类型 描述
102 LLVAR ANS..28 一个特定的客户帐号。帐号1用来描述受借记、转出、支付等交易影响的帐户。
选用条件:转帐时使用。

58、Bit103帐号2(Account Identiication2)

位图位置 格式 类型 描述
103 LLVAR ANS..28 交易的补充信息,如:第二货币号、利率代码、起止日期等。
定义如下表
0000000000000000000000000000000000000000000000000
位置长度描述
00-2122帐户
22-276发卡机构号

如果此域存在,将按此机构代码作为路由信息。
选用条件:机构间转帐时使用。

60、Bit123新密码数据(New PIN Data)

位图位置 格式 类型 描述
123 LLLVAR B…16 修改密码交易时存放新密码。
格式参考52域
选用条件:修改密码交易时必须有此域。

61、Bit128信息确认码(MAC)

位图位置 格式 类型 描述
128 定长 B16 数据包的最后一个域,用于验证信息来源的合法性,以及数据包中数据是否未被篡改。
MAC的计算参ANSIX.99
为提高效率,在发送者和接收者之间,只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域,它们将参加MAC的计算。
位图域名:
2基本帐号
3处理代码
4交易金额
11系统跟踪号
12本地交易时间
13本地交易日期
32收单机构代码
38授权码
39返回码
41收单终端代码
49交易货币代码
95替换金额
选用条件:使用65-128数据域的数据包需使用此域。

举个栗子

现在我们有ISO8583报文如下(十六进制表示法):

60 00 03 00 00 60 31 00 31 07 30 02 00 30 20 04 C0 20 C0 98 11 00 00 00 00 00 00 00 00 01 00 03 49 02 10 00 12 30 62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00 35 36 38 35 32 33 31 34 32 33 35 32 31 34 35 32 36 38 35 39 32 33 36 31 35 36 C6 24 83 4D 36 7E 9E 9E 20 00 00 00 00 00 00 00 00 13 22 00 00 08 00 05 00 36 37 41 32 32 39 39 41

解析结果为:

Message = 0200
Bitmap  = 30 20 04 C0 20 C0 98 11 
Bit  3  = 000000
Bit  4  = 000000000001
Bit 11  = 000349
Bit 22  = 0210
Bit 25  = 00
Bit 26  = 12
Bit 35  = (30)62258221129963015=151110100000
Bit 41  = 56852314
Bit 42  = 235214526859236
Bit 49  = 156
Bit 52  = C6 24 83 4D 36 7E 9E 9E 
Bit 53  = 2000000000000000
Bit 60  = (13)2200000800050
Bit 64  = 36 37 41 32 32 39 39 41 

那么,是如何解析的呢?

第一步

POS终端上送POS中心的消息报文结构包括TPDU、报文头和应用数据三部分:

——TPDU说明:长度为10个字节,压缩时用BCD码表示为5个字节长度的数值。

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

——应用数据说明:一般长度都是4个字节,压缩时用BCD码表示为2个字节的长度的数值。

所以上述报文中前五个字节为TPDU,即60 00 03 00 00

报文头占用六个字节,即 60 31 00 31 07 30

应用数据占用2个字节,即 02 00 也就是”0200”

——0200金融类请求消息:

●  POS查询请求。
●  POS消费请求。
●  POS消费撤销请求。
●  POS预授权完成(请求)请求。
●  POS预授权完成撤销请求。
●  电子现金脱机消费请求。
●  分期付款消费请求。
●  分期付款消费撤销请求。
●  基于PBOC电子钱包/电子现金的IC圈存类交易请求。
●  磁条卡现金充值请求。

第二步

分析位图:

首先取第十四个字节,即0x30 ,转化为二进制为0011 0000,在该字节的第一位为0(从左往右)表示当前报文中只需包括64个域,也就是从当前字节开始连续8个字节为位图(包括当前字节),如要包括128个域,该位为1。

现在进入关键的位图分析,现在我们取到了表示位图的8个字节即30 20 04 C0 20 C0 98 11,转为二进制为
00110000 00100000 00000100 11000000 00100000 11000000 10011000 00010001

位图中为1的位置即代表相应的域,在上面的二进制位中从左往右有第3位、第4位、第11位、第22位、第25位、第26位、第35位、第41位、第42位、第49位、第52位、第53位、第60位、第64位。

下面开始这些域中的数据,首先分析3域,3域为交易处理码,压缩成BCD码后占定长3个字节,我们从位图所占的8个字节后开始连续取3个字节,即 00 00 00,解压后即为“000000”,具体代表含义这里就不叙述了。

4域为交易金额,压缩成BCD码后占定长6个字节,同理取6个字节,即00 00 00 00 00 01,也就是金额0.01元,具体转换参考银联规范。
11域为受卡方系统跟踪号(流水号),压缩成BCD码占定长3个字节,同理取3个字节,即00 03 49,即000349。

22域为服务点输入方式码,压缩成BCD码占定长2个字节,同理取2个字节,即02 10,由于22域本身只占3个字节,压缩时左靠,右补0,所以转换为“021”,具体含义不再叙述。

25域为服务点条件码,压缩成BCD码占定长1个字节,同理取1个字节,即00,转换为“00”,“00”代表正常提交。

26域为服务点PIN获取码,压缩成BCD码占定长1个字节,同理取1个字节,即12,转换为“12”,表示服务点设备所允许输入的个人密码明文的最大长度为12。

解下来的35域由于不是定长,所以处理方法不同,先取一个字节,即30,转换为“30”,表示第二磁道的数据占用30个字节,取连续15个字节即62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00,这里不对这串数据进行说明了。

41域为受卡机终端标识码,占8个字节的定长域,取35 36 38 35 32 33 31 34。

42域为受卡方标识码,占15个字节的定长域,取32 33 35 32 31 34 35 32 36 38 35 39 32 33 36。

49域为交易货币代码,占3个字节的定长域,取31 35 36。
52域为个人标识码数据,占8个字节的定长二进制数域,取C6 24 83 4D 36 7E 9E 9E。

53域为安全控制信息,压缩成BCD码占8个字节定长域,取20 00 00 00 00 00 00 00。

60域为自定义域,为不定长域,先取长度(压缩成BCD码占两个字节),即00 13,转换为13即占60域占13个字节,压缩成BCD码占7个字节,取22 00 00 08 00 05 00。

64域为报文鉴别码,占定长8个字节,取最后八个字节36 37 41 32 32 39 39 41。

阅读更多

更多精彩内容