一、支付的基本流程
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-数据上报