您的位置:首页 > 其它

游戏内统一支付系统设计与实现

2017-10-25 10:34 537 查看
统一支付流程设计如下:

客户端:



服务器端:



简单解释一下:
每次支付开始,都要让服务器生成一个订单作为此次支付的记录,订单的id即为 bill_id。订单有4中状态:订单生成,支付失败,支付成功,发货成功。
pay_server即为统一支付系统的服务器端,考虑到调用量和方便调试,使用了简单的http协议+json+sign的方式

对于服务器内部,唯一麻烦的一点是,《等待pay_server支付结果通知》这个接口。因为这个http请求需要支持挂起,在第三方支付服务器通知了pay_server之后,pay_server 根据通知里面透传的bill_id 将订单状态修改后,再给客户端结果。

客户端:

基于这一点,我们就可以做一个同一个工厂函数,将这个工厂函数类封装成一个jar包。

同时,我们对每一种支付方式,都封装出一个统一的接口,而工厂函数返回的即这样一个接口的实现。当某一种支付方式的封装类不存在时,就捕获这个异常,并返回NULL。

统一接口的代码如下:

12345678910111213141516171819202122232425262728293031323334353637383940public 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包,其他的对每种支付的封装还是走源码的方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: