跳到主要内容

支付

支付

除iOS外,其他平台支付相关逻辑都在服务端执行,客户端不需要写支付相关的lua代码。

服务端 lua

注意,以下所有代码都是服务端代码,跟客户端没关系:

需要包含的库

local pay           = include 'base.pay'
local co = include 'base.co'
local platform = include 'base.platform'

流程说明

下面是一段尽量简化的伪代码,描述了充值流程:

-- 用户点击了充值按钮
function on_pay_button_clicked()
-- 充值相关操作必须在协程中运行,也就是充值相关代码需要被co.async(functin() end包裹起来
co.async(function()

-- 这里执行充值相关逻辑

-- 创建充值对象
local my_pay = pay.new {}

-- 请求充值
if my_pay:start() then
-- 充值成功
else
-- 充值失败
end

end)
end

充值成功之后,会自动帮指定的玩家添加积分,脚本不需要额外执行添加积分的代码,否则会导致重复加积分的后果。充值成功之后,脚本只需要重新查询积分,然后刷新界面即可。

pay.new

创建一个充值对象,可以指定一些充值参数,使用例子:


local my_pay = pay.new {
sandbox = sandbox,
map = map,
player = player,
amount = amount,
client = client,
type = type,
rate = rate,
service = service,
receipt = receipt,
user_id = user_id,
}

参数说明:

  • sandbox bool 可选 是否为沙盒环境,默认为false,代表是正式环境
  • map string 地图名
  • player object 玩家对象
  • amount number 充值金额,单位人民币元,只能精确到小数点后两位
  • client string 充值玩家的客户端类型,可以用 local client = platform.get(player) 来获取
  • type string 积分类型,默认为钻石
  • rate number 人民币和积分的兑换比例,默认1人民币=100钻石,rate为100
  • service string 充值服务类型,可选:
    • AliPay 支付宝
    • ApplePay iOS支付
  • receipt string 收据,客户端发过来的,只有iOS客户端需要传这个,其他客户端不用管
  • user_id number 玩家user_id

客户端 lua

只有 iOS 平台的客户端 lua 才需要执行支付相关的代码。因为 iOS 支付需要先和 AppStore 交互,所以客户端支付逻辑不可避免,支付流程:

用户请求支付 -> 唤起AppStore支付界面 -> 支付成功,从AppStore拿到支付收据 -> 把收据发给服务器验证

服务器拿到支付收据之后,通过pay.new创建一个支付对象(需要把receipt字段填为客户端发送过来的收据),然后调用my_pay:start()来进行验证,和其他平台的支付逻辑相同。

唤起AppStore支付界面

common.appstore_buy_diamond(AppStoreProductId)

其中AppStoreProductId是从表里读出来的,如com.base.createeasy.ceentry.diamond600。一个充值金额对应一个AppStoreProductId

AppStore返回支付结果

function base.event.on_appstore_iap_purchase_response(result, error_code, error_desc, receipt_base64, product_id, transaction_id, foreground)
end

其中result是支付结果,receipt_base64是AppStore返回的收据,需要发给服务器做验证。