405 lines
16 KiB
Lua
405 lines
16 KiB
Lua
------------------------------------------------
|
||
--作者: 丁华强
|
||
--日期: 2020-01-02
|
||
--文件: PaySystem.lua
|
||
--模块: PaySystem
|
||
--描述: 充值系统
|
||
------------------------------------------------
|
||
local SDKCacheData = CS.Thousandto.CoreSDK.SDKCacheData
|
||
local L_PayData = require("Logic.PaySystem.PayData")
|
||
local L_ServerData = require("Logic.PaySystem.ServerData")
|
||
local RuntimePlatform = CS.UnityEngine.RuntimePlatform
|
||
local L_UnityUtils = require("Common.CustomLib.Utility.UnityUtils");
|
||
|
||
--充值数据保存的路径
|
||
local L_JSON_SAVE_PATH = string.format("%s/PayJson.txt",PathUtils.GetWritePath("Log"))
|
||
|
||
local PaySystem = {
|
||
--已充值的金额
|
||
RechargeNum = 0,
|
||
--真实的充值金额
|
||
RechargeRealMoney = 0,
|
||
--充值数据,Id, Data
|
||
PayDataIdDict = nil,
|
||
--充值数据,rechargeType, List<Data>
|
||
PayDataTypeDict = nil,
|
||
--功能剩余时间
|
||
SubTypeTimeDict = nil,
|
||
--是否设置过红点了
|
||
HasSetRedPoint = false,
|
||
--当前平台类型
|
||
CurPlatform = nil,
|
||
--本次充值数据的MD5值,用于和服务器进行数据验证
|
||
Md5 = "",
|
||
--渠道配置的参数表
|
||
SdkPlatCfg = nil,
|
||
CacheMoneySign = nil,
|
||
TempPayJson = nil,
|
||
}
|
||
|
||
function PaySystem:Initialize(clearLoginData)
|
||
if clearLoginData then
|
||
self.SubTypeTimeDict = Dictionary:New()
|
||
self.PayDataIdDict = Dictionary:New()
|
||
self.PayDataTypeDict = Dictionary:New()
|
||
--充值列表下载成功,刷新下数据
|
||
self.CurPlatform = LogicAdaptor.GetRuntimePlatform()
|
||
local _fgi = GameCenter.SDKSystem.LocalFGI
|
||
self.SdkPlatCfg = DataConfig.DataSdkplatform[_fgi]
|
||
end
|
||
end
|
||
|
||
function PaySystem:UnInitialize(clearLoginData)
|
||
if clearLoginData then
|
||
end
|
||
end
|
||
|
||
--下载充值列表的数据
|
||
function PaySystem:DownLoadPayList()
|
||
if File.Exists(L_JSON_SAVE_PATH) then
|
||
self.Md5 = string.upper(MD5Utils.MD5String(File.ReadAllText(L_JSON_SAVE_PATH)))
|
||
end
|
||
local _msg = ReqMsg.MSG_Recharge.ReqCheckRechargeMd5:New()
|
||
_msg.md5 = self.Md5
|
||
_msg:Send()
|
||
end
|
||
|
||
|
||
--配置表rechargeType字段获取到的一组数据
|
||
function PaySystem:GetPayDataByRechargeType(rechargeType)
|
||
local _rechargeType = tonumber(rechargeType)
|
||
local _payDataList = nil
|
||
if self.PayDataTypeDict:ContainsKey(_rechargeType) then
|
||
_payDataList = self.PayDataTypeDict[_rechargeType]
|
||
end
|
||
return _payDataList
|
||
end
|
||
|
||
--配置表id字段
|
||
function PaySystem:GetPayDataById(cfgId)
|
||
local _cfgId = tonumber(cfgId)
|
||
local _payData = nil
|
||
if self.PayDataIdDict:ContainsKey(_cfgId) then
|
||
_payData = self.PayDataIdDict[_cfgId]
|
||
end
|
||
return _payData
|
||
end
|
||
|
||
--配置表rechargeType, subType字段
|
||
function PaySystem:GetPayDataByType(rechargeType, subType)
|
||
--1. 根据rechargeType取出对应的List数据
|
||
local _rechargeType = tonumber(rechargeType)
|
||
local _typeDataList = nil
|
||
if self.PayDataTypeDict:ContainsKey(_rechargeType) then
|
||
_typeDataList = self.PayDataTypeDict[_rechargeType]
|
||
end
|
||
--2. 根据subType取出对应的List数据
|
||
local _payDataList = List:New()
|
||
if _typeDataList ~= nil and #_typeDataList > 0 then
|
||
for i = 1, #_typeDataList do
|
||
if _typeDataList[i].ServerCfgData.RechargeSubType == subType then
|
||
_payDataList:Add(_typeDataList[i])
|
||
end
|
||
end
|
||
end
|
||
_payDataList:Sort(
|
||
function(x, y)
|
||
return x.ServerCfgData.Money < y.ServerCfgData.Money
|
||
end
|
||
)
|
||
return _payDataList
|
||
end
|
||
|
||
--根据配置表的ID直接发起充值
|
||
function PaySystem:PayByCfgId(cfgId)
|
||
if self.PayDataIdDict:Count() > 0 and self.PayDataIdDict:ContainsKey(cfgId) then
|
||
if L_UnityUtils.UNITY_EDITOR() then
|
||
local _payData = self.PayDataIdDict[cfgId]
|
||
--编辑器模式下直接发送充值gm命令
|
||
local req ={}
|
||
req.chattype = 0
|
||
req.recRoleId = 0
|
||
req.condition = string.format("&rechargeid %d", _payData.ServerCfgData.Id)
|
||
req.chatchannel = 0
|
||
req.voiceLen = 0
|
||
GameCenter.Network.Send("MSG_Chat.ChatReqCS",req)
|
||
else
|
||
local _msg = ReqMsg.MSG_Recharge.ReqCheckGoodsIsCanbuy:New()
|
||
_msg.id = cfgId
|
||
_msg.moneyType = self.SdkPlatCfg.MoneyCode
|
||
_msg:Send()
|
||
Debug.LogError(string.format("当前充值的配置表ID %s",cfgId))
|
||
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_LOCK_OPEN);
|
||
end
|
||
else
|
||
Debug.LogError(string.format("当前 %s ID找不到,不能进行充值!",cfgId))
|
||
Utils.ShowPromptByEnum("C_PAY_ID_NOT_FIND", cfgId)
|
||
end
|
||
end
|
||
|
||
--rechargeType 3:周卡 4:月卡 5:终身卡
|
||
function PaySystem:PayByCardType(rechargeType)
|
||
--这里的数据都只有一个
|
||
local _payDataList = nil
|
||
local _cardData = nil
|
||
if self.PayDataTypeDict:ContainsKey(rechargeType) then
|
||
_payDataList = self.PayDataTypeDict[rechargeType]
|
||
if _payDataList ~= nil and _payDataList:Count() > 0 then
|
||
_cardData = _payDataList[1]
|
||
end
|
||
end
|
||
if _cardData ~= nil then
|
||
--给服务器请求看能不能进行充值,服务器返回可以充值才能去调用SDK走扣款
|
||
self:PayByCfgId(_cardData.ServerCfgData.CfgId)
|
||
else
|
||
Debug.LogError("PayByCardType _cardData is nil!")
|
||
end
|
||
end
|
||
|
||
--根据充值id获取货币数量
|
||
function PaySystem:GetMoneyCountById(cfgId)
|
||
if self.PayDataIdDict:ContainsKey(cfgId) then
|
||
local _data = self.PayDataIdDict[cfgId]
|
||
if _data ~= nil then
|
||
return _data.ServerCfgData.Money
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--玩家当前充值的总值
|
||
function PaySystem:ResRechargeTotalValue(msg)
|
||
--玩家当前账号的总充值元宝数量
|
||
GameCenter.PaySystem.RechargeNum = msg.goldTotal
|
||
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_REFESH_PAY_DATA)
|
||
end
|
||
|
||
--充值了多少元
|
||
function PaySystem:ResVipRechageMoney(rechargeMoney)
|
||
self.RechargeRealMoney = rechargeMoney
|
||
end
|
||
|
||
--返回充值数据
|
||
function PaySystem:ResRechargeData(msg)
|
||
if msg ~= nil and msg.items ~= nil then
|
||
local _dataList = msg.items
|
||
local _typeTimeList = msg.typeTime
|
||
local _serverTime = GameCenter.HeartSystem.ServerTime
|
||
if _typeTimeList ~= nil then
|
||
for i = 1, #_typeTimeList do
|
||
local _subType = _typeTimeList[i].subtype % 10000
|
||
local _remiantime = _typeTimeList[i].remiantime
|
||
if not self.SubTypeTimeDict:ContainsKey(_subType) then
|
||
self.SubTypeTimeDict:Add(_subType, _remiantime)
|
||
else
|
||
self.SubTypeTimeDict[_subType] = _remiantime
|
||
end
|
||
if _subType == PaySubType.Novice then
|
||
GameCenter.MainFunctionSystem:SetFunctionVisible(FunctionStartIdCode.PayNewbie, _serverTime < _remiantime)
|
||
elseif _subType == PaySubType.Day then
|
||
GameCenter.MainFunctionSystem:SetFunctionVisible(FunctionStartIdCode.PayDay, _serverTime < _remiantime)
|
||
elseif _subType == PaySubType.Week then
|
||
GameCenter.MainFunctionSystem:SetFunctionVisible(FunctionStartIdCode.PayWeek, _serverTime < _remiantime)
|
||
end
|
||
end
|
||
end
|
||
for i = 1, #_dataList do
|
||
--商品ID,这里是cfg.id
|
||
local _cfgId = _dataList[i].id
|
||
--充值次数
|
||
local _num = _dataList[i].count
|
||
--更新次数
|
||
if self.PayDataIdDict:ContainsKey(_cfgId) then
|
||
self.PayDataIdDict[_cfgId]:UpdateNum(_num)
|
||
end
|
||
local _keys = self.PayDataTypeDict:GetKeys()
|
||
if _keys ~= nil then
|
||
for k = 1, #_keys do
|
||
local _rechargeType = _keys[k]
|
||
local _typeDataList = self.PayDataTypeDict[_rechargeType]
|
||
if _typeDataList ~= nil then
|
||
for j = 1, #_typeDataList do
|
||
if _typeDataList[j].ServerCfgData.CfgId == _cfgId then
|
||
_typeDataList[j]:UpdateNum(_num)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_REFESH_PAY_DATA)
|
||
end
|
||
end
|
||
|
||
--客户端请求商品是否能购买返回
|
||
function PaySystem:ResCheckGoodsResult(msg)
|
||
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_CLOSE);
|
||
--0不能购买,1可以购买
|
||
local _result = msg.result
|
||
local _payId = msg.id
|
||
local _orderInfo = msg.orderInfo
|
||
Debug.LogError(string.format("ResCheckGoodsResult result = %s, id = %s, _orderInfo = %s", _result, _payId, _orderInfo))
|
||
if _result == 1 then
|
||
if self.PayDataIdDict:Count() > 0 and self.PayDataIdDict:ContainsKey(_payId) then
|
||
local _sData = self.PayDataIdDict[_payId].ServerCfgData
|
||
--这里是向SDK发起支付请求,需要传入SDK认可的支付ID
|
||
local _itemId = _sData.Id
|
||
local _itemName = _sData.Desc
|
||
local _price = _sData.SDKPrice
|
||
local _rechargeType = _sData.RechargeType
|
||
local _goodsDealType = _sData.GoodsDealType
|
||
local _payNotifyUrl = GameCenter.ServerListSystem.LastEnterServer.PayCallURL
|
||
local _orderData = Json.decode(_orderInfo)
|
||
--1才是下单成功
|
||
if _orderData.state == 1 then
|
||
local _order = _orderData.data
|
||
--U8Server生成的唯一订单号,需要回传SDK
|
||
local _orderNo = _order.order_no
|
||
--渠道SDK支付的扩展数据,回传赋值给SDK
|
||
local _extension = _order.extension
|
||
local _buyNum = 1
|
||
Debug.LogError(string.format("当前调用SDK支付传递的参数 _itemId = %s, _itemName = %s, _price = %s, _goodsDealType = %s, _payNotifyUrl = %s, _rechargeType = %s, _extension = %s, _cfgId = %s, _orderNo = %s", _itemId, _itemName, _price, _goodsDealType, _payNotifyUrl, _rechargeType, _extension, _payId, _orderNo))
|
||
GameCenter.SDKSystem:Pay( tostring(_itemId), tostring(_itemName), _buyNum, tonumber(_price), tostring(_goodsDealType), tostring(_payNotifyUrl), tostring(_rechargeType), _extension, tonumber(_payId), tostring(_orderNo))
|
||
else
|
||
--下单失败
|
||
Utils.ShowPromptByEnum("C_PAY_ORDER_CREATE_FAIL")
|
||
end
|
||
end
|
||
else
|
||
Utils.ShowPromptByEnum("Pay_CAN_NOT_BUY_TIPS", _payId)
|
||
end
|
||
end
|
||
|
||
--服务器下发所有充值商品
|
||
function PaySystem:ResRechargeItems(msg)
|
||
local _payJson = msg.rechargeItemJson
|
||
if msg.md5 ~= nil or msg.md5 ~= "" then
|
||
--判断下内存中是否存过充值的字符串了,并且MD5改变过了,没改变就不去动数据
|
||
if self.TempPayJson == nil or msg.md5 ~= self.MD5 then
|
||
--数据为空的情况下读取本地的数据
|
||
if _payJson == nil or _payJson == "" then
|
||
if File.Exists(L_JSON_SAVE_PATH) then
|
||
_payJson = File.ReadAllText(L_JSON_SAVE_PATH)
|
||
self.TempPayJson = _payJson
|
||
self.MD5 = string.upper(MD5Utils.MD5String(_payJson))
|
||
if msg.md5 ~= self.MD5 then
|
||
Debug.LogError("MD5不匹配,充值数据有异常.."..msg.md5)
|
||
end
|
||
else
|
||
Debug.LogError("哦和..服务器没发充值数据..本地也没有充值数据..")
|
||
end
|
||
--充值数据不为空就在本地再保存下
|
||
else
|
||
--这里rechargeItemJson不为空,那可能是首次下发和数据有改变
|
||
if not File.Exists(L_JSON_SAVE_PATH) then
|
||
File.Create(L_JSON_SAVE_PATH):Dispose()
|
||
else
|
||
--如果存在文件,那么肯定就是数据有改变的情况
|
||
Debug.LogError("充值MD5有改变,最新数据...MD5 = "..msg.md5..", json = ".._payJson)
|
||
end
|
||
File.WriteAllText(L_JSON_SAVE_PATH, _payJson);
|
||
end
|
||
else
|
||
_payJson = self.TempPayJson
|
||
end
|
||
else
|
||
Debug.LogError("服务器充值的JSON数据异常")
|
||
end
|
||
if _payJson ~= nil and _payJson ~= "" then
|
||
local _payDataTab = Json.decode(_payJson)
|
||
local _payDataList = List:New(_payDataTab)
|
||
for _key, _data in pairs(_payDataList) do
|
||
local _cfgId = tonumber(_data.goods_system_cfg_id)
|
||
--1. 根据配置表ID储存数据
|
||
local _sData = L_ServerData:New(_data)
|
||
local _payData = self.PayDataIdDict[_cfgId]
|
||
if _payData ~= nil then
|
||
_payData:RefeshData(_sData)
|
||
else
|
||
_payData = L_PayData:New(_sData)
|
||
self.PayDataIdDict:Add(_cfgId, _payData)
|
||
end
|
||
--2. 根据RechargeType来储存数据
|
||
local _rechargeType = _sData.RechargeType
|
||
if not self.PayDataTypeDict:ContainsKey(_rechargeType) then
|
||
local _dataList = List:New()
|
||
_dataList:Add(_payData)
|
||
self.PayDataTypeDict:Add(_rechargeType, _dataList)
|
||
else
|
||
local _dataList = self.PayDataTypeDict[_rechargeType]
|
||
local _hasSameData = false
|
||
local _curCfgId = _payData.ServerCfgData.CfgId
|
||
for i = 1, #_dataList do
|
||
if _curCfgId == _dataList[i].ServerCfgData.CfgId then
|
||
self.PayDataTypeDict[_rechargeType][i] = _payData
|
||
_hasSameData = true
|
||
break
|
||
end
|
||
end
|
||
if not _hasSameData then
|
||
self.PayDataTypeDict[_rechargeType]:Add(_payData)
|
||
end
|
||
end
|
||
end
|
||
--处理下上线的时候需要处理的内容
|
||
self:HandleOnline()
|
||
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_REFESH_PAY_DATA)
|
||
--刷新月卡周卡的数据
|
||
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_WELFARE_CARD_REFRESH, nil)
|
||
else
|
||
Debug.LogError("服务器没下发充值的Json数据!")
|
||
end
|
||
local _sing = self:GeMoneySignByCfg()
|
||
end
|
||
|
||
--处理下上线的时候需要处理的内容
|
||
function PaySystem:HandleOnline()
|
||
--上线的时候设置下所有充值功能的红点,点开界面之后关掉红点
|
||
if not self.HasSetRedPoint then
|
||
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.Pay, true)
|
||
GameCenter.MainFunctionSystem:SetFunctionEffect(FunctionStartIdCode.Pay, true)
|
||
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.PayBase, true)
|
||
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.PayNewbie, true)
|
||
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.PayWeek, true)
|
||
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.PayDay, true)
|
||
self.HasSetRedPoint = true
|
||
end
|
||
local _localPlayer = GameCenter.GameSceneSystem:GetLocalPlayer()
|
||
--这里加个判断是防止还没进游戏服就在请求数据,如果localplayer都有数据了那肯定是进了场景了
|
||
if _localPlayer ~= nil then
|
||
--请求游戏服的充值数据
|
||
local _reqMsg = ReqMsg.MSG_Recharge.ReqRechargeData:New()
|
||
_reqMsg:Send()
|
||
end
|
||
end
|
||
|
||
--根据配置表获取当前货币符号
|
||
function PaySystem:GeMoneySignByCfg()
|
||
if self.CacheMoneySign == nil then
|
||
local _region = GameCenter.LoginSystem.Region
|
||
if _region ~= nil and _region ~= "" and _region ~= 0 then
|
||
--tw
|
||
local _chanel = self.SdkPlatCfg.Chanel
|
||
DataConfig.DataSdkplatform:ForeachCanBreak(
|
||
function(_id, _cfg)
|
||
if _cfg.Chanel == _chanel and _cfg.Region == _region then
|
||
self.CacheMoneySign = _cfg.MoneySign
|
||
return true
|
||
end
|
||
end
|
||
)
|
||
else
|
||
if self.SdkPlatCfg ~= nil then
|
||
if self.SdkPlatCfg.Chanel == "TW" then
|
||
self.CacheMoneySign = "$"
|
||
else
|
||
self.CacheMoneySign = self.SdkPlatCfg.MoneySign
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return self.CacheMoneySign
|
||
end
|
||
|
||
return PaySystem |