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;

}

原文地址

转载于:https://www.cnblogs.com/cnlht/archive/2011/02/26/9495725.html

J2ME的移动支付系统的客户端的实现相关推荐

  1. andy学java系列之J2ME的移动支付系统的设计与实现

    andy学java系列 J2ME的移动支付系统的设计与实现 ----三星SDK支付API介绍 移动支付是移动电子商务中的最重要的部分之一.安全性.私密性.易用性是移动支付的最重要的几个问题.目前有许多 ...

  2. java系列之J2ME的移动支付系统的设计与实现

    andy学java系列 J2ME的移动支付系统的设计与实现 ----三星SDK支付API介绍 移动支付是移动电子商务中的最重要的部分之一.安全性.私密性.易用性是移动支付的最重要的几个问题.目前有许多 ...

  3. 记一次支付系统的设计体验

    0.写在前面的话 支付系统是一个老生常谈的话题,我也相信每个公司开发的支付系统不尽相同,因为业务形态并不太一样. 在此,我并不想讲一个大而全的支付系统,个人也没有能力去阐述. 在我看来,一个支付系统应 ...

  4. 支付系统的对账处理与设计--转

    本文来自 微信公众号"凤凰牌老熊". 可以说,对账是支付系统最头疼的事情.每一笔交易,都要做到各参与者的记录能够吻合,没有偏差.对账系统的工作,是发现有差异的记录,即轧帐:然后通过 ...

  5. 支付系统整体设计:整体架构设计以及注意要点(三)

    一般来说,银行会提供两种支付途径:无跳转的快捷支付接口和带跳转的网银接口.前者在绑卡,支付的时候,不需要跳到银行页面上去处理,后者则需要在银行的网银页面上完成.显然前者对用户来说体验要好多了,用户流程 ...

  6. Go语言在扫码支付系统中的成功实践

    今天的内容主要分四个方面.第一,金融支付系统的一些特点;第二,我们的扫码支付系统技术选型;第三,系统迭代过程中的架构演进;第四,与Go相关的一些坑. 金融支付系统的一些特点 图 1 首先从业务流程入手 ...

  7. java 支付重复问题_Airbnb支付系统如何在分布式环境下避免重复打款

    原文链接:https://medium.com/airbnb-engineering/avoiding-double-payments-in-a-distributed-payments-system ...

  8. 探讨一下常见支付系统的对外接口

    作为一个具备用户交易能力的网站,丰富它的支付渠道对于获客和提高日活都 有不可估量的积极作用.算起来,我接触过的支付系统也有几十个了,在这里总结一下我所接触过的支付系统对外接口的设计方案. 1. 支付宝 ...

  9. TEEOS的实例-在线支付系统

    到了我最喜欢的环节了,我其实学习的过程中,对这些应用场景概念是十分的感兴趣的. 下面一起看看老师这本书的最后的一个部分应用篇-在线支付系统 内容来自<手机安全和可信应用开发指南> 1.简介 ...

最新文章

  1. bootstrap3中关于布局的两种样式
  2. 设置RabbitMQ远程ip登录
  3. 《少有人走的路:心智成熟的旅程》--[美]M·斯科特·派克
  4. Oracle shared server模式连接ORA-12519
  5. SQL SERVER将多行数据合并成一行(转载)
  6. JavaScript数据结构——队列(Queue)
  7. Java的getperiod_Java中的Period getYears()方法
  8. 强化学习 —— 资源清单
  9. ognl概念和原理详解
  10. Linux内核部件分析 设备驱动模型的基石kobject
  11. php 获取文件名 行号,PHP – 找到文件中的字符串,然后显示它的行号
  12. Typescript入门教程(B站黑马程序员)
  13. 鸿蒙 usb调试,刷机精灵如何打开usb调试模式
  14. 如何用代码实现发送qq邮件(详细代码)
  15. 【YOLO】物体识别算法的核心思想
  16. 计算机win10开机音乐,Windows10系统更改开关机声音的两种方法
  17. 狐狸共享账号服务器查询,卫星节目共享账号,狐狸(动物号)和苹果(水果号)共享节目一览表...
  18. 《大学章句集注》-读书笔记之一
  19. 中国股票市场底在哪?房产银行引领政策底
  20. 【Multisim仿真】CD4017+555流水灯

热门文章

  1. Redis学习(6)-常用命令
  2. 一、Ajax跨域访问
  3. Supervisor-类unix系统下的进程控制工具
  4. android Fragments详解六:处理fragement的生命周期
  5. 认识Linux系统服务(鸟哥18章)
  6. prototype 1.3.1 跟 ajax冲突!!!莫名其妙!
  7. lz0-007 读书笔记17
  8. echarts的dataZoom属性在移动端 h5+环境中无法左右滑动问题
  9. JavaScript 变量及数据类型
  10. 2019新的启程新的规划