手游SDK-支付

一、支付的基本流程

1)点击游戏支付按钮,游戏首先向游戏服务器请求充值,生成一个游戏订单号参数(注意这个订单号和下面的不是同一个)。即点击支付时,游戏会调用X_SDK的支付方法并传入商品金额,商品名称,游戏订单号参数等信息。
2)X_SDK与SDK服务器进行通信,向SDK服务器传递对应信息。即把商品金额,商品名称,游戏订单号参数等信息传给服务器。
3)SDK服务器生成唯一的订单号,同时在数据库中存储一条记录,状态是正在支付
4)SDK服务器把订单号返回给X_SDK
5)X_SDK带着订单号和相关充值参数,比如价格、商品名称等。调用具体的支付SDK(支付宝/微信/银联等),进行充值操作。并且需要把订单号,放入到具体支付SDK的自定义参数中。
6)同时,具体支付SDK申请支付参数的时候,一般都需要填写 支付回调地址 。这个支付回调地址就是SDK服务器对应的通知回调地址。
7)SDK服务器收到具体支付SDK的充值回调之后,会修改订单号的状态(支付成功/支付失败)。并回调支付成功/失败给X_SDK。
8)X_SDK把支付结果回调给游戏,游戏通知游戏服务器下发道具。

二、支付宝和微信等第三方支付的接入

1、接入支付的库 (支付宝官网微信官网
2、传入订单信息,发起调用支付宝和微信
3、接收支付宝和微信的回调

接入支付宝时需要考虑用户手机上是否有安装支付宝,如果没安装,需要调起支付宝的H5页面支付。
接入微信时,支付和社交登录等这些是集合到一起的,无法分开。所以如果之前已经集成过微信登录,就可以不用重复接入了。
注意:支付结果需要调用自己的服务器来确定,不能通过支付宝/微信的回调结果来判断。

三、SDK支付

1、定义ProductInfo,列出游戏需要传入SDK的参数。
一般就支付金额、服务器ID、商品名称、自定义回调透传信息(就是上述1中的参数)
2、先判断SDK是否已经登录。已登录才执行支付操作
3、获取获取充值列表。非必须,看需求。如果接入的第三方支付多,而且需要控制支付方式,则需要先获取充值列表。然后展示对应的支付方式。
4、向服务器请求订单号
请求的参数除了ProductInfo中的支付金额、服务器ID、商品名称、自定义回调透传信息等参数外,还包括pay_type、access_token、packageName、time等参数
示例代码:

  //向服务器请求订单号(用于放在SDK支付参数中的“自定义参数”)   
    public void createOrder(final Context context, int payType, int money, String callbackInfo, final OrderCallback callback) {
        RequestParams params = new RequestParams();//生成订单号所需的参数
        params.addQueryStringParameter("pay_money", String.valueOf(money));
        params.addQueryStringParameter("pay_type", String.valueOf(payType));
        PayManager.fillCommon(context, params);
        params.addQueryStringParameter("callback_info", callbackInfo);
        String url = SdkInfo.SERVER + SdkInfo.API_ORDER; //充值下单API
        HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(100);
        http.configTimeout(5000);
        http.configSoTimeout(5000);
        http.send(HttpRequest.HttpMethod.GET, url, params, new LogUrlPayCallBack() {
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) {
                super.onSuccess(responseInfo);
                if (callback == null) return;
                String ret = responseInfo.result;
                if (TextUtils.isEmpty(ret)) {
                    callback.onFailure(0, EMPTY_ORDER);
                } else {
                    callback.onSuccess(ret);
                }
            }
            @Override
            public void onFailure(HttpException e, String msg) {
                if (callback == null) return;
                String txt = EMPTY_ORDER + "\n" + msg;
                int code = NetUtil.getErrorCodeForNet(msg);
                if(code > 0) {
                    txt = NetUtil.getErrorMsgForNet(context, code);
                }
                callback.onFailure(0, txt);
            }
        });
    }

5、调用SDK支付(支付宝/微信),并把4中得到的订单号作为自定义参数传入进去,发起支付。
6、支付结果需要调用自己的服务器来确定,不能通过支付宝/微信的回调结果来判断。
示例代码:

//查询支付结果
    public void queryOrderResult(final Context context, final String orderId, final OrderCallback callback) {
        RequestParams params = new RequestParams();
        params.addQueryStringParameter("orderId", String.valueOf(orderId));//以订单号为参数
        String url = SdkInfo.SERVER + SdkInfo.API_QUERY_RESULT; //查询支付结果API
        final HttpUtils http = new HttpUtils();
        http.configCurrentHttpCacheExpiry(100);
        http.configTimeout(5000);
        http.configSoTimeout(5000);
        PayManager.fillCommon(context, params);
        http.send(HttpRequest.HttpMethod.GET, url, params, new LogUrlPayCallBack() {
            @Override
            public void onSuccess(ResponseInfo<String> responseInfo) { //查询成功
                super.onSuccess(responseInfo);
                if (callback == null) return;

                String ret = responseInfo.result;
                if (TextUtils.isEmpty(ret)) {
                    callback.onFailure(0, EMPTY_ORDER_RESULT);
                } else {
                    try {
                        JSONObject jsonObject = new JSONObject(ret);
                        int code = jsonObject.getInt("code"); //获得服务器返回的code
                        switch (code) {
                            case XXX: // 充值成功(和服务器约定的值)
                                callback.onSuccess(null);
                                break;
                            default:
                                callback.onFailure(code, orderId);
                                break;
                        }
                    } catch (Exception e) {
                        callback.onFailure(0, ERROR_ORDER_RESULT);
                    }
                }
            }

            @Override
            public void onFailure(HttpException e, String msg) {//查询失败
                if (callback == null) return;


                String txt = EMPTY_ORDER_RESULT + "\n" + msg;
                int code = NetUtil.getErrorCodeForNet(msg);
                if(code > 0) {
                    txt = NetUtil.getErrorMsgForNet(context, code);
                }
                callback.onFailure(0, txt);
            }
        });
    }

上一篇: 手游SDK-动画
下一篇: 手游SDK-数据上报

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值