《支付系统》

流程图

支付流程

文字简述

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

相关接口

获取支付插件对象

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

如果只有一个支付插件,可以直接获取该唯一的对象。

local iap_plugins = agent:getIAPPlugin()
local iap_plugin
for key, value in pairs(iap_plugins) do
    iap_plugin = value
end

如果有多个支付插件,可以通过插件 ID 获取指定对象。

local iap_plugins = agent:getIAPPlugin()
local iap_plugin = iap_plugins[pluginID]

设置监听

iap_plugin:setResultListener(onPayResult)
local function onPayResult( code, msg, info )
    if code == PayResultCode.kPaySuccess then
        --do something
    end
end

支付

void payForProduct(productInfo);
productInfo 实际上是一个 table(例:{key="value"}),记录了支付的一些相关的信息,开发者需要提供支付的如下参数:
注意:调用支付函数时需要传入的一些玩家信息参数(如角色名称,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 扩展字段
参数类型:字符串,可以使用 JSON 型字符串。

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

回调信息:

回调信息 code msg
支付成功 kPaySuccess null 或者错误信息的简单描述
支付取消 kPayCancel null 或者错误信息的简单描述
支付失败 kPayFail null 或者错误信息的简单描述
支付网络出现错误 kPayNetworkError null 或者错误信息的简单描述
支付信息提供不完全 kPayProductionInforIncomplete null 或者错误信息的简单描述

举例说明:

local info = {
    Product_Id="1",
    Product_Name="10元宝",
    Product_Price="1",
    Product_Count="1",
    Product_Desc="gold",
    Coin_Name="元宝",
    Coin_Rate="10",
    Role_Id="123456",
    Role_Name="test",
    Role_Grade="1",
    Role_Balance="1",
    Vip_Level="1",
    Party_Name="1",
    Server_Id="1",
    Server_Name="test",
    EXT="test"
}
iap_plugin:payForProduct(info)

获取订单号

string getOrderId()
用户可通过该函数获取到订单号。

local order_id = iap_plugin:getOrderId()

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

重置支付状态

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

ProtocolIAP:resetPayState()

【评论区】