最近在做中国银行的一个快捷支付渠道,使用的是 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<String,String>数据(只组装需要的数据域,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校验(如有)
原来的pos用c语言开发的,与银联后台通信走的是8583协议。那么用go来做,得实现个go语言8583协议报文解析 且若想在电脑上跑交易,做个工具。用c语音处理起来不方便。用go还可以在电脑上跑交易。 于是用go语言做一个8583解析,方便使用 https://github.com/yangyongzhen/go8583/ package up8583 import ( "errors"
一直以来做嵌入式软件开发,跟银联8583协议通信打交道太多了。 最近有需要把8383协议的解析用到android上,但是搜遍了整个互联网,没发现有哪个简单好用点的java版8583解析库。就自己动手自己做一个吧,让其尽可能的简单,直观 如果在这个互联网上谁遇到过比这个还简单直观的,请留言我,我观摩下再进一步改进。 来做个对比,J8583CN :中国版的8583报文Java实现,实现了对8583报文
j8583-master ............\.gitignore ............\README.md ............\build.gradle ............\j8583.iml ............\j8583.ipr ............\pom.xml ............\src ............\...\main ........
一直以来做嵌入式软件开发,跟银联8583协议通信打交道太多了。 最近有需要把8383协议的解析用到android上,但是搜遍了整个互联网,没发现有哪个简单好用点的java版8583解析库。就自己动手自己做一个吧,让其尽可能的简单,直观 如果在这个互联网上谁遇到过比这个还简单直观的,请留言我,我观摩下再进一步改进。 来做个对比,J8583CN :中国版的8583报文Java实现,实现了对8583报文
本文向大家介绍C#如何解析http报文,包括了C#如何解析http报文的使用技巧和注意事项,需要的朋友参考一下 下面通过一段内容有文字说明有代码分析,并附有展示图供大家学习。 要解析HTTP报文,需要实现以下操作: 读取HTTP报头提供的各种属性 分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,按报头中提供
本文向大家介绍android JSON解析数据 android解析天气预报,包括了android JSON解析数据 android解析天气预报的使用技巧和注意事项,需要的朋友参考一下 概要 笔者近期做到对天气预报JSON数据解析,在此小记。 天气预报接口:http://wthrcdn.etouch.cn/weather_mini?citykey=101200101 JSON数据如下: 最终解析效果
本文向大家介绍Android Volley框架全面解析,包括了Android Volley框架全面解析的使用技巧和注意事项,需要的朋友参考一下 Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpCl
本文向大家介绍Android SwipeMenuListView框架详解分析,包括了Android SwipeMenuListView框架详解分析的使用技巧和注意事项,需要的朋友参考一下 周末 特地把Android SwipeMenuListView(滑动菜单)的知识资料整理一番,以下是整理内容: SwipeMenuListView(滑动菜单) A swipe menu for ListView.
本文向大家介绍wxPython修改文本框颜色过程解析,包括了wxPython修改文本框颜色过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了wxPython修改文本框颜色过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 由于工作需要使用wxPython实现一个美观的新增数据界面,这个界面上的文本框要像html中文本框一样可
本文向大家介绍Spring AspectJ AOP框架注解原理解析,包括了Spring AspectJ AOP框架注解原理解析的使用技巧和注意事项,需要的朋友参考一下 什么是AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 AspectJ是一个基于Java语言的AOP框
本文向大家介绍Quartz.Net调度框架配置解析,包括了Quartz.Net调度框架配置解析的使用技巧和注意事项,需要的朋友参考一下 在平时的工作中,估计大多数都做过轮询调度的任务,比如定时轮询数据库同步,定时邮件通知等等。大家通过windows计划任务,windows服务等都实现过此类任务,甚至实现过自己的配置定制化的框架。那今天就来介绍个开源的调度框架Quartz.Net(主要介绍配置的实现
本文向大家介绍Android注解框架对比分析,包括了Android注解框架对比分析的使用技巧和注意事项,需要的朋友参考一下 Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上。然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解),也可以在程序运行时利用反射得到注解做出相应的处理(人称运行时注解)。 开