local _M = {} local md5 = require "md5" -- 入口在正式服关闭 -- mock 充值 function _M.rechargeRpc(agent , data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local dataSet = csvdb["shop_rechargeCsv"][id] if not dataSet then return end local roleId = role:getProperty("id") --创建订单号 local partnerOrderId = role:getPurchaseOrder(id) if partnerOrderId == "" then return 1 end SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) if true then return end -- 测试的 直接发奖励了 skynet.timeout(10, function () role:handlePurchase({ order = partnerOrderId, amount = dataSet.rmb, game_money = dataSet.diamond, product_id = dataSet.productId, pay_time = skynet.timex(), transactionId = "onlyTest", }) end) return true end local function table_keys( t ) local keys = {} for k, _ in pairs( t ) do keys[#keys + 1] = k end return keys end local function signPms(params, secret_key) local keys = table_keys(params) table.sort(keys) local urlCode = "" for index, key in ipairs(keys) do urlCode = urlCode .. params[key] end return md5.sumhexa(urlCode .. secret_key):lower() end -- google 充值 入口 function _M.googleRechargeRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local dataSet = csvdb["shop_rechargeCsv"][id] if not dataSet then return end local roleId = role:getProperty("id") role.ignoreHeartbeat = true --创建订单号 local partnerOrderId = role:getPurchaseOrder(id) -- 签名 local secret_key = "b7657fa7ccd44c16a35e3f454ac7a075" local need = { out_trade_no = partnerOrderId, money = dataSet.rmb * 100, game_money = dataSet.diamond, product_id = dataSet.productId, notify_url = msg.notifyUrl } local sign = signPms(need, secret_key) SendPacket(actionCodes.Store_googleRechargeRpc, MsgPack.pack({ order = partnerOrderId, sign = sign})) return true end -- mycard 充值 入口 function _M.myCardRechargeRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local dataSet = csvdb["shop_rechargeCsv"][id] if not dataSet then return end local roleId = role:getProperty("id") role.ignoreHeartbeat = true --创建订单号 local partnerOrderId = role:getPurchaseOrder(id) -- 签名 local secret_key = "48759e07540f46d9af17ec82669b4272" local need = { out_trade_no = partnerOrderId, money = dataSet.rmb * 100, game_money = dataSet.diamond, notify_url = msg.notifyUrl } local sign = signPms(need, secret_key) SendPacket(actionCodes.Store_myCardRechargeRpc, MsgPack.pack({ order = partnerOrderId, sign = sign})) return true end -- mycard 充值 入口 function _M.iosRechargeRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local dataSet = csvdb["shop_rechargeCsv"][id] if not dataSet then return end local roleId = role:getProperty("id") role.ignoreHeartbeat = true --创建订单号 local partnerOrderId = role:getPurchaseOrder(id) -- 签名 local secret_key = "9647d2efe1074c73b9ac19af4337a70e" local need = { out_trade_no = partnerOrderId, money = dataSet.rmb * 100, game_money = dataSet.diamond, product_id = dataSet.iap_product_id, notify_url = msg.notifyUrl } local sign = signPms(need, secret_key) SendPacket(actionCodes.Store_iosRechargeRpc, MsgPack.pack({ order = partnerOrderId, sign = sign})) return true end function _M.purchaseOrderResult(agent, data) local role = agent.role local roleId = role:getProperty("id") local msg = MsgPack.unpack(data) role.ignoreHeartbeat = false local status = { fail = true, success = true } local partnerOrderStr = msg.order if partnerOrderStr then role:updatePurchaseOrder(partnerOrderStr, msg.platformOrder, status[msg.status] and msg.status or "unknown") end return true end function _M.shopBuyRpc(agent , data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local count = msg.count or 1 local dataSet = csvdb["shop_normalCsv"][id] if not dataSet then return end if dataSet.unlock ~= "" then if not role:checkHangPass(tonumber(dataSet.unlock)) then skynet.error(string.format("shopBuyRpc,user do not finish hang pass, user_id:%d", role:getProperty("id"))) return 1 end end local buyRecord = role.storeData:getProperty("buyR") if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (buyRecord[id] or 0))) then skynet.error(string.format("shop buy over limit, user_id:%d, goods_id:%d", role:getProperty("id"), id)) return 1 end local cost = {[dataSet.icon] = dataSet.cost * count} local desc = "unknown" if dataSet.shop == 1 then -- 普通商店 desc = "dailyShop" local dailySDD = role.dailyData:getProperty("dailySDD") if dailySDD[id] then -- 折扣 cost = math.ceil(dataSet.cost * (1 - dataSet.disount / 100)) end elseif dataSet.shop == 2 then -- 美食商店 desc = "dinerShop" elseif dataSet.shop == 3 then -- 竞技场商店 desc = "pvpShop" end if not role:checkItemEnough(cost) then return end if dataSet.limit ~= 0 then buyRecord[id] = (buyRecord[id] or 0) + count role.storeData:updateProperty({field = "buyR", value = buyRecord}) end role:costItems(cost, {log = {desc = desc, int1 = id, int2 = count}}) local gift = {} for _id, _count in pairs(dataSet.gift:toNumMap()) do gift[_id] = _count * count end local reward = role:award(gift, {log = {desc = desc, int1 = id, int2 = count}}) if dataSet.shop == 1 then role:checkTaskEnter("ShopAll", {count = count}) end local costId, costCount = next(cost) role:log("shop_purchase", { item_id = id, -- 道具id item_type = 0, -- 道具类型,具体见枚举表中道具类型枚举表 item_level = 0, -- 道具等级 item_cnt = count, -- 购买数量技术 currency_type = costId or 0, -- 购买道具消耗的货币类型,记录货币ID shop_purchase_current = costCount or 0, -- 购买道具消耗的货币数量 shop_id = dataSet.shop, -- 商店ID }) role:mylog("role_action", {desc = desc, int1 = id, int2 = count}) SendPacket(actionCodes.Store_shopBuyRpc, MsgPack.pack({reward = reward})) return true end function _M.getFreeChestRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local config = csvdb["shop_rechargeCsv"][id] if not config then return end --判断是否是活动商品 if config.activity_id ~= 0 then local actCfg = csvdb["activity_ctrlCsv"][config.activity_id] if not actCfg then return 2 end if not role.activity:isOpenById(config.activity_id, "ActShopGoods") then return 3 end end local rechargeRecord = role.storeData:getProperty("payR") local getCount = (rechargeRecord[id] or 0) if getCount >= config.limit then return 1 end local reward, _ = role:award(config.itemFirst, {log = {desc = "freeGift", int1 = id}}) rechargeRecord[id] = getCount + 1 role.storeData:updateProperty({field = "payR", value = rechargeRecord}) SendPacket(actionCodes.Store_getFreeChestRpc, MsgPack.pack({reward = reward})) return true end function _M.getGrowFundRewardRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local config = csvdb["reward_newbeeCsv"][id] if not config then return end local growFundFlag = role.storeData:getProperty("growFund") local growFundRecord = role.storeData:getProperty("growFundR") if growFundFlag == 0 then skynet.error("user do not buy grow fund") return 1 end if not role:checkHangPass(config.condition) then skynet.error(string.format("user do not finish hang pass, user_id:%d", role:getProperty("id"))) return 1 end local b = string.getbit(growFundRecord, id) if string.char(b) == "1" then return 1 end growFundRecord = string.setbit(growFundRecord, id) role.storeData:updateProperty({field = "growFundR", value = growFundRecord}) local gift = config.giftFree .. " " .. config.giftLimit local reward, _ = role:award(gift, {log = {desc = "grownFund", int1 = id}}) SendPacket(actionCodes.Store_getGrowFundRewardRpc, MsgPack.pack({reward = reward})) return true end -- 赛季卡 function _M.getBattlePassRewardRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local config = csvdb["reward_battlepassCsv"][id] if not config then return end local timeNow = skynet.timex() local battleCardFlag = role.storeData:getProperty("battleCard") local battleCardFreeRecord = role.storeData:getProperty("battleFR") local battleCardLimitRecord = role.storeData:getProperty("battleLR") local freeFlag = string.char(string.getbit(battleCardFreeRecord, id)) local limitFlag = string.char(string.getbit(battleCardLimitRecord, id)) if freeFlag == "1" and limitFlag == "1" then skynet.error("user already get battle pass reward") return 1 end if battleCardFlag == 1 and limitFlag == "1" then return 1 end if role:getProperty("battlePoint") < config.point then skynet.error(string.format("user do not have enough battle point, user_id:%d", role:getProperty("id"))) return 1 end local gift = "" if freeFlag == "0" then gift = config.giftFree battleCardFreeRecord = string.setbit(battleCardFreeRecord, id) role.storeData:updateProperty({field = "battleFR", value = battleCardFreeRecord}) end if battleCardFlag == 1 and limitFlag == "0" then if gift ~= "" then gift = gift .. " " end gift = gift .. config.giftLimit battleCardLimitRecord = string.setbit(battleCardLimitRecord, id) role.storeData:updateProperty({field = "battleLR", value = battleCardLimitRecord}) end local reward, _ = role:award(gift, {log = {desc = "battleCard", int1 = id}}) SendPacket(actionCodes.Store_getBattlePassRewardRpc, MsgPack.pack({reward = reward})) return true end -- 探索指令奖励 function _M.getExploreCommandRewardRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id -- 探索id local subId = msg.subId -- 领取的阶段id local tab_name = "reward_levelpass" .. id .. "Csv" local config = csvdb[tab_name][subId] if not config then return end local bpInfo = role.storeData:getProperty("bpInfo") or {} local info = bpInfo[id] or {} local flag = info["flag"] or 0 --if flag == 0 then return 1 end local freeRecord = info["fr"] or "" local buyRecord = info["br"] or "" local freeFlag = string.char(string.getbit(freeRecord, subId)) local limitFlag = string.char(string.getbit(buyRecord, subId)) if freeFlag == "1" and limitFlag == "1" then skynet.error("user already get explore command reward") return 2 end if flag == 1 and limitFlag == "1" then return 3 end if not role:checkHangPass(config.level) then return 4 end local gift = "" if freeFlag == "0" then gift = config.giftFree freeRecord = string.setbit(freeRecord, subId) info["fr"] = freeRecord end if flag == 1 and limitFlag == "0" then if gift ~= "" then gift = gift .. " " end gift = gift .. config.giftLimit buyRecord = string.setbit(buyRecord, subId) info["br"] = buyRecord end bpInfo[id] = info role.storeData:updateProperty({field = "bpInfo", value = bpInfo}) local reward, _ = role:award(gift, {log = {desc = "exploreCommand", int1 = id, int2 = subId}}) SendPacket(actionCodes.Store_getExploreCommandRewardRpc, MsgPack.pack({reward = reward})) return true end -- 累充奖励 function _M.getTotalRechargeAwardRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) local index = msg.index -- 领取的索引id local totalTwd = role:getProperty("twdC") local totalRechargeRecord = role.storeData:getProperty("totalRR") local flag = string.char(string.getbit(totalRechargeRecord, index)) if flag == "1" then return 1 end local cfg = csvdb["activity_payRebateCsv"][index] if not cfg then return 2 end if cfg.twd > totalTwd then return 3 end totalRechargeRecord = string.setbit(totalRechargeRecord, index) role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord}) local main = cfg.main_reward:toNumMap() local sub = cfg.sub_reward:toNumMap() for k, v in pairs(sub) do main[k] = (main[k] or 0) + v end local reward, change = role:award(main, {log = {desc = "totalRecharge", int1 = index}}) SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack(role:packReward(reward, change))) return true end return _M