基于ISO8583协议服务端与POS机数据交互

来源:互联网 发布:mac装win10设置电源 编辑:程序博客网 时间:2024/05/17 22:56

最近公司项目涉及到充值卡消费,要求服务端与终端应用通过ISO8583协议进行通信,写点东西供有需要的同学们参考。

    大概了解了下需求,不是很复杂,包括签到、刷卡消费、撤销、余额查询等接口。网上看了下java通信相关的框架,比较突出的有mina、netty,mina的资料比较多些,而且和spring整合比较方便,最终选择的mina作为底层通信框架。

    关于电子交易框架,查了些资料,涉及到了jPOS系统,j8583包等。看了下jPOS,比较庞大,成型的电子交易缴费系统,小项目和它整合起来有点麻烦,也没有必要。再看了下j8583包,项目比较简洁,项目地址:http://j8583.sourceforge.net/

常用的方法,消息工厂类基本提供了,比如消息的解析、创建、消息头的处理,以及协议中支持的多种数据类型转换等等。不过,在测试使用过程中发现一些问题,如:二进制数据的编解码、不支持中文编码、变长字段长度算法不对等等,针对这些问题,对源码进行了修改,基本上满足项目要求了。下面就大概介绍下如何结合使用:

1、开发环境

    数据库方面,考虑项目面向一个商业区,数据量不是很大,采用mysql5.5 ,版本还算稳定。(安装的时候注意几个关键字 :编码、innodb、大小写忽略)

    采用mybatis框架作为数据库访问层

    当然少不了spring,不解释

    分层架构,多工程自动部署,采用maven自动构建发布(网上找不到含j8583的仓库,需要自己上传私服)

    开发工具 eclipse4.2 kepler,预装了svn、maven等插件,jdk1.6

2、工程搭建

   使用maven 命令行 创建所需工程(略),并添加相关依赖,spring、mina、j8583、本地工程等

   主程序入口:

    

spring配置如下,即spring启动上下文自动启动mina并绑定端口监听



自定义消息处理相关配置:


消息处理器

消息处理器ISOMessageHandler 继承了mina提供的IoHandlerAdapter类,自行实现以下方法

sessionOpened(IoSession session)

messageReceived(IoSession session, Object message)

sessionClosed(IoSession session)

exceptionCaught(IoSession session, Throwable cause)

注意messageReceived方法,session为当前会话session对象,message为经过自定义解码器解码后所得对象,由于使用到j8583包完成协议封装,框架内传递的对象为IsoMessage对象,进一步封装成Message,添加tpdu头、大小属性,如下:


所以,使用message时直接强转成Message对象即可。

messageReceived方法中实现调用业务处理类处理


自定义消息编码解码器

编码器用于将Message对象转换成协议报文,自定义消息编码器用于将终端传送过来的请求报文解析成Message对象。如下实现:

ISO8583Decoder 继承 CumulativeProtocolDecoder 自行实现boolean doDecode(IoSession session, IoBuffer in,

ProtocolDecoderOutput out) 方法进行解码操作

ISO8583Encoder 继承 ProtocolEncoderAdapter 自行实现encode(IoSession ioSession, Object msg, ProtocolEncoderOutput out) 方法进行编码操作

业务处理工厂类

提供各种业务场景下对应的消息处理器


业务处理工厂的spring配置


根据消息类型自动调用相应的Handler处理

BusinessHandler业务处理类

每个业务处理类均继承了抽象业务处理类AbstractBusinessHandler,该抽象类实现了消息的基本处理逻辑,如校验消息有效性、校验参数合法性,mac计算等等,然后由具体的业务处理实现业务处理

例如签到处理类SignUpHandler只需实现以下方法

@Override

public void handleBusiness(IsoMessage req, IsoMessage resp)

该方法入参为由iso8583报文实例化来的请求对象,业务处理逻辑实现后,只需要设置好返回的IsoMessage resp对象即可。



以上。欢迎指正。

0 0
原创粉丝点击