local _M = {} local serverId = tonumber(skynet.getenv("servId")) local md5 = require "md5" local function makeOrder(roleId, rechargeId) local orderId = redisproxy:hincrby("autoincrement_set", "order", 1) local partnerOrderId = string.format("%d_%d_%d", serverId, roleId, orderId) local orderKey = string.format("order:%d:%d", roleId, orderId) redisproxy:del(orderKey) local order = require("models.Order").new({ key = orderKey, order = partnerOrderId, rechargeId = rechargeId, }) order:create() redisproxy:sadd(string.format("role:%d:orders", roleId), partnerOrderId) return partnerOrderId end -- 入口在正式服关闭 -- 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 = makeOrder(roleId, id) SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) -- 测试的 直接发奖励了 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 = makeOrder(roleId, id) -- 签名 local secret_key = "b7657fa7ccd44c16a35e3f454ac7a075" local need = { out_trade_no = partnerOrderId, money = dataSet.rmb, game_money = dataSet.diamond, product_id = dataSet.productId, } 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 = makeOrder(roleId, id) -- 签名 local secret_key = "48759e07540f46d9af17ec82669b4272" local need = { out_trade_no = partnerOrderId, money = dataSet.rmb, game_money = dataSet.diamond, } 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 = makeOrder(roleId, id) -- 签名 local secret_key = "9647d2efe1074c73b9ac19af4337a70e" local need = { out_trade_no = partnerOrderId, money = dataSet.rmb, game_money = dataSet.diamond, product_id = dataSet.productId, } 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 partnerOrderStr = msg.order local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") local orderObject = require("models.Order").new({ key = string.format("order:%d:%d", roleId, orderId) }) if not orderObject:load() then -- 订单不存在 skynet.error("cancelPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) return true end if msg.status == "success" then orderObject:setProperty("transactionId", msg.platformOrder or "") return true end if orderObject:getProperty("finishTime") > 0 then return true end orderObject:setProperty("status", msg.status) redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) return true end function _M.dailyBuyRpc(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_diamondCsv"][id] if not dataSet then return 1 end local dailySDC = role.dailyData:getProperty("dailySDC") if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (dailySDC[id] or 0))) then return 1 end local cost = dataSet.cost local dailySDD = role.dailyData:getProperty("dailySDD") if dailySDD[id] then -- 折扣 cost = math.ceil(cost * (1 - dataSet.disount / 100)) end if not role:costDiamond({count = cost * count, log = {desc = "dailyShop", int1 = id, int2 = count}}) then return 4 end if dataSet.limit ~= 0 then dailySDC[id] = (dailySDC[id] or 0) + count role.dailyData:updateProperty({field = "dailySDC", value = dailySDC}) end local gift = {} for itemId, count_ in pairs(dataSet.gift:toNumMap()) do gift[itemId] = count_ * count end local reward = role:award(gift, {log = {desc = "dailyShop", int1 = id, int2 = count}}) role:log("role_action", {desc = "dailyShop", int1 = id, int2 = count}) SendPacket(actionCodes.Store_dailyBuyRpc, MsgPack.pack({reward = reward})) return true end function _M.dinerBuyRpc(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_dinerCsv"][id] if not dataSet then return end local dinerS = role:getProperty("dinerS") if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (dinerS[id] or 0))) then return 1 end local cost = {[ItemId.DinerCoin] = dataSet.cost} if not role:checkItemEnough(cost) then return end if dataSet.limit ~= 0 then dinerS[id] = (dinerS[id] or 0) + count role:updateProperty({field = "dinerS", value = dinerS}) end role:costItems(cost, {log = {desc = "dinerShop", 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 = "dinerShop", int1 = id, int2 = count}}) role:log("role_action", {desc = "dinerShop", int1 = id, int2 = count}) SendPacket(actionCodes.Store_dinerBuyRpc, MsgPack.pack({reward = reward})) return true end return _M