J2ME的移动支付系统的客户端的实现
整个J2ME客户端的逻辑架构是由若干个功能模块组成的,这些功能模块覆盖了网络通信、用户界面、安全等各个方面的职能,并通过模块间的通信共同实现了移动支付系统客户端的功能。
逻辑结构如图2所示,其中A~F的意义如下:
A:用户请求交易 / 交易操作结果
B:用户输入的交易请求信息 / 服务器端返回的交易结果
C:经过XML加密的请求信息/ 经过XML签名认证的返回结果
D:经过XML签名的已加密请求信息 / 解析过的XML返回结果
E:组装好的经过XML签名的已加密请求信息的XML数据包 / 网络通信模块接收到的XML数据包
F:发向服务器的XML数据包 / 接收到的来自服务器的XML数据包
黑色双箭头所表示的是J2ME特有的RMS数据库的数据。数据库访问模块负责调用J2ME的RMS数据库的功能接口,对用户界面模块用的个性化设置,XML加密和签名用的私匙和公匙对,网络通信模块用的HTTP访问地址和设置等等数据进行存取,而其它模块则通过访问数据库模块存取所需数据。
在客户端系统的实现中,使用了一些第三方API库:kXML和Bouncy Castle API。其中kXML是XML组装/解析的工具,而Bouncy Castle API是J2ME应用程序专用的XML加密/解密和签名/验证的工具。
客户端部分的主要模块实现如下:
1)数据库访问模块
数据库访问模块是所有其它模块需要用到的模块,这是因为它把整个J2ME客户端需要用到的程序配置和用户设置存取到J2ME的数据库中。在J2ME MIDP中定义了一个简单的基于记录的数据库管理系统(Record Management System,RMS),在RMS中Record Store等同于一般数据库系统中的表(Table),它是记录了一系列记录的文件。
数 据库访问模块对RMS进行操作,并对外部模块提供了两个存取数据的接口:
按名称保存数据到RMS的接口:public void setDataToRecordStore(String name, String data)
按名称从RMS获取数据的接口:public String getDataFromRecordStore(String name)
2)用户界面模块
用户界面模块实现人机交互工能,接收用户输入,并把操作结果以友善的形式进行输出。除了使用J2ME提供的Display、Screen、Label、Command、Alert、Form、TextField等高级用户界面控件外,还需要使用J2ME提供的Canvas、Image等等低级用户界面API,来实现动画等特效。
3)XML加密/解密模块
这两个模块负责对服务器端传来的用RSA算法公匙加密的共享密匙进行解密,然后用共享密匙对机密信息使用Triple DES算法进行加密。
通过使用Bouncy Castle API密码术包,我们可以轻松地对所需要传输的交易请求里面的机密信息进行XML加密和解密。它所提供的org.bouncycastle.crypto包有加密/解密中需要用到的绝大部分的类,另外org.bouncycastle.util包提供了包括Base64编码转换、Hex编码转换等有用的工具类。在Bouncy Castle API中,公匙、私匙和共享密匙都是对象,在试图使用它们之前,必须要通过它们的主要参数重构出这些密匙对象。RSA的公匙有Modulus和Exponent两个主要参数,RSA私匙除了这两个参数外,还有privExp、dp、dq、p、q、qInv等几个参数,而Triple DES共享密匙只有单一的key参数。在传递这些密匙参数或加密的相关信息时,由于XML加密的很多元素指定使用Base64编码,因此还需要用到Base64这个工具类。我们定义了一个Encryptor类来处理所有加密/解密的相关的问题。定义的接口如下:
TripleDES加密接口:public byte[] encryptTripleDES (byte[] data) throws CryptoException
RSA解密接口:public synchronized byte[] decryptRSA(byte[] data) throws CryptoException
4)XML签名/验证模块
XML签名过程中,首先生成原始数据的摘要,再对摘要进行签名。生成摘要的算法一般使用SHA1算法。Bouncy Castle API包同样提供了生成签名用的摘要的SHA1Digest类,以及用于数字签名的RSAEngine、PSSSigner等类。我们定义Signature类封装所有的处理签名的功能代码。定义的接口如下:
生成摘要:private byte[] getDigest(String mesg) throws Exception
使用RSA私匙签名:public byte[] RSASign(byte[] toSign) throws Exception
5)XML组装/解析模块
为了简化问题,XML组装可以使用简单的字符串拼接来实现,而对于XML解析工作,我们使用kXML来处理。它是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。
kXML有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。DOM是一个与XML相互作用的简单方法,通常这个XML是一棵完整的XML树,被解析成一个存放在存储器中的节点结构,可以通过遍历这棵树获取所有节点信息。它非常简单易用,但是因为整棵树存在于存储器中造成存储器的负担。与DOM不同,Pull语法分析让程序员从语法分析程序中"拉"出下一个事件,Pull语法分析使处理状态改变更加容易,因为你可以发送分析器到不同的函数,维护它们自己的状态变量。此外,Pull特别适用于J2ME环境中的需要保持尽可能地少的内存占用的情况,因此我们采用Pull方法进行XML的解析。定义接口如下:
根据XML节点名称获取对应值:private String getXMLNodeValue(String nodeName)
6) 网络通信模块
在J2ME的MIDP 1.0 API中,网络通信协议支持UDP、HTTP、Socket等等。虽然从理论上说可以使用Socket或UDP协议与外界进行通信,但是一些厂商的MIDP设备可能不支持这些协议,使用这些协议进行通信可能造成程序移植上的问题。而HTTP由于是当今互联网最主要的通信协议,因此基本上所有厂商的移动终端设备都支持HTTP协议。因此我们采用HTTP协议进行通信。下面给出发送和接收数据的代码:public String sendAndReceiveByHttp(String url, String strToSend) throws Exception
{
HttpConnection hc = (HttpConnection)Connector.open(url, Connector.READ_WRITE);
hc.setRequestMethod(HttpConnection.POST);
hc.setRequestProperty(“Connection”, “Keep-Alive”);
DataOutputStream dos = hc.openDataOutputStream();
dos.writeUTF(strToSend);//向目的URL发送数据
dos.flush();
dos.close();
DataInputStream dis = hc.openInputStream();
String strReceived = dis.readUTF();//接收目的URL的响应数据
dis.close();
return strReceived;
}
分享到:
相关推荐
摘要:移动支付是移动电子商务中的最重要的...本文讨论一个基于J2ME的以第三方支付平台为中心的移动支付系统的特点和优越性,并给出这个系统详细的设计与实现过程。 关键词:移动支付; J2ME; XML加密; XML签名
计费,移动支付,客户端实现,J2ME计费,移动支付,客户端实现,J2ME
基于J2ME的移动支付系统终端应用的实现
【摘 要】借助广泛使用...该系统基于J2ME和Web services技术,其中J2ME用于手机端客户程序的开发,而Web Services技术则用于处理服务器端和客户端之间的交互,能够配置在移动通信设备上,满足了随时随地的移动学习需要。
教程名称:J2ME移动开发实战教学系列视频教程课程目录:【】1.体系介绍和环境配置(J2ME移动开发实战教学系列视频)【】10.数值运算,字符串处理,时间管理(J2ME移动开发实战教学系列视频)【】11.随机数,集合和...
J2ME 移动挂号系统的设计与实现.pdf
基于J2ME_J2EE的移动公交车查询系统的设计与实现
80种基于J2ME的移动支付系统的设计与实现.pdf
j2me移动开发实战教学视频源代码.rar j2me移动开发实战教学视频源代码.rar j2me移动开发实战教学视频源代码.rar j2me移动开发实战教学视频源代码.rar j2me移动开发实战教学视频源代码.rar
java毕业设计——java基于J2ME的手机游戏开发设计与实现(论文+源代码).zip java毕业设计——java基于J2ME的手机游戏开发设计与实现(论文+源代码).zip java毕业设计——java基于J2ME的手机游戏开发设计与实现(论文+源...
J2ME_移动通信介绍J2ME_移动通信介绍J2ME_移动通信介绍J2ME_移动通信介绍J2ME_移动通信介绍J2ME_移动通信介绍
Java嵌入式开发之j2meJava嵌入式开发之j2meJava嵌入式开发之j2me
这是邮件收发的客户端源码,已经做好了和服务端连接相关的接口。
有过 Java 经验的朋友一定会奇怪,在 Java 企业级应用(J2EE)和 Java 移动应用(J2ME)横行 Java 天下的时候,我们为什么选择了 Java 游戏开发?原因很简单,游戏开发主要是利用 J2SE 技术,而 J2EE、J2ME 都是在...
该包详细阐述了如何搭建j2me开发环境,有需要的自己下一下!!
java 游戏开发教程j2me教程java java 高手毕竟之路java 游戏开发教程j2me教程java java 高手毕竟之路java 游戏开发教程j2me教程java java 高手毕竟之路java 游戏开发教程j2me教程java java 高手毕竟之路java 游戏...
利用socket技术,实现了手机与服务端进行聊天。 模拟器上测试成功。
J2ME移动开发实战精解教学J2ME移动开发实战精解教学
《J2ME移动软件程序设计》-卢军-电子教案-6931