项目集成第三方支付设计方案

现在越来越多的项目都要求集成第三方的支付平台,特别是在互联网项目中,下面简单说说项目中集成第三方支付平台的设计实现思路。
目前用得比较多的 第三方支付平台有支付宝、易宝、财付通、移动支付等,每种支付平台都提供了详细的支付接口文档及示例代码,要在自己的项目中实现集成第三方支付还是比较容 易的,但主要的问题在于,一个项目中一般都会集成多种支付方式,以方便用户的选择,那么,我们的项目中如何设计才能即保存业务层的稳定,又能方便地加入新 的 支付方式(开闭原则体现哦)。设计的思路就是抽象定不变的东西封装起来,变化的部分设计为接口单独封装,以达到灵活的扩展的目的。
对一些平台的支付流程进行研究总结后,我们发现,无论支付工具的接口怎么的不相同,但总的支付流程几乎是一样的,这个支付流程应该可以抽象出来,下面是一个支付过程的活动图:



在 这个活动图中,首先用户要选择购买的服务(虚拟点卡、金币、或会员服务等);在接下来进入支付方式(支付宝、易宝等)选择页面,服务器将根据用户选择的不 同支付方式,生成要向第三方支付服务器的请求参数,放回响应页面中;在新的页面中显示用户要支付的款项金额等信息,要求用户再次确认,如果用户确认后,用 户界面将转到第三方支付服务器,这个支付的过程我们就不用管了;如果用户在第三方支付服务器上付款成功,第三方服务器将会通知我们的服务器,告知我们一些 支付细节,这个时候,我们再在项目中再进行业务处理,比如:更改用户的业务状态。(注:支付参数提交过程可用get或post,参数后都要附加md5签名 字符串,安全性不用担忧,本人建议以get方式提交。)
经过上面的流程分析,我们可以把支付过程进一步总结为:支付请求参数的提交,以及支付成功回调的业务处理两个过程,根据这两个过程,我设计了类图(原图高清晰,请右键单独查看图片),并对之进行解释。


领域对象:
A、服务项目:可供用户选择的服务项目,包括名称、金额、时长等信息,这些信息在用户支付前进行选择;
B、用户:保存用户支付成功后的一些业务状态;
C、 支付记录:在用户离开我们的网站到第三支付界面前,我们的系统必须要保存一份支付记录,这个记录中有我方系统产生的唯一交易编号,交易状态为未成功;在支 付成功的回调中,我们从回调参数中取出我方系统产生的唯一交易编号,找到这条没有成功的交易记录,再填上第三方系统产生的唯一交易号(对账时要用),更改 支付记录状态为成功,最后更改用户业务状态。支付记录中会聚合服务项目及用户信息这两个对象,以方便在回调时找到支付的一些情况。
业务类设计:
PaymentAction 为支付处理控制器(可选择struts action或servlet做为父类),preparePay方法的主要作用是生成向第三方支付服务器提交的URL(有很多的支付信息要拼接),代码实 现步骤我已在图中进行了注明。其中有一点我要强调一下:我们页面中的付款金额,名称,描述等信息是固定的,而用户选择了不同的支付方式后,要生成不同支付 平台的参数,我的实现思路是,在控制器中通过request.getParameterMap()得到我们页面中输入的键值对,再转换成目标支付平台的参 数键值对,由于每个支付平台参数不同,我们就得把这个对应关系找一个地方单独存起来。
我设计了一个PayConfigurationReader 接口,里面包括读取键值映射、得到商户(我们系统)的ID,密钥等方法,这些方法都是通过对多个平台支付流程的理解后设计出来的,每个平台有一个自己的 properties参数存储文件,用来存放这个平台的配置信息,刚才我们所说的键值映射关系,就写在这个配置文件中。
具体支付平台实现类将实现PayConfigurationReader接口,完成自身平台相关操作。
如果你对流程不清楚的,或需要源代码的,可给我留言。

猜你喜欢

转载自ljh2008.iteye.com/blog/832634
今日推荐