支付系统接口

来自AnySDK 文档
跳转至: 导航搜索

设置支付系统回调监听

支付系统存在回调信息,需要设置监听。

AnySDKIAP.getInstance().setListener(new AnySDKListener() {
    @Override
    public void onCallBack(int arg0, String arg1) {
    switch(arg0)
    {
    case IAPWrapper.PAYRESULT_SUCCESS://支付成功回调
        break;
    case IAPWrapper.PAYRESULT_FAIL://支付失败回调
        break;
    case IAPWrapper.PAYRESULT_CANCEL://支付取消回调
        break;
    case IAPWrapper.PAYRESULT_NETWORK_ERROR://支付超时回调
        break;
    case IAPWrapper.PAYRESULT_PRODUCTIONINFOR_INCOMPLETE://支付信息提供不完全回调
        break;
    /**
     * 新增加:正在进行中回调
     * 支付过程中若SDK没有回调结果,就认为支付正在进行中
     * 游戏开发商可让玩家去判断是否需要等待,若不等待则进行下一次的支付
     */
    case IAPWrapper.PAYRESULT_NOW_PAYING:
        break;
    default:
        break;
    }
}
});

支付流程

流程图

支付流程.jpg

文字简述

1、游戏客户端APP调用AnySDK框架支付接口请求订单号
2、AnySDK框架获取订单号
3、AnySDK框架向渠道平台服务器请求支付
4、支付成功后,渠道平台服务器同步通知AnySDK框架(游戏客户端)
5、渠道平台服务器会异步通知AnySDK服务器
6、AnySDK服务器响应渠道平台服务器
7、AnySDK服务器将支付结果通知到游戏服务器
8、游戏服务器响应AnySDK支付通知
9、游戏服务器验证支付通知并发放道具

多种支付方式

AnySDK Framework支付多种支付方式,例如,XXX游戏可支持当乐SDK支付方式、移动、联通、电信四种方式。开发者需要自己提供相关界面完成多支付的逻辑展示。

ArrayList<String> idArrayList =  AnySDKIAP.getInstance().getPluginId();
if (idArrayList.size() == 1) {
    AnySDKIAP.getInstance().payForProduct(idArrayList.get(0), mProductionInfo);
}
else //多种支付方式
{
    //开发者需要自己设计多支付方式的逻辑及UI,Sample中有示例
}

相关接口

初始化

在加载插件的同时已经对所有sdk进行了初始化,开发者不需要额外再进行初始化。支付系统初始化后,会有相关信息的回调,如下:

回调信息 code msg
初始化成功 PAYRESULT_INIT_SUCCESS null或者错误信息的简单描述
初始化失败 PAYRESULT_INIT_FAIL null或者错误信息的简单描述

支付

void payForProduct(Map<String, String> info);
TProductInfo 实际上是一个map,记录了支付的一些相关的信息,开发者需要提供支付的如下参数:
注意:调用支付函数时需要传入的一些玩家信息参数(如角色名称,ID,等级)都是渠道强制需求(如UC,小米),并非AnySDK收集所用,如果开发者不填或者填假数据都会导致渠道上架无法通过。
必传参数不能为空,若当前没有可用的值可以写任意值上去
个别渠道可能还需要添加其他参数,请参考常见问题中的渠道说明,根据渠道判断并添加上相应参数
参数 是否必传 参数说明
Product_Id Y 商品id
Product_Name Y 商品名
Product_Price Y 商品价格(元),可能有的SDK只支持整数
Product_Count Y 商品份数(除非游戏需要支持一次购买多份商品,否则传1即可)
Product_Desc N 商品描述(不传则使用Product_Name)
Coin_Name Y 虚拟币名称(如金币、元宝)
Coin_Rate Y 虚拟币兑换比例(例如100,表示1元购买100虚拟币)
Role_Id Y 游戏角色id
Role_Name Y 游戏角色名
Role_Grade Y 游戏角色等级
Role_Balance Y 用户游戏内虚拟币余额,如元宝,金币,符石
Vip_Level Y Vip等级
Party_Name Y 帮派、公会等
Server_Id Y 服务器id,若无填“1”
Server_Name Y 服务器名
EXT N 扩展字段

因有些SDK不支持浮点数,Product_Price请传入整数。

回调信息
回调信息 code msg
支付成功 PAYRESULT_SUCCESS null或者错误信息的简单描述
支付取消 PAYRESULT_CANCEL null或者错误信息的简单描述
支付失败 PAYRESULT_FAIL null或者错误信息的简单描述
支付网络出现错误 PAYRESULT_NETWORK_ERROR null或者错误信息的简单描述
支付信息提供不完全 PAYRESULT_PRODUCTIONINFOR_INCOMPLETE null或者错误信息的简单描述
正在支付中 PAYRESULT_NOW_PAYING null或者错误信息的简单描述

举例说明

Map<String, String> mProductionInfo = new HashMap<String, String>();
mProductionInfo.put("Product_Price", "1");
mProductionInfo.put("Product_Id", "10");
mProductionInfo.put("Product_Name","gold");
mProductionInfo.put("Server_Id", "13");
mProductionInfo.put("Product_Count", "1");
mProductionInfo.put("Role_Id","1");
mProductionInfo.put("Role_Name", "1");
mProductionInfo.put("Role_Grade", "1");
mProductionInfo.put("Role_Balance", "1");

ArrayList<String> idArrayList =  AnySDKIAP.getInstance().getPluginId();
if (idArrayList.size() == 1) {
    AnySDKIAP.getInstance().payForProduct(idArrayList.get(0), mProductionInfo);
}
else {
    ChoosePayMode(idArrayList);
}

获取订单号

std::string getOrderId(string pluginId)

用户可通过该函数获取到订单号。

String order_id = AnySDKIAP.getInstance().getOrderId(pluginId);

注意:调用payForProduct后立即调用getOrderId的话是获取不到该次支付的订单号的,因为此时客户端还没收到服务端返回的订单号,请在收到支付回调后调用getOrderId。

重置支付状态

void resetPayState()

支付过程中若SDK没有回调结果,就认为支付正在进行中,再次调用支付的时候会回调PAYRESULT_NOW_PAYING,可以调用该函数重置支付状态。