c1_lua/lua/app/common/sdk_pay_google_manager.lua
2023-06-09 16:39:45 +08:00

468 lines
15 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local SDKPayGoogleManager = {}
local PAY_TYPE_IN_APP = "inapp"
local PAY_TYPE_SUBS = "subs"
function SDKPayGoogleManager:init()
end
function SDKPayGoogleManager:needInit()
return true
end
function SDKPayGoogleManager:initPay(callback)
self.products = {}
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:SetGoogleDelayPayCallback(SDKPayGoogleManager.onGooglePayDelayCallback)
if callback then
callback()
end
end
-- 这里定义的时候不能使用冒号,否则参数不对
function SDKPayGoogleManager.onGooglePayDelayCallback(code, msg)
if code == 0 and msg and msg ~= "" then
Logger.log("延迟支付到账:%s", msg)
local result = json.decode(msg)
local purchaseToken = result.purchaseToken
if purchaseToken == nil or purchaseToken == "" then
return
end
if result.obfuscatedAccountId then
PayManager:requestRewards(purchaseToken, result.obfuscatedAccountId, result.orderId)
end
end
end
-- 查询付费产品信息
function SDKPayGoogleManager:queryProducts(callback)
if self.queryProductsOver then -- 已经查询成功过了
if callback then
callback()
end
else
local rechargeCfg = ConfigManager:getConfig("recharge")
if rechargeCfg then
local inAppList = {} -- 内购类
local subsList = {} -- 订阅list
for _, rechargeInfo in ipairs(rechargeCfg) do
if rechargeInfo.subscribe then
table.insert(subsList, rechargeInfo.payId)
else
table.insert(inAppList, rechargeInfo.payId)
end
end
self.products = {}
self:queryProductInfo(PAY_TYPE_IN_APP, json.encode(inAppList), function(code, msg)
if code == 0 then
if msg and msg ~= "" then -- 更新products
Logger.logHighlight(msg)
local jData = json.decode(msg)
if jData and #jData > 0 then
for i = 1, #jData do
table.insert(self.products, jData[i])
end
end
end
if #subsList > 0 then
self:queryProductInfo(PAY_TYPE_SUBS, json.encode(subsList), function(code, msg)
if code == 0 then
if msg and msg ~= "" then -- 更新products
local jData = json.decode(msg)
if jData and #jData > 0 then
for i = 1, #jData do
table.insert(self.products, jData[i])
end
end
end
if callback then
callback()
end
end
end)
else
if callback then
callback()
end
end
end
end)
end
end
end
-- 商品数据
function SDKPayGoogleManager:queryProductInfo(payType, json, callback)
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:QueryProductInfo(payType, json, function(code, msg)
SDKManager:doNextFrame(function()
callback(code, msg)
end)
end)
end
-- 未完成的订单请求服务器 completeOrderState状态:
-- 0表示未完成订单消耗完成
-- 1表示存在和指定productId相同的支付中的订单
-- 2表示存在和指定productId相同的无法成功消耗的订单
-- 3表示存在无法成功消耗的订单但是其中没有和指定productId相同
function SDKPayGoogleManager:reqPayReward(uncompleteList, productId, callback)
local index = 1
local completeOrderState = 0
local function handleOrder(uncompleteOrder)
if uncompleteOrder == nil then
if callback then
callback(completeOrderState)
end
return
end
if uncompleteOrder.purchaseState == "2" then
-- 处理中的订单
index = index + 1
if uncompleteOrder.productId and uncompleteOrder.productId ~= "" and uncompleteOrder.productId == productId then
-- 存在和指定productId相同的支付中的订单
completeOrderState = 1
end
handleOrder(uncompleteList[index])
elseif uncompleteOrder.purchaseToken then
-- 去服务器验证
if uncompleteOrder.obfuscatedAccountId then
PayManager:requestRewards(uncompleteOrder.purchaseToken, uncompleteOrder.obfuscatedAccountId, uncompleteOrder.orderId, true, function()
index = index + 1
handleOrder(uncompleteList[index])
end)
else
SDKManager:consumePurchase(uncompleteOrder.purchaseToken, function()
index = index + 1
handleOrder(uncompleteList[index])
end)
end
else
index = index + 1
handleOrder(uncompleteList[index])
end
end
handleOrder(uncompleteList[index])
end
-- 处理未完成的订单
function SDKPayGoogleManager:doUncompleteOrder(callback, productId)
self:queryUncompleteOrder(function(list)
if list and type(list) == "table" and #list > 0 then
self:reqPayReward(list, productId, callback)
else -- 没有未完成的订单
if callback then
callback(0)
end
end
end)
end
-- 查询未完成的订单
function SDKPayGoogleManager:queryUncompleteOrder(callback)
local list -- 查询到的数据,整合了内购
-- 查找内购
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:QueryUncompleteOrder(PAY_TYPE_IN_APP, function(code, msg)
-- 此查询接口没有失败的情况
if msg and msg ~= "" then
list = json.decode(msg)
end
if callback then
callback(list)
end
end)
end
-- 订阅到期查询订阅状态
function SDKPayGoogleManager:querySubscribeInfo()
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:QueryUncompleteOrder(PAY_TYPE_SUBS, function(code, msg)
-- 此查询接口没有失败的情况
local subsList
if msg and msg ~= "" then
subsList = json.decode(msg)
end
if subsList then
for _, order in ipairs(subsList) do
if order.purchaseState == 1 then -- 已购买
local args = {
purchase_token = order.purchaseToken,
order_id = order.obfuscatedAccountId
}
break
end
end
end
end)
end
function SDKPayGoogleManager:queryProducePrice()
return self.products
end
function SDKPayGoogleManager:gotProduct()
return true
end
-- sdk接口 得到特定商品的price
function SDKPayGoogleManager:getProductPrice(skuId)
if self.products and #self.products > 0 then
for _, data in ipairs(self.products) do
if data.sku == skuId then
return data.price
end
end
end
return nil
end
-- sdk接口 得到特定商品的priceAmountMicros
function SDKPayGoogleManager:getProductPriceAmountMicros(skuId)
if self.products and #self.products > 0 then
for _, data in ipairs(self.products) do
if data.sku == skuId then
return data.priceAmountMicros
end
end
end
return nil
end
-- sdk接口 得到特定商品的currency_code
function SDKPayGoogleManager:getPriceCurrencyCode(skuId)
if self.products and #self.products > 0 then
for _, data in ipairs(self.products) do
if data.sku == skuId then
return data.priceCurrencyCode
end
end
end
return nil
end
function SDKPayGoogleManager:getSDKPayType()
if Platform:getIsPublishChannel() then
return SDKManager.PAY_TYPE.GOOGLE
else
return SDKManager.PAY_TYPE.NONE
end
end
-- 获取支付方式,目前只有google支付
function SDKPayGoogleManager:getIsSupportSDKPay()
return true
end
function SDKPayGoogleManager:_getIsGoogleStoreConnected()
return CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr.ConnectStoreSucc
end
-- 检查是否可以支付
function SDKPayGoogleManager:checkPay(productId, callback)
if self:_getIsGoogleStoreConnected() then -- google商店是否初始化
self:doUncompleteOrder(function(code) -- 先处理未完成的订单
if code == 0 then
callback(0)
elseif code == 1 then -- 指定的productId存在支付状态中的订单
local params = {
content = I18N:getGlobalText(I18N.GlobalConst.SETTING_DESC_23),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
}
GFunc.showMessageBox(params)
elseif code == 2 then -- 指定的productId存在未完成的订单消耗失败的情况
local params = {
content = I18N:getGlobalText(I18N.GlobalConst.SETTING_DESC_23),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
}
GFunc.showMessageBox(params)
else -- 存在未完成的订单消耗失败的情况但是因为不是当前productId所以允许继续支付
callback(0)
end
end, productId)
else
self:connectGoogleStore(function(code)
if code == 0 then
self:doUncompleteOrder(function(consumeSucc)
if code == 0 then
callback(0)
elseif code == 1 then -- 指定的productId存在支付状态中的订单
local params = {
content = I18N:getGlobalText(I18N.GlobalConst.SETTING_DESC_23),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
}
GFunc.showMessageBox(params)
elseif code == 2 then -- 指定的productId存在未完成的订单消耗失败的情况
local params = {
content = I18N:getGlobalText(I18N.GlobalConst.SETTING_DESC_23),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
}
GFunc.showMessageBox(params)
else -- 存在未完成的订单消耗失败的情况但是因为不是当前productId所以允许继续支付
callback(0)
end
end, productId)
else
local params = {
content = I18N:getGlobalText(I18N.GlobalConst.SETTING_DESC_22),
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
}
GFunc.showMessageBox(params)
end
end)
end
end
-- 支付
function SDKPayGoogleManager:pay(productId, orderId, rechargeId, giftType, purchaseType, giftId, callback)
self:doGooglePay(productId, orderId, rechargeId, giftType, purchaseType, giftId, callback)
end
-- 连接Google商店
function SDKPayGoogleManager:connectGoogleStore(callback)
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:ConnectGoogleStore(function(code)
SDKManager:doNextFrame(function()
callback(code)
end)
end)
end
function SDKPayGoogleManager:doGooglePay(productId, orderId, rechargeId, giftType, purchaseType, giftId, callback)
local payType = PAY_TYPE_IN_APP
local rechargeCfg = ConfigManager:getConfig("recharge")[rechargeId]
if rechargeCfg.subscribe then
payType = PAY_TYPE_SUBS
end
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:Pay(payType, productId, orderId, function(code, msg)
if code == 0 then
-- 支付成功
Logger.log("pay success:%s", msg)
local result = json.decode(msg)
if callback then
callback(result.purchaseToken, result.obfuscatedAccountId, result.orderId)
end
elseif code == 1 then
-- 支付取消
GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.SETTING_DESC_25))
BIReport:postPayCancel(productId, orderId, rechargeId, giftType, giftId)
else
-- 支付失败
Logger.log("pay failed")
BIReport:postPayFailed(productId, orderId, rechargeId, msg or GConst.EMPTY_STRING, giftType, giftId)
end
end)
end
-- sdk将已完成的订单消耗掉
function SDKPayGoogleManager:consumePurchase(token, callback)
if not token then
return
end
CS.BF.BFMain.Instance.SDKMgr.BFPaySDKMgr:ConsumePurchase(token, function(code, msg)
if code == 0 then
Logger.log("consume %s success", token)
else
Logger.log("consume %s failed", token)
end
if callback then
callback(code)
end
end)
end
function SDKPayGoogleManager:doUncompletePay(callback)
-- 每次游戏的过程中只处理一次
if self.alreadyFinishUncompletePay then
return
end
if not DataManager:getLoginSuccess() then
return
end
-- if NetManager:getIsBusy() then
-- return
-- end
if self:_getIsGoogleStoreConnected() then
-- google商店是否初始化
self.alreadyFinishUncompletePay = true
SDKManager:queryProducts(function()
SDKManager:doUncompleteOrder()
end)
end
end
-- 第一步向服务器验证订单号
-- function SDKPayGoogleManager:_checkPurchaseOrder(result, productId, callback)
-- -- SDKPayGoogleManager:saveOrderId(result.orderId)
-- if DataManager.PlayerData:isInPermanentOrders(result.obfuscatedAccountId) then
-- return
-- end
-- local params = {}
-- params.receipt = {}
-- params.receipt.packageName = Platform:getIdentifier()
-- params.receipt.productId = productId
-- params.receipt.purchaseToken = result.purchaseToken
-- params.receipt.subscription = false
-- CS.BF.BFMain.Instance.ParseClientMgr:SetLuaCheckPurchaseOrderCallback(function (msg)
-- local serverResult = json.decode(msg)
-- local _result = serverResult.result
-- Logger.printTable(serverResult)
-- if _result and _result.data then
-- if _result.code == 0 then
-- -- SDKPayGoogleManager:delOrderId(_result.data.orderId)
-- SDKPayGoogleManager:saveOrderId(_result.data.obfuscatedExternalAccountId, params)
-- SDKPayGoogleManager:checkPurchaseConsume(_result.data.obfuscatedExternalAccountId, params, callback)
-- -- if callback then
-- -- callback(_result.data.purchaseToken, _result.data.obfuscatedAccountId, _result.data.orderId)
-- -- end
-- elseif _result.code == 137 then
-- -- SDKPayGoogleManager:delOrderId(_result.data.orderId)
-- SDKPayGoogleManager:consumePurchase(_result.data.purchaseToken)
-- else
-- -- @TODO 重试
-- end
-- end
-- end)
-- CS.BF.BFMain.Instance.ParseClientMgr:CheckPurchaseGPOrder(json.encode(params))
-- end
-- 第二步向服务器申请消耗订单
-- function SDKPayGoogleManager:checkPurchaseConsume(orderId, params, callback, callback1)
-- if not orderId or not params then
-- return
-- end
-- CS.BF.BFMain.Instance.ParseClientMgr:SetLuaCheckPurchaseConsumeCallback(function (msg)
-- local serverResult = json.decode(msg)
-- local _result = serverResult.result
-- Logger.printTable(serverResult)
-- if _result and _result.data then
-- if _result.code == 0 or _result.code == 137 then
-- SDKPayGoogleManager:delOrderId(orderId)
-- SDKPayGoogleManager:savePermanentOrderId(orderId)
-- if callback then
-- callback(_result.data.purchaseToken, _result.data.obfuscatedExternalAccountId, _result.data.orderId)
-- else
-- PayManager:requestRewards(_result.data.purchaseToken, orderId)
-- SDKPayGoogleManager:consumePurchase(_result.data.purchaseToken)
-- if callback1 then
-- callback1()
-- end
-- end
-- -- elseif _result.code == 137 then
-- -- SDKPayGoogleManager:delOrderId(orderId)
-- -- SDKPayGoogleManager:consumePurchase(_result.data.purchaseToken)
-- else
-- -- @TODO 重试
-- end
-- end
-- end)
-- CS.BF.BFMain.Instance.ParseClientMgr:CheckPurchaseGPConsume(json.encode(params))
-- end
-- 支付相关接口 ********************************************************************** 结束
return SDKPayGoogleManager