8583报文结构分析及C语言实现

 

 

 

8583报文结构分析及C语言实现

------报文结构分析

 

曹玉坤

 

 

 

 

 

 

 

 

 

 

 

2011-7-11

 

 

 

 

1     概述... 3

2     8583报文结构... 3

3     各字段意义说明... 4

4     报文结构样例... 4

5     报文内容样例... 8

 

 




 

1       概述

8583报文是开放的自由度比较高的报文格式之一,多用于银行报文的传输。由于其较高的自由度,每家银行都可以规定自己的8583报文格式,从一定程度上为银行报文提供了加密。即如果想要解开8583报文的内容,就必须知道此8583报文遵循的是何种结构。而这个结构则是由银行内部自己制定。

2       8583报文结构

大家都对结构体比较熟悉,我们先来看看8583的结构体。

Typedef  struct ISO8583

{

       int length; /*数据域长度*/ 

       int variable_flag; /*是否变长标志0:否 22位变长
3
3位变长*/

       char *data; /*存放具体值*/ 

} ISO8583

我们并没有列出所有的字段,只列出些比较常用的。首先我们看第一个数据的长度,指的是数据的最大长度(如果是变长的话)。

第二个是是否变长标志,这个稍微有点麻烦,我们举个例子说明。先看看如果是0,标识定长,也就是说数据的长度就是前面定义的数据长度位;如果是23,那就说明数据的前两位或前三位是标识数据的实际长度的。如,我们数据  3100:标识数据总长度为100,实际长度通过前三位标识。00812345678,前面三位008,标识实际长度,后面12345678 8位才是真实的数据。

再来后面就是存放的具体数值。

3       各字段意义说明

前面我们大概介绍了各个字段的意义,这里我们着重讲下一个特殊的字段,就是8583的灵魂,bitmapBitmap顾名思义就是位图,他表示什么呢?他表示哪些位有值,哪些没有。他长度一共16个字节,一共128位,每位标识相应的位有没有数据,如果有则为1,没有标识为0。这样就能大大提高我们的读取效率。还有我们有可能需要标识出报文长度时128位还是64位,因为很多报文没有那么多的要素,不需要那么多的数据位。这个是通过bitmap第一位标识的,如果是1就认为报文长度为128,如果为0就说明报文长度为64

4       报文结构样例

        /*000*/ {TYP_BCD, 0, 4, "Message Type Indicator"},

    /*001*/ {TYP_BIT, 0, 16, "Bitmap"},

    /*002*/ {TYP_ASC, 0, 35, "报文标识号"},

    /*003*/ {TYP_ASC, 0, 19, "报文发送时间"},

    /*004*/ {TYP_BCD, 0, 14, "发起直接参与机构"},

    /*005*/ {TYP_BCD, 0, 14, "发起间接参与机构"},

    /*006*/ {TYP_BCD, 0, 14, "接收直接参与机构"},

    /*007*/ {TYP_BCD, 0, 14, "接收间接参与机构"},

    /*008*/ {TYP_ASC, 0, 4, "系统编号"},

    /*009*/ {TYP_BCD, 2, 16, "支付交易序号"},

    /*010*/ {TYP_ASC, 2, 60, "付款人名称"},

    /*011*/ {TYP_BCD, 2, 32, "付款人账号"},

    /*012*/ {TYP_BCD, 0, 14, "付款人开户行号"},

    /*013*/ {TYP_BCD, 0, 14, "付款行行号"},

    /*014*/ {TYP_BCD, 0, 14, "收款行行号"},

    /*015*/ {TYP_ASC, 2, 60, "收款人名称"},

    /*016*/ {TYP_BCD, 2, 32, "收款人帐号"},

    /*017*/ {TYP_BCD, 0, 14, "收款人开户行号"},

    /*018*/ {TYP_ASC, 0, 3, "币种代码"},

    /*019*/ {TYP_BCD, 0, 18, "金额"},

    /*020*/ {TYP_BCD, 0, 4, "业务类型编码"},

    /*021*/ {TYP_BCD, 0, 5, "业务种类编码"},

    /*022*/ {TYP_ASC, 0, 12, "附言"},

    /*023*/ {TYP_BCD, 0, 3, "Card sequence number"},

    /*024*/ {TYP_BCD, 0, 3, "Function code"},

    /*025*/ {TYP_BCD, 0, 4, "Message reason code"},

    /*026*/ {TYP_BCD, 0, 4, "Card acceptor business code"},

    /*027*/ {TYP_BCD, 0, 1, "Approval code length"},

    /*028*/ {TYP_BCD, 0, 6, "Date, Reconciliation"},

    /*029*/ {TYP_BCD, 0, 3, "Reconciliation indicator"},

    /*030*/ {TYP_BCD, 0, 24, "Amounts, original"},

    /*031*/ {TYP_ASC, 2, 99, "Acquirer reference data"},

    /*032*/ {TYP_BCD, 2, 11, "Acquirer institution identification code"},

    /*033*/ {TYP_BCD, 2, 11, "Forwarding institution identification code"},

    /*034*/ {TYP_ASC, 2, 28, "Primary account number, extended"},

    /*035*/ {TYP_ASC, 2, 37, "Track 2 data"},

    /*036*/ {TYP_ASC, 3, 104, "Track 3 data"},

    /*037*/ {TYP_ASC, 0, 12, "Retrieval reference number"},

    /*038*/ {TYP_ASC, 0, 6, "Approval code"},

    /*039*/ {TYP_BCD, 0, 3, "Action code"},

    /*040*/ {TYP_BCD, 0, 3, "Service code"},

    /*041*/ {TYP_ASC, 0, 8, "Card acceptor terminal identification"},

    /*042*/ {TYP_ASC, 0, 15, "Card acceptor identification code"},

    /*043*/ {TYP_ASC, 2, 99, "Card acceptor name/location"},

    /*044*/ {TYP_ASC, 2, 99, "Additional response data"},

    /*045*/ {TYP_ASC, 2, 76, "Track 1 data"},

    /*046*/ {TYP_ASC, 3, 204, "Amounts, Fees"},

    /*047*/ {TYP_ASC, 3, 999, "Additional data - national"},

    /*048*/ {TYP_ASC, 3, 999, "Additional data - private"},

    /*049*/ {TYP_ASC, 0, 3, "Currency code, Transaction"},

    /*050*/ {TYP_ASC, 0, 3, "Currency code, Reconciliation"},

    /*051*/ {TYP_ASC, 0, 3, "Currency code, Cardholder billing"},

    /*052*/ {TYP_BIN, 0, 8, "Personal identification number, PIN) data"},

    /*053*/ {TYP_BIN, 2, 48, "Security related control information"},

    /*054*/ {TYP_ASC, 3, 120, "Amounts, additional"},

    /*055*/ {TYP_BIN, 3, 255, "IC card system related data"},

    /*056*/ {TYP_BIN, 3, 255, "Original data elements"},

    /*057*/ {TYP_BCD, 0, 3, "Authorization life cycle code"},

    /*058*/ {TYP_BCD, 2, 11, "Authorizing agent institution Id Code"},

    /*059*/ {TYP_ASC, 3, 999, "Transport data"},

    /*060*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*061*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*062*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*063*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*064*/ {TYP_BIN, 0, 8, "Message authentication code field"}

 

#if ISO_FLDS==128

 ,

 /*065*/ {TYP_BIN, 0, 8, "Reserved for ISO use"},

    /*066*/ {TYP_ASC, 3, 204, "Amounts, original fees"},

    /*067*/ {TYP_BCD, 0, 2, "Extended payment data"},

    /*068*/ {TYP_BCD, 0, 3, "Country code, receiving institution"},

    /*069*/ {TYP_BCD, 0, 3, "Country code, settlement institution"},

    /*070*/ {TYP_BCD, 0, 3, "Country code, authorizing agent Inst."},

    /*071*/ {TYP_BCD, 0, 8, "Message number"},

    /*072*/ {TYP_ASC, 3, 999, "Data record"},

    /*073*/ {TYP_BCD, 0, 6, "Date, action"},

    /*074*/ {TYP_BCD, 0, 10, "Credits, number"},

    /*075*/ {TYP_BCD, 0, 10, "Credits, reversal number"},

    /*076*/ {TYP_BCD, 0, 10, "Debits, number"},

    /*077*/ {TYP_BCD, 0, 10, "Debits, reversal number"},

    /*078*/ {TYP_BCD, 0, 10, "Transfer, number"},

    /*079*/ {TYP_BCD, 0, 10, "Transfer, reversal number"},

    /*080*/ {TYP_BCD, 0, 10, "Inquiries, number"},

    /*081*/ {TYP_BCD, 0, 10, "Authorizations, number"},

    /*082*/ {TYP_BCD, 0, 10, "Inquiries, reversal number"},

    /*083*/ {TYP_BCD, 0, 10, "Payments, number"},

    /*084*/ {TYP_BCD, 0, 10, "Payments, reversal number"},

    /*085*/ {TYP_BCD, 0, 10, "Fee collections, number"},

    /*086*/ {TYP_BCD, 0, 16, "Credits, amount"},

    /*087*/ {TYP_BCD, 0, 16, "Credits, reversal amount"},

    /*088*/ {TYP_BCD, 0, 16, "Debits, amount"},

    /*089*/ {TYP_BCD, 0, 16, "Debits, reversal amount"},

    /*090*/ {TYP_BCD, 0, 10, "Authorizations, reversal number"},

    /*091*/ {TYP_BCD, 0, 3, "Country code, transaction Dest. Inst."},

    /*092*/ {TYP_BCD, 0, 3, "Country code, transaction Orig. Inst."},

    /*093*/ {TYP_BCD, 2, 11, "Transaction Dest. Inst. Id code"},

    /*094*/ {TYP_BCD, 2, 11, "Transaction Orig. Inst. Id code"},

    /*095*/ {TYP_ASC, 2, 99, "Card issuer reference data"},

    /*096*/ {TYP_BIN, 3, 999, "Key management data"},

    /*097*/ {TYP_BCD, 0, 1+16, "Amount, Net reconciliation"}, /* was ISO_AMOUNT */

    /*098*/ {TYP_ASC, 0, 25, "Payee"},

    /*099*/ {TYP_ASC, 2, 11, "Settlement institution Id code"},

    /*100*/ {TYP_BCD, 2, 11, "Receiving institution Id code"},

    /*101*/ {TYP_ASC, 2, 17, "File name"},

    /*102*/ {TYP_ASC, 2, 28, "Account identification 1"},

    /*103*/ {TYP_ASC, 2, 28, "Account identification 2"},

    /*104*/ {TYP_ASC, 3, 100, "Transaction description"},

    /*105*/ {TYP_BCD, 0, 16, "Credits, Chargeback amount"},

    /*106*/ {TYP_BCD, 0, 16, "Debits, Chargeback amount"},

    /*107*/ {TYP_BCD, 0, 10, "Credits, Chargeback number"},

    /*108*/ {TYP_BCD, 0, 10, "Debits, Chargeback number"},

    /*109*/ {TYP_ASC, 2, 84, "Credits, Fee amounts"},

    /*110*/ {TYP_ASC, 2, 84, "Debits, Fee amounts"},

    /*111*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},

    /*112*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},

    /*113*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},

    /*114*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},

    /*115*/ {TYP_ASC, 3, 999, "Reserved for ISO use"},

    /*116*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*117*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*118*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*119*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*120*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*121*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*122*/ {TYP_ASC, 3, 999, "Reserved for national use"},

    /*123*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*124*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*125*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*126*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*127*/ {TYP_ASC, 3, 999, "Reserved for private use"},

    /*128*/ {TYP_BIN, 0, 8, "Message authentication code field"}

#endif /*ISO_FLDS==128*/

 

5       报文内容样例

     内容就是按照8583规定的样式,将对应位的内容对应在相应的位置上。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值