游戏内统一支付系统设计与实现
2017-10-25 10:34
537 查看
统一支付流程设计如下:
客户端:
![](http://www.vimer.cn/wp-content/uploads/2014/09/11.png)
服务器端:
![](http://www.vimer.cn/wp-content/uploads/2014/09/21.png)
简单解释一下:
每次支付开始,都要让服务器生成一个订单作为此次支付的记录,订单的id即为 bill_id。订单有4中状态:订单生成,支付失败,支付成功,发货成功。
pay_server即为统一支付系统的服务器端,考虑到调用量和方便调试,使用了简单的http协议+json+sign的方式
对于服务器内部,唯一麻烦的一点是,《等待pay_server支付结果通知》这个接口。因为这个http请求需要支持挂起,在第三方支付服务器通知了pay_server之后,pay_server 根据通知里面透传的bill_id 将订单状态修改后,再给客户端结果。
客户端:
基于这一点,我们就可以做一个同一个工厂函数,将这个工厂函数类封装成一个jar包。
同时,我们对每一种支付方式,都封装出一个统一的接口,而工厂函数返回的即这样一个接口的实现。当某一种支付方式的封装类不存在时,就捕获这个异常,并返回NULL。
统一接口的代码如下:
工厂函数的代码如下:
上面的方法是只封装了一个factory函数的jar包,其他的对每种支付的封装还是走源码的方式。
客户端:
![](http://www.vimer.cn/wp-content/uploads/2014/09/11.png)
服务器端:
![](http://www.vimer.cn/wp-content/uploads/2014/09/21.png)
简单解释一下:
每次支付开始,都要让服务器生成一个订单作为此次支付的记录,订单的id即为 bill_id。订单有4中状态:订单生成,支付失败,支付成功,发货成功。
pay_server即为统一支付系统的服务器端,考虑到调用量和方便调试,使用了简单的http协议+json+sign的方式
对于服务器内部,唯一麻烦的一点是,《等待pay_server支付结果通知》这个接口。因为这个http请求需要支持挂起,在第三方支付服务器通知了pay_server之后,pay_server 根据通知里面透传的bill_id 将订单状态修改后,再给客户端结果。
客户端:
基于这一点,我们就可以做一个同一个工厂函数,将这个工厂函数类封装成一个jar包。
同时,我们对每一种支付方式,都封装出一个统一的接口,而工厂函数返回的即这样一个接口的实现。当某一种支付方式的封装类不存在时,就捕获这个异常,并返回NULL。
统一接口的代码如下:
12345678910111213141516171819202122232425262728293031323334353637383940 | public abstract class PaymentInterf { /** * 初始化统一方法 * @param context 上下文 * @param parameters 初始化时需要的参数 数组 * 1、移动 parameters--》mmid 、mmkey * 2、联通 parameters: * string appid 应用编号 * string cpCode 开发商编号 * string cpid 开发商VAC资质编号 * string company 开发者公司名字 * string phone 开发者客服电话号码 * string game 应用名称 * UnipayPayResultListener mCallBack 初始化函数回调结果(目前 只有联通多了一个非String类型的参数) * * 3、Amazon初始化 * suk * callBack * */ public abstract void init(Context context,Object...parameters); /** * 支付统一函数 * @param context 上下文 * @param parameters 支付时需要传递的参数 如 payCode billId 。。。 */ public abstract void pay(Context context,Object...parameters); public static void billDeliver(String appKey, String billID) { HttpLobbiesService.g().billDeliver(appKey, billID, new HttpLobbiesService.Callback() { @Override public void onResult(ResultInfo info) { if (info != null && info.getRetCode() == 0) { Log.e("billDeliver", info.getRetCode() + "/:" + info.getObj()); } } }); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class PaymentFactoy { public static PaymentInterf producePay(int billTypy){ try { switch (billTypy) { case Constant.BILL_TYPE_MMCNCCPAY: return MMPayInstance.getInstance(); case Constant.BILL_TYPE_DIANXIN: return CTEStoreInstance.getInstance(); case Constant.BILL_TYPE_UNIPAY: return UnicomInstance.getInstance(); case Constant.BILL_TYPE_TAOBAO: return TaoBaoInstance.getInstance(); case Constant.BILL_TYPE_WEIPAY: return WeiPayInstance.getInstance(); case Constant.BILL_TYPE_WIMI: return WeiMiInstance.getInstance(); default: break; } } catch (Exception e) { e.printStackTrace(); return null; } return null; }; } |
上面的方法是只封装了一个factory函数的jar包,其他的对每种支付的封装还是走源码的方式。
相关文章推荐
- 基于PHP的统一检索系统的设计与实现
- 一个典型PHP支付系统的设计与实现
- 【游戏设计模式】之二 论撤消重做、回放系统的优雅实现:命令模式
- 游戏日志系统设计与实现
- 观点:关于游戏系统的规划、设计与实现。
- 游戏后台定时器系统设计与实现
- 【游戏设计模式】之二 论撤消重做、回放系统的优雅实现:命令模式
- 一个典型PHP支付系统的设计与实现
- 游戏任务成就体系的实现(附七):成就系统基于Redis的数据库访问设计实现
- PHP支付系统的设计与实现典型案例
- 【游戏设计模式】之二 论撤消重做、回放系统的优雅实现:命令模式
- 基于JSON数据交换模型的实时支付系统设计和实现
- 游戏任务成就体系的实现(附三):成就系统基于Mysql+Cache的数据库访问设计实现
- 转:ATMC统一平台系统的设计和实现
- 企业级服务器设计与实现经验之插件系统基础篇
- 局域网实时通信系统的设计与实现(1)
- 简单测控系统的设计与实现
- 【一个批量计算的调度系统的设计与实现】如果需要对成千上万的网络抓包数据文件在规定的时间内进行解析,应该怎么做?
- Oracle BPM(原Aqualogic)系统设计:动态化实现 ---- RoyZhang
- 模块管理常规功能自定义系统的设计与实现(22--第二个模块的加入)