游戏平台支付对接模型(以91代币充值为例)
前提准备
平台方
1.会与支付渠道对接好,client端提供sdk提供对login,pay的界面支持。
2.会要求游戏方后台提供notifyURL
3.对每笔订单,不但要提供通知,还要提供查询接口,防止漏单。
以91为例:
1.91的后台配置。 配置一个支付通知地址,必须是80端口。配置虚拟币相关。
2.客户端91提供的接口int 为ndUniPayForCoin(String cooOrderSerial, int needPayCoins, String payDescription ,Context ctx);
其中 cooOrderSerial 是由游戏方后端生成的唯一订单号。
payDescription是透传参数。
needPayCoins 是需要的虚拟币的数量。
游戏方服务端
1. 游戏方服务端DB大致如下
oid0001 | kin(用户名) | 50(金币) | 新生成订单,短时间不跟平台方通信检查支付状态变更(状态0) |
oid0002 | kin(用户名) | 50(金币) | 有效订单,由于支付通常是异步的,要过一段时间开始轮询check(状态1) |
oid0003 | kin(用户名) | 50(金币) | 完成订单,支付结束。(状态2,可能支付成功,也可能支付失败) |
oid0004 | kin(用户名) | 50(金币) | 关闭订单。(状态3 这个订单不用再管了) |
2. 游戏方服务端应该提供 createOrder接口。
该接口被调用时,生成订单,此时订单为状态0。
设定一定长时间等待client通知或平台方通知,如果等不到,那么就跟平台方查询订单支付状态一次。
轮询出结果了,则改订单状态为状态2或4.
req { uid, coins, [sign] } resp { code, oid }
3. 游戏方服务端提供checkOrder接口。
该接口被调用时,修改订单为状态1。
设定一定短时间等待notify,如果等不到,那么就轮询跟平台方查询订单支付状态。
轮询出结果了,则改订单状态为状态2。
req { oid, [sign] } resp { code, oid,status }
4.提供notify接口,供平台方通知支付结果。
只要收到通知,那么就修改订单为状态2.
游戏方客户端
1.首先是使用该平台的账户来登录
2. 调用 createOrder 得到oid
3. 将oid传给 平台的sdk,完成支付。如果平台的sdk返回“支付完成”,那么checkOrder.
4. 跟自己的服务器同步数据即可。
最后说几句
在这个模型下,订单在( 状态0 && 没有到定时检测时间的间隙 && 没有收到notify) 是唯一可能出现漏单的地方。
CSDN的博客编辑器真难用。