解析ISO8583报文实例

本篇文章参考了中国银联POS终端规范,所以如有不明白的可以去我的资源里面下载。



现在我们有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



第一步

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。

JPOS API查询网址:http://jpos.org/doc/javadoc/index.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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
银联 ISO8583 文档: 前 言 VI 1 范围 1 2 规范性引用文件 1 3 术语和定义 1 3.1 受理方 (ACQUIRER) 1 3.2 发卡方 (ISSUER) 1 3.3 转入方 (TRANSFER-IN) 2 3.4 转出方 (TRANSFER-OUT) 2 3.5 交换系统 (BANK CARD SWITCHING SYSTEM) 2 3.6 请求 (REQUEST) 2 3.7 响应码 (RESPONSE CODE) 2 3.8 冲正 (REVERSAL) 2 3.9 清算 (SETTLEMENT) 2 3.10 交易 (TRANSACTION) 2 3.11 通知 (ADVICE) 2 3.12 报文 (MESSAGE) 2 3.13 数据包 (DATAGRAM) 2 4 公共支付交易处理说明 3 4.1 公共支付业务联机交易处理 3 4.1.1 委托关系建立/委托关系撤销(0100/0110) 3 4.1.2 订购(类似预授权0100/0110) 3 4.1.3 金融类交易(0200/0210) 5 4.1.4 金融类撤销交易(0200/0210) 8 4.1.5 查询类交易(0200/0210) 9 4.1.6 转账类交易(0200/0210) 10 4.1.7 冲正通知类交易(0420/0430) 10 4.1.8 金融通知类交易(0220/0230) 12 4.1.9 与服务提供商无关的交易 12 4.2 增值业务文件方式处理 13 4.2.1 非实时查询交易 13 4.2.2 非实时缴费/充值交易 14 4.2.3 批量代收/批量代付文件方式 14 4.2.4 委托关系建立/委托关系撤销文件方式 15 4.3 超时限定 16 4.4 公共支付平台二级清算处理 17 4.4.1 截账日切通知(0820/0830) 17 4.4.2 批结对账交易(0522/0532) 17 4.4.3 公共支付平台二级清算产生的交易处理流程 18 4.4.4 公共支付平台清分清算的时序 19 4.5 管理及安全控制交易处理 19 4.5.1 网络管理交易(0820/0830) 19 4.5.2 重置密钥(0800/0810) 21 4.6 交易的异常处理流程 21 4.6.1 概述 21 4.6.2 异常处理原则 21 4.6.3 通信异常 22 5 报文域定义 31 5.1 说明 31 5.2 数据类型定义 31 5.3 域名称及定义 31 5.3.1 报文头 31 5.3.2 MTI 报文类型 36 5.3.3 第一位图 37 5.3.4 第二位图 37 5.3.5 域2 主账号PAN 37 5.3.6 域3 交易处理码 38 5.3.7 域4 交易金额 40 5.3.8 域7交易传输时间 40 5.3.9 域11系统跟踪号 41 5.3.10 域12受卡方所在地时间 41 5.3.11 域13受卡方所在地日期 42 5.3.12 域14卡有效期 42 5.3.13 域15清算日期 42 5.3.14 域18商户类型 43 5.3.15 域22服务点输入方式码 43 5.3.16 域25服务点条件码 44 5.3.17 域26服务点PIN获取码 44 5.3.18 域32代理机构标识码 45 5.3.19 域33发送机构标识码 45 5.3.20 域35第二磁道数据 45 5.3.21 域36第三磁道数据 46 5.3.22 域37检索参考号 46 5.3.23 域39应答码 47 5.3.24 域41受卡机终端标识码 47 5.3.25 域42受卡方标识码 47 5.3.26 域43受卡方名称地址 47 5.3.27 域44附加响应数据 48 5.3.28 域48附加自定义数据 48 5.3.29 域49交易货币代码 54 5.3.30 域50清算货币代码 54 5.3.31 域52个人标识码数据 54 5.3.32 域53安全控制信息 55 5.3.33 域54实际余额 56 5.3.34 域59明细查询数据 57 5.3.35 域60自定义域 61 5.3.36 域61证件编号 63 5.3.37 域70网络管理信息码 66 5.3.38 域74 贷记交易笔数 67 5.3.39 域75 冲正贷记笔数 67 5.3.40 域76 借记交易笔数 67 5.3.41 域77 冲正借记笔数 67 5.3.42 域78 转账笔数 68 5.3.43 域79 冲正转账笔数 68 5.3.44 域80 查询笔数 68 5.3.45 域81 授权笔数 68 5.3.46 域82 贷记服务费金额 69 5.3.47 域84 借记服务费金额 69 5.3.48 域86 贷记交易金额 69 5.3.49 域87 冲正贷记金额 70 5.3.50 域88 借记交易金额 70 5.3.51 域89 冲正借记金额 70 5.3.52 域90原始数据元 70 5.3.53 域96报文安全码 71 5.3.54 域99清算机构代码 71 5.3.55 域100接收机构标识码 72 5.3.56 域102账户标识1 72 5.3.57 域103账户标识2 72 5.3.58 域121 交换系统保留 72 5.3.59 域122受理方保留 75 5.3.60 域123发卡方保留 75 5.3.61 域128报文鉴别码MAC 75 6 公共支付平台交易接口报文 77 6.1 说明 77 6.1.1 符号约定 77 6.1.2 报文格式说明示意 77 6.1.3 报文域条件数据元说明 78 6.2 公共支付平台联机交易报文 78 6.2.1 欠费查询/资金户余额查询报文 78 6.2.2 账单明细查询报文 79 6.2.3 银行卡余额查询 81 6.2.4 订购(预授权)报文 82 6.2.5 订购撤销(预授权撤销)报文 84 6.2.6 订购完成(预授权完成)报文 85 6.2.7 订购完成撤销(预授权完成撤销) 86 6.2.8 缴费/充值报文 87 6.2.9 缴费撤销报文 89 6.2.10 冲正通知报文 90 6.2.11 建立/撤销委托关系报文 93 6.2.12 查询委托关系报文 95 6.2.13 转账类交易报文 96 6.2.14 与服务提供商无关的交易报文 99 6.3 清分清算和日终批处理的报文接口 错误!未定义书签。 6.3.1 批结对账交易报文 错误!未定义书签。 6.3.2 截账日切通知报文 错误!未定义书签。 6.4 网络管理及安全控制报文 107 6.4.1 网络管理报文 107 6.4.2 安全控制报文 109 7 缴费终端接口报文 111 7.1 说明 111 7.1.1 标准接口报文及流程图 111 7.1.2 消息格式 111 7.1.3 消息格式的表示方法 111 7.2 委托关系建立/委托关系撤销终端报文 111 7.3 待缴费用/资金户余额查询终端报文 111 7.4 缴费账单明细查询终端报文 111 7.5 缴费/缴费撤销终端报文 111 7.6 银行卡转出/银行卡转入终端报文 111 7.7 终端签到 111 7.8 终端签退 错误!未定义书签。 7.9 终端批结对账交易、批上送完成通知(可选) 错误!未定义书签。 7.10 终端批上送记录(可选) 错误!未定义书签。 8 文件接口规范 111 8.1 概述 111 8.1.1 目的 111 8.1.2 适用范围 111 8.1.3 相关文档 111 8.2 文件存取方式说明 111 8.2.1 FTP方式 112 8.2.2 WEB方式 113 8.3 文件使用说明 115 8.3.1 基本的命名约定 115 8.3.2 记录格式基本约定 116 8.3.3 流水文件说明 120 8.3.4 批量代收/代付文件说明 121 8.4 文件格式说明 123 8.4.1 符号定义 123 8.4.2 流水文件格式 123 8.4.3 批量代收/代付文件格式 125 8.4.4 非实时待缴费用托管文件格式 129 8.4.5 委托关系文件格式 130 9 通信接口规范 131 9.1 目的 131 9.2 网络架构 132 9.3 网络接口 132 9.3.1 接入设备基本要求 132 9.3.2 通信软件接口 132 10 数据安全传输控制 134 10.1 个人标识(PIN)的加密和解密 134 10.1.1 PIN的长度 135 10.1.2 PIN的字符集 136 10.1.3 PIN格式 136 10.1.4 PIN异常的处理 137 10.2 报文来源正确性鉴别MAC 137 10.2.1 MAC报文域的选择 138 10.2.2 MAC域的构成规则 140 10.2.3 MAC的计算 140 10.2.4 MAC错误异常处理 141 附 录 A 142 参考文献 154

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值