local PayManager = class("PayManager", BaseModule) PayManager.PURCHARSE_TYPE = { ACT_GIFT = 1, ACT_GOLD_PIG = 2, CHAPTER_GIFT = 3, GROW_UP_GIFT = 4, MALL_TREASURE = 5, ARENA_GIFT = 6, } PayManager.PURCHARSE_ACT_TYPE = { FIRST_RECHARGE = 1, COIN_GIFT = 2, INTRODUCTORY_GIFT = 3, BEGINNER_GIFT = 4, LEVEL_UP_GIFT = 5, GROWTH_FUND = 6, BOUNTY = 7, ARENA_BOUNTY = 8, ARENA_GIFT = 9, } PayManager.PURCHARSE_TYPE_CONFIG = { [PayManager.PURCHARSE_TYPE.ACT_GIFT] = "act_gift", [PayManager.PURCHARSE_TYPE.ACT_GOLD_PIG] = "act_gold_pig", [PayManager.PURCHARSE_TYPE.MALL_TREASURE] = "mall_treasure", [PayManager.PURCHARSE_TYPE.CHAPTER_GIFT] = "act_chapter_store", [PayManager.PURCHARSE_TYPE.GROW_UP_GIFT] = "act_growup_gift", } PayManager.BI_ITEM_GET_TYPE = { [PayManager.PURCHARSE_TYPE.ACT_GIFT] = { [PayManager.PURCHARSE_ACT_TYPE.FIRST_RECHARGE] = BIReport.ITEM_GET_TYPE.FIRST_RECHARGE, [PayManager.PURCHARSE_ACT_TYPE.COIN_GIFT] = BIReport.ITEM_GET_TYPE.COIN_GIFT, [PayManager.PURCHARSE_ACT_TYPE.INTRODUCTORY_GIFT] = BIReport.ITEM_GET_TYPE.INTRODUCTORY_GIFT, [PayManager.PURCHARSE_ACT_TYPE.BEGINNER_GIFT] = BIReport.ITEM_GET_TYPE.BEGINNER_GIFT, [PayManager.PURCHARSE_ACT_TYPE.LEVEL_UP_GIFT] = BIReport.ITEM_GET_TYPE.LEVEL_UP_GIFT, [PayManager.PURCHARSE_ACT_TYPE.GROWTH_FUND] = BIReport.ITEM_GET_TYPE.GROWTH_FUND, [PayManager.PURCHARSE_ACT_TYPE.BOUNTY] = BIReport.ITEM_GET_TYPE.BOUNTY, [PayManager.PURCHARSE_ACT_TYPE.ARENA_BOUNTY] = BIReport.ITEM_GET_TYPE.ARENA_BOUNTY, [PayManager.PURCHARSE_ACT_TYPE.ARENA_GIFT] = BIReport.ITEM_GET_TYPE.ARENA_GIFT, }, [PayManager.PURCHARSE_TYPE.ACT_GOLD_PIG] = BIReport.ITEM_GET_TYPE.GOLD_PIG, [PayManager.PURCHARSE_TYPE.MALL_TREASURE] = BIReport.ITEM_GET_TYPE.MALL_TREASURE, [PayManager.PURCHARSE_TYPE.CHAPTER_GIFT] = BIReport.ITEM_GET_TYPE.ACT_CHAPTER_STORE, [PayManager.PURCHARSE_TYPE.GROW_UP_GIFT] = BIReport.ITEM_GET_TYPE.GROW_UP_GIFT, } PayManager.BI_GIFT_TYPE = { [PayManager.PURCHARSE_TYPE.ACT_GIFT] = { [PayManager.PURCHARSE_ACT_TYPE.FIRST_RECHARGE] = BIReport.GIFT_TYPE.FIRST_RECHARGE, [PayManager.PURCHARSE_ACT_TYPE.COIN_GIFT] = BIReport.GIFT_TYPE.COIN_GIFT, [PayManager.PURCHARSE_ACT_TYPE.INTRODUCTORY_GIFT] = BIReport.GIFT_TYPE.INTRODUCTORY_GIFT, [PayManager.PURCHARSE_ACT_TYPE.BEGINNER_GIFT] = BIReport.GIFT_TYPE.BEGINNER_GIFT, [PayManager.PURCHARSE_ACT_TYPE.LEVEL_UP_GIFT] = BIReport.GIFT_TYPE.LEVEL_UP_GIFT, [PayManager.PURCHARSE_ACT_TYPE.GROWTH_FUND] = BIReport.GIFT_TYPE.GROWTH_FUND, [PayManager.PURCHARSE_ACT_TYPE.BOUNTY] = BIReport.GIFT_TYPE.BOUNTY, [PayManager.PURCHARSE_ACT_TYPE.ARENA_BOUNTY] = BIReport.GIFT_TYPE.ARENA_GIFT, [PayManager.PURCHARSE_ACT_TYPE.ARENA_GIFT] = BIReport.ITEM_GET_TYPE.ARENA_GIFT, }, [PayManager.PURCHARSE_TYPE.ACT_GOLD_PIG] = BIReport.GIFT_TYPE.GOLD_PIG, [PayManager.PURCHARSE_TYPE.MALL_TREASURE] = BIReport.GIFT_TYPE.MALL_TREASURE, [PayManager.PURCHARSE_TYPE.CHAPTER_GIFT] = BIReport.GIFT_TYPE.ACT_CHAPTER_STORE, [PayManager.PURCHARSE_TYPE.GROW_UP_GIFT] = BIReport.GIFT_TYPE.GROW_UP_GIFT, } function PayManager:getItemGetType(purchaseType, id) local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[purchaseType] if not cfgName then return end local cfg = ConfigManager:getConfig(cfgName) local typeMap = PayManager.BI_ITEM_GET_TYPE[purchaseType] if not cfg or not cfg[id] or not typeMap then return end local subType = cfg[id].type if subType then return typeMap[cfg[id].type] else if type(typeMap) ~= "table" then return typeMap end end end function PayManager:getGiftType(purchaseType, id) local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[purchaseType] if not cfgName then return end local cfg = ConfigManager:getConfig(cfgName) local typeMap = PayManager.BI_GIFT_TYPE[purchaseType] if not cfg or not cfg[id] or not typeMap then return end local subType = cfg[id].type if subType then return typeMap[cfg[id].type] else if type(typeMap) ~= "table" then return typeMap end end end function PayManager:getGiftConfigInfo(purchaseType, id) local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[purchaseType] if not cfgName then return end local cfg = ConfigManager:getConfig(cfgName) if not cfg or not cfg[id] then return end return cfg[id] end function PayManager:getPackageRechargeId(purchaseType, id) local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[purchaseType] if not cfgName then return end local cfg = ConfigManager:getConfig(cfgName) if not cfg or not cfg[id] then return end return cfg[id].recharge_id end function PayManager:purchasePackage(id, purchaseType) local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[purchaseType] if not cfgName then return end local cfg = ConfigManager:getConfig(cfgName) if not cfg or not cfg[id] then return end local rechargeId = cfg[id].recharge_id local giftType = PayManager:getGiftType(purchaseType, id) local productId if rechargeId then local rechargeCfg = ConfigManager:getConfig("recharge")[rechargeId] if rechargeCfg == nil then return end productId = rechargeCfg.payId BIReport:postPayClick(giftType, id, rechargeId) end self:checkAndPay(productId, id, purchaseType, rechargeId) end function PayManager:requestRewards(purchaseToken, orderId, originOrderId, productId, notShowRewardsBox, callback) self:sendMsgToServer(purchaseToken, orderId, originOrderId, productId, function(binder, msgData) if msgData.status == 0 then local showRewards = not notShowRewardsBox if DataManager.TutorialData and DataManager.TutorialData:getIsInTutorial() then -- 引导时不弹 showRewards = false end if showRewards then if not EDITOR_MODE and not ModuleManager.AccountManager:getIsBinded() then -- 没绑定账户信息,提示去绑定 ModuleManager.AccountManager:showBindUI() end if msgData.rewards and table.nums(msgData.rewards) > 0 then GFunc.showRewardBox(msgData.rewards) end end local biPayGetInfo = {} table.foreach(msgData.gift, function(i, gift) local cfgName = PayManager.PURCHARSE_TYPE_CONFIG[gift.act_type] local cfgInfo = ConfigManager:getConfig(cfgName)[gift.id] local rechargeId = cfgInfo.recharge_id DataManager.PlayerData:addPayment(rechargeId) DataManager.ShopData:addPayment(rechargeId) -- 降档版本 DataManager.ShopData:updateGiftInfo(gift) table.insert(biPayGetInfo, { giftType = gift.act_type, giftId = gift.id, rechargeId = cfgInfo.recharge_id }) end) for _, info in ipairs(biPayGetInfo) do local giftType = PayManager:getGiftType(info.giftType, info.giftId) BIReport:postPayGet(giftType, info.giftId, info.rechargeId, orderId, originOrderId, 1, msgData.rewards or {}) local rechargeCfg = ConfigManager:getConfig("recharge")[info.rechargeId] if rechargeCfg then BIReport:postPurchase(rechargeCfg.price, rechargeCfg.payId, originOrderId, orderId) end end -- 支付上报 local data = {} data.pay_money = DataManager.PlayerData:getTotalPayAmount() data.pay_count = DataManager.PlayerData:getPayCount() CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(data) -- 支付验证成功后消耗此订单 if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.Android then if purchaseToken then SDKManager:consumePurchase(purchaseToken) end elseif CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.IPhonePlayer then if productId then SDKManager:consumePurchase(productId) SDKManager:delIosOrder(productId) end if originOrderId ~= "gm" then SDKManager:delIosPayInfo(originOrderId) end end elseif msgData.status == 1008 then -- 验证异常,但是需要消耗订单 if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.Android then if purchaseToken then SDKManager:consumePurchase(purchaseToken) end elseif CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.IPhonePlayer then if productId then SDKManager:consumePurchase(productId) SDKManager:delIosOrder(productId) end if originOrderId ~= "gm" then SDKManager:delIosPayInfo(originOrderId) end end Logger.logError("重复验证") else Logger.logError("支付验证失败:%s", msgData.status) local params = { content = I18N:getGlobalText(I18N.GlobalConst.PAY_FAILED_DESC_1), boxType = GConst.MESSAGE_BOX_TYPE.MB_OK, okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK), } GFunc.showMessageBox(params) end if callback then callback() end end) end function PayManager:checkAndPay(productId, id, purchaseType, rechargeId) -- 检查是否可以支付 SDKManager:checkPay(productId, function(code) if code == 0 then self:sendMessage(ProtoMsgType.FromMsgEnum.ActPayReq, {id = id, act_type = purchaseType}, {}, function(binder, msgData) if msgData.status == 0 then if msgData.uuid and msgData.uuid ~= GConst.EMPTY_STRING then local giftType = PayManager:getGiftType(purchaseType, id) BIReport:postPayTurn(giftType, id, rechargeId) SDKManager:pay(productId, msgData.uuid, rechargeId, giftType, purchaseType, id, function(purchaseToken, orderId, originOrderId) if purchaseToken and orderId then self:requestRewards(purchaseToken, orderId, originOrderId, productId) end end) else -- 没有支付信息,直接发奖 if table.nums(msgData.rewards) > 0 then GFunc.showRewardBox(msgData.rewards) end local giftData = {} giftData.act_type = msgData.act_type giftData.id = msgData.id giftData.buy_count = DataManager.ShopData:getGiftBoughtNum(msgData.act_type, msgData.id) + 1 giftData.latest_buy_at = Time:getServerTime() * 1000 -- 服务器都是毫秒 DataManager.ShopData:updateGiftInfo(giftData) end else Logger.logError("预支付失败") end end) end end) end function PayManager:sendMsgToServer(purchaseToken, uuid, originOrderId, productId, callback) local args = SDKManager:getPurchaseArgs(purchaseToken, uuid, originOrderId, productId) self:sendMessage(ProtoMsgType.FromMsgEnum.ActPaidResultReq, args, {}, callback) end return PayManager