local SDKManager = { startLoginTime = 0 } -- 新版本SDK部分 ******************************************************** SDKManager.BF_LOGIN_TYPE = { NONE = 0, TOKEN = 1, GUEST = 2, FACEBOOK = 3, TEST = 4, GOOGLE = 5, APPLE = 6 } SDKManager.BF_LOGIN_RESULT = { Success = 0, -- 成功 TokenInvalid = 100, -- token失效 NotAccount = 101, -- 账号不存在 NotBinding = 102, -- 绑定失败 Data = 103, -- 数据错误 RepeatBinding = 104, -- 重复绑定 BindOtherAccount = 105, -- 已绑定其他账号 CheckToken = 106, -- 检查口令失败 } -- 用于LoginReq SDKManager.LOGIN_TYPE = { [0] = "none", [1] = "token", [2] = "guest", -- 游客 [3] = "facebook", [4] = "test", [5] = "google", [6] = "apple", } -- 支付方式 SDKManager.PAY_TYPE = { NONE = 0, GOOGLE = 1, IOS = 2, DEBUG = 10 } local PAY_TYPE_IN_APP = "inapp" local PAY_TYPE_SUBS = "subs" local SDKPayMgr if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.Android then SDKPayMgr = require "app/common/sdk_pay_google_manager" elseif CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.IPhonePlayer then SDKPayMgr = require "app/common/sdk_pay_ios_manager" else SDKPayMgr = require "app/common/sdk_pay_default_manager" end function SDKManager:init() Logger.logHighlight("SDK INIT ---------------") -- 标记状态 self.isLogining = false self.isLogouting = false -- lazy init local SDKMgr = CS.BF.BFMain.Instance.SDKMgr self:initPay() self:initPayListener() self:initAdsListener() -- 拿到firebasetoken -- self:initFireBaseToken() end -- 支付相关接口 ********************************************************************** 开始 function SDKManager:initPay() SDKPayMgr:init() end function SDKManager:initPayListener() -- 设置支付回调,平时支付走正常回调,如果延迟到账则走延迟到账的回调 if not SDKPayMgr:needInit() then return end if self.paySid then SchedulerManager:unscheduleGlobal(self.paySid) self.paySid = nil end self.paySid = SchedulerManager:performWithDelayGlobal(function() self:initPayListener() end, 5) SDKPayMgr:initPay(function() if self.paySid then SchedulerManager:unscheduleGlobal(self.paySid) self.paySid = nil end self:queryProducePrice() end) end function SDKManager:queryProducePrice() if self.priceSid then SchedulerManager:unscheduleGlobal(self.priceSid) self.priceSid = nil end Logger.log("queryProducePrice") if SDKPayMgr:gotProduct() then return end local products = SDKPayMgr:queryProducePrice() or {} if #products <= 0 then self.priceSid = SchedulerManager:performWithDelayGlobal(function() self:queryProducePrice() end, 5) end end -- 查询付费产品信息 function SDKManager:queryProducts(callback) SDKPayMgr:queryProducts(callback) end -- 处理未完成的订单 function SDKManager:doUncompleteOrder(callback, productId) SDKPayMgr:doUncompleteOrder(callback, productId) end -- sdk接口 得到特定商品的price function SDKManager:getProductPrice(skuId) return SDKPayMgr:getProductPrice(skuId) end -- sdk接口 得到特定商品的priceAmountMicros function SDKManager:getProductPriceAmountMicros(skuId) return SDKPayMgr:getProductPriceAmountMicros(skuId) end -- sdk接口 得到特定商品的currency_code function SDKManager:getPriceCurrencyCode(skuId) return SDKPayMgr:getPriceCurrencyCode(skuId) end -- 获取支付方式,目前只有google支付 function SDKManager:getSDKPayType() return SDKPayMgr:getSDKPayType() end function SDKManager:getIsSupportSDKPay() return SDKPayMgr:getIsSupportSDKPay() end -- sdk将已完成的订单消耗掉 function SDKManager:consumePurchase(token, callback) SDKPayMgr:consumePurchase(token, callback) end -- 检查是否可以支付 function SDKManager:checkPay(productId, callback) if not productId or not Platform:getIsPublishChannel() or not SDKManager:getIsSupportSDKPay() then -- 没有productId、非正式渠道、不支持sdk支付的直接返回可支付 callback(0) return end SDKPayMgr:checkPay(productId, callback) end -- 支付 function SDKManager:pay(productId, orderId, rechargeId, giftType, callback) SDKPayMgr:pay(productId, orderId, rechargeId, giftType, callback) end function SDKManager:doUncompletePay(callback) SDKPayMgr:doUncompletePay(callback) end -- 支付相关接口 ********************************************************************** 结束 -- 获取设备语言 function SDKManager:getLanguage() return CS.BF.BFMain.Instance.SDKMgr:GetLanguage() end -- 获取设备时区 function SDKManager:getTimeZone() return CS.BF.BFMain.Instance.SDKMgr:GetTimeZone() end function SDKManager:initFireBaseToken() CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:GetFirebaseToken(function(token) self.firebaseToken = token end) end function SDKManager:getFirebaseToken() CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:GetFirebaseToken(function(token) self.firebaseToken = token end) return self.firebaseToken end function SDKManager:doNextFrame(callback) SchedulerManager:performWithDelayGlobal(callback, 0) end --- 广告 function SDKManager:isAdLoaded() if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.Android then return CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr.AdLoaded elseif CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.IPhonePlayer then return CS.AdManager.Instance:IsRewardedAdReady() elseif EDITOR_MODE then return true end return false end function SDKManager:tryLoadRewardedAdDelay() if self.adDelaySid then SchedulerManager:unscheduleGlobal(self.adDelaySid) self.adDelaySid = nil end self.adDelaySid = SchedulerManager:performWithDelayGlobal(function() self.adDelaySid = nil CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr:TryLoadRewardedAd() end, 5) end function SDKManager:initAdsListener() if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.Android then CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr:SetAdShowCallback(function(code) -- code 为0 表示广告播放成功 if code == 0 then BIReport:postAdPlaySuccess(self.adsClickType) else self:tryLoadRewardedAdDelay() end end) CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr:SetAdLoadedCallback(function(code) -- code 为0 表示广告加载成功 if code ~= 0 then self:tryLoadRewardedAdDelay() end end) CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr:SetAdEarnedRewardCallback(function(code, result) if self.adCallback then self:adRewradAd() self.adCallback() BIReport:postAdRewardGet(self.adsClickType) self.adsClickType = nil self.adCallback = nil end end) elseif CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.IPhonePlayer then -- 初始化一下 local adManager = CS.AdManager.Instance end end function SDKManager:showFullScreenAds(adsClickType, adCallback) if EDITOR_MODE then if not adsClickType then local params = { content = "SDKManager showFullScreenAds has no adsClickType", boxType = GConst.MESSAGE_BOX_TYPE.MB_OK, okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK), } GFunc.showMessageBox(params) Logger.log("SDKManager showFullScreenAds has no adsClickType") end end BIReport:postAdClick(adsClickType) if EDITOR_MODE then self:adRewradAd() if adCallback then adCallback() end return true end if NetManager:isNotReachable() then -- 没有网 GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.NO_NETWORK)) return false end if NetManager:getIsBusy() then GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.NETWORK_ERROE_1)) return false end -- if DataManager.MallActData:skipAd() then -- self:adRewradAd(true) -- if adCallback then -- adCallback() -- end -- return true -- end if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.Android then if not CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr.AdLoaded then GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.NO_ADS)) return false end CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr:SetAdPlacement(adsClickType) CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr.AdLoaded = false self.adCallback = adCallback self.adsClickType = adsClickType CS.BF.BFMain.Instance.SDKMgr.BFIronSourceSDKMgr:ShowFullScreenAds() return true elseif CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.IPhonePlayer then if not CS.AdManager.Instance:IsRewardedAdReady() then GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.NO_ADS)) return false end self.adsClickType = adsClickType BIReport:postAdPlaySuccess(self.adsClickType) CS.AdManager.Instance:ShowRewardedAd(function(code) if code == 0 then self:adRewradAd() if adCallback then adCallback() end BIReport:postAdRewardGet(self.adsClickType) self.adsClickType = nil end end) return true end end function SDKManager:adRewradAd(noReport) Logger.logHighlight("-------------------") ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_WATCH_AD) if not noReport then -- BIReport:postAdEvent() end end function SDKManager:getServerList(callback) local postData = { project_id = "b6", bundle_id = Platform:getIdentifier(), version = Platform:getClientVersion(), device_id = DeviceHelper:getDeviceId(), env = "release",-- 暂时写死 } local loginCenterUrl = CS.BF.BFPlatform.GetLoginCenterURL() loginCenterUrl = loginCenterUrl .. "?platform=" .. CS.System.Uri.EscapeDataString(Platform:getPlatformStr()) -- lua这边直接构建好参数 for k, v in pairs(postData) do loginCenterUrl = loginCenterUrl .. "&" .. k .. "=" .. CS.System.Uri.EscapeDataString(v) end local guid = CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:GetNewPlayerGuid() loginCenterUrl = loginCenterUrl .. "&random=" .. CS.System.Uri.EscapeDataString(guid) CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:SetLuaServerListCallback(function(isSuccess, data) if callback then callback(isSuccess, data) end end) CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:GetServerList(loginCenterUrl) end function SDKManager:_login(callback, loginType) CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:SetLuaLoginCallback(callback) CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:Login(loginType) end function SDKManager:login(callback, loginType) self:logout(function() if self.isLogining then -- 正在登陆中 Logger.log("三方当前正在登陆中") return end self.isLogining = true self:_login(function(code, msg) Logger.log("login finish:%s %s", code, msg) if code == SDKManager.BF_LOGIN_RESULT.Success then if not msg then self.isLogining = false return end local msgTab = json.decode(msg) if msgTab == nil or type(msgTab) ~= "table" then self.isLogining = false return end local loginResult = json.decode(msgTab.msg) if loginResult == nil or type(loginResult) ~= "table" then self.isLogining = false return end local userId = loginResult.UserId local token = loginResult.Token local params = {} if loginType == SDKManager.BF_LOGIN_TYPE.APPLE then params = { type = "apple", id = tostring(userId), token = tostring(token) } elseif loginType == SDKManager.BF_LOGIN_TYPE.GOOGLE then params = { type = "google", id = tostring(userId), id_token = tostring(token) } end if callback then callback(params) end end self.isLogining = false end, loginType) end, loginType) end function SDKManager:_logout(callback, loginType) if loginType == SDKManager.BF_LOGIN_TYPE.FACEBOOK or loginType == SDKManager.BF_LOGIN_TYPE.GOOGLE then CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:SetLuaLogoutCallback(callback) CS.BF.BFMain.Instance.SDKMgr.BFLoginSDKMgr:Logout(loginType) else if callback then callback(SDKManager.BF_LOGIN_RESULT.Success, nil) end end end function SDKManager:logout(callback, loginType) if self.isLogouting then -- 正在登出 Logger.log("当前正在登出中") return end self.isLogouting = true self:_logout(function(code, msg) if code == SDKManager.BF_LOGIN_RESULT.Success then if callback then callback() end else if msg and msg ~= "" then local jData = json.decode(msg) if jData then Logger.logError("登出失败 result:%s type:%s msg:%s", code, jData.loginType, jData.msg) else Logger.logError("登出失败 result:%s", code) end else Logger.logError("登出失败") end if callback then callback() end end self.isLogouting = false end, loginType) end return SDKManager