支付系统接口

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

设置监听

支付系统存在回调信息,需要设置监听类,重写监听方法。

class PluginChannel:public PayResultListener
{
public:
    virtual void onPayResult(PayResultCode ret, const char* msg, TProductInfo info);
}
开发者需要重写onPayResult方法
std::map<std::string , ProtocolIAP*>*   _pluginsIAPMap= AgentManager::getInstance()->getIAPPlugin();
std::map<std::string , ProtocolIAP*>::iterator iter;
for(iter = _pluginsIAPMap->begin(); iter != _pluginsIAPMap->end(); iter++)
{
    (iter->second)->setResultListener(this);
}

支付流程

流程图

支付流程.jpg

文字简述

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

多种支付方式

AnySDK框架支持多个支付插件,AnySDK客户端选择多少个支付,getIAPPlugin就能获取到多少个。一般情况只会选择一个支付插件,如果选择多个支付插件需要开发者自己提供相关界面完成多支付的逻辑展示。

std::map<std::string , ProtocolIAP*>::iterator it = _pluginsIAPMap->begin();
if(_pluginsIAPMap)
{
     if(_pluginsIAPMap->size() == 1)//只存在一种支付方式
     {
           (it->second)->payForProduct(productInfo);
      }
      else //多种支付方式
      {
	   //开发者需要自己设计多支付方式的逻辑及UI
      }
}

相关接口

初始化

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

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

支付

void payForProduct(TProductInfo info);
TProductInfo 实际上是一个map,记录了支付的一些相关的信息,开发者需要提供支付的如下参数:
注意:调用支付函数时需要传入的一些玩家信息参数(如角色名称,ID,等级)都是渠道强制需求(如UC,小米),并非AnySDK收集所用,如果开发者不填或者填假数据都会导致渠道上架无法通过。
必传参数不能为空,若当前没有可用的值可以写任意值上去
个别渠道可能还需要添加其他参数,请参考常见问题中的渠道说明,根据渠道判断并添加上相应参数
参数 是否必传 参数说明
Product_Id Y 商品id(联想、七匣子、酷派等商品id要与在渠道后台配置的商品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
支付成功 kPaySuccess null或者错误信息的简单描述
支付取消 kPayCancel null或者错误信息的简单描述
支付失败 kPayFail null或者错误信息的简单描述
支付网络出现错误 kPayNetworkError null或者错误信息的简单描述
支付信息提供不完全 kPayProductionInforIncomplete null或者错误信息的简单描述

举例说明

void PluginChannel::pay()
{
    std::map<std::string , ProtocolIAP*>::iterator it = _pluginsIAPMap->begin();
    if(_pluginsIAPMap)
    {
        productInfo["Product_Price"] = "1";
        productInfo["Product_Id"] = "101";
        productInfo["Product_Name"] = "gold";
        productInfo["Server_Id"] = "13";
        productInfo["Product_Count"] = "1";
        productInfo["Role_Id"] = "1";
        productInfo["Role_Name"] = "1";
        productInfo["Role_Grade"] = "1";
        productInfo["Role_Balance"] = "1";
        if(_pluginsIAPMap->size() == 1)//只存在一种支付方式
        {
            (it->second)->payForProduct(productInfo);
        }
        else //多种支付方式
        {
            //开发者需要自己设计多支付方式的逻辑及UI
        }
    }

}
//支付回调
//处理回调函数	
switch(code)
{
case kPaySuccess://支付成功回调
     //支付成功后,游戏相关处理
     break;
case kPayNetworkError://支付网络出错回调
case kPayCancel://支付取消回调
case kPayProductionInforIncomplete://支付信息填写不完整回调
case kPayFail://支付失败回调
     //支付失败后,游戏相关处理
     break;
case kPayNowPaying:
     /**
     * 正在进行中回调
     * 支付过程中若SDK没有回调结果,就认为支付正在进行中
     * 游戏开发商可让玩家去判断是否需要等待,若不等待则进行下一次的支付
     */
     break;
}

获取订单号

std::string getOrderId()

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

string order_id = iap_plugin->getOrderId();

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

重置支付状态

void resetPayState()

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

ProtocolIAP::resetPayState();