file-type

金融软件开发基石:8583报文详解与字段结构解析

DOC文件

4星 · 超过85%的资源 | 下载需积分: 10 | 93KB | 更新于2024-07-27 | 110 浏览量 | 102 下载量 举报 2 收藏
download 立即下载
8583报文详解是一篇详细介绍金融软件开发中常用的ISO 8583协议的文章。8583协议是一种国际通用的通信协议,特别适用于银行卡交易和金融服务领域,用于传输和解析复杂的金融数据。本文的核心内容围绕8583报文的结构、位图的作用以及域的定义展开。 8583报文的主体由位图和多个字段域组成,位图位于报文的起始位置,用于指示报文中的域配置。位图采用定长的B16格式,即16位二进制,占用128比特,可以区分两种模式:基本位图(64个域)和扩展位图(128个域)。使用哪种位图取决于业务需求,比如若需使用65至128域,就需要设置位图的第一位为1。 每个字段域由以下几个部分组成: 1. `bit_flag`:指示域的数据类型,可能是字符串(0)、整数(1)或二进制(2)。 2. `data_name`:字段的名称,如"PRIMARYACCOUNTNUMBER"。 3. `length` 或 `length_in_byte`:字段的长度,如果是固定长度,则用`length`表示;如果为变长,使用`length_in_byte`表示实际长度,并配合`variable_flag`来决定变长方式(2位或3位)。 4. `variable_flag`:变长标志,0表示非变长,2或3分别表示2位或3位变长。 5. `datatype`:再次确认数据类型。 6. `data`:存储具体值的地方。 7. `attribute`:保留字段,通常不被使用。 文章举例了两个域的定义:FLD1为位图扩展标志,FLD2为主账户号,FLD3为处理代码,FLD4为交易金额,它们分别对应着位图和字段的各个属性。理解并掌握这些细节对于开发者在设计和解析8583报文时至关重要,因为这涉及到数据的正确打包、传递和解码,确保金融交易的准确性和安全性。 学习8583报文不仅需要熟悉其报文结构,还要关注报文规范的细节,包括不同域的使用场景和意义,这对于金融软件的开发者来说是一项必备技能。通过深入研究和实践,开发人员能够有效构建和维护支持8583协议的系统,提高交易处理效率和准确性。

相关推荐

filetype
最近在做中国银行的一个快捷支付渠道,使用的是 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
lx76939412
  • 粉丝: 261
上传资源 快速赚钱