From 192b96d36b4ff53faf252fe6b70dd0609f1e513a Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Tue, 16 Jun 2020 19:32:47 +0800 Subject: [PATCH] 重置 --- src/actions/GmAction.lua | 4 ++++ src/actions/StoreAction.lua | 69 +++++++++++++++++++++++++++++++++++++++++++++++---------------------- src/models/Order.lua | 26 ++++++++++++++++++++++++++ src/models/RolePlugin.lua | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+), 22 deletions(-) create mode 100644 src/models/Order.lua diff --git a/src/actions/GmAction.lua b/src/actions/GmAction.lua index 0428159..72afb91 100644 --- a/src/actions/GmAction.lua +++ b/src/actions/GmAction.lua @@ -514,6 +514,10 @@ function _M.helpRpc(agent, data) return true end +-- 充值回调 +function _M.ayncPurchase(role, params) + return role:handlePurchase(params) +end diff --git a/src/actions/StoreAction.lua b/src/actions/StoreAction.lua index b80359a..0de39d6 100644 --- a/src/actions/StoreAction.lua +++ b/src/actions/StoreAction.lua @@ -1,36 +1,61 @@ local _M = {} +local serverId = tonumber(skynet.getenv("servId")) + function _M.rechargeRpc(agent , data) + local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local dataSet = csvdb["shop_rechargeCsv"][id] + local roleId = role:getProperty("id") if not dataSet then return end - local diamondCount - if dataSet.type == 0 then -- 钻石 - local rechargeF = role:getProperty("rechargeF") - diamondCount = dataSet.diamond + dataSet.diamondExtra - if not rechargeF[id] then - diamondCount = diamondCount + dataSet.diamondFirst - rechargeF[id] = 1 - role:updateProperty({field = "rechargeF", value = rechargeF}) - end - role:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) - elseif dataSet.type == 1 then --月卡 - return - elseif dataSet.type == 2 then -- 赛季通行证 - return - else - return + + --创建订单号 + 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 = dataSet.id }) + order:create() + redisproxy:sadd(string.format("role:%d:orders", roleId), partnerOrderId) + + -- 暂时忽略心跳检查 + role.ignoreHeartbeat = true + SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ rechargeId = id, order = partnerOrderId })) + 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 - -- 累充 - local rmb = dataSet.rmb - role:updateProperty({field = "rmbC", delta = rmb}) - - role:log("role_action", {desc = "recharge", int1 = id, int2 = rmb}) + 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) - SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({diamond = diamondCount})) + redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) return true end diff --git a/src/models/Order.lua b/src/models/Order.lua new file mode 100644 index 0000000..30b0b32 --- /dev/null +++ b/src/models/Order.lua @@ -0,0 +1,26 @@ +local Order = class("Order", require("shared.ModelBase")) + +function Order:ctor(properties) + Order.super.ctor(self, properties) +end + +Order.schema = { + key = {"string"}, -- redis key + order = {"string"}, -- 自己订单号 + rechargeId = {"number", 0}, + transactionId = {"string", ""}, + createTime = {"number", skynet.timex()}, -- 订单创建时间 + finishTime = {"number", 0}, -- 服务端验证完成时间 + status = {"string", "create"}, +} + +Order.fields = { + order = true, + rechargeId = true, + transactionId = true, + createTime = true, + finishTime = true, + status = true, +} + +return Order \ No newline at end of file diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index ce1bbcd..54184ec 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -1397,6 +1397,88 @@ function RolePlugin.bind(Role) self:updateProperty({field = "redp", value = redp}) end + + -- 充值 -- + function Role:handlePurchase(params) + local roleId = self:getProperty("id") + local partnerOrderStr = params.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("ayncPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) + return + end + + if orderObject:getProperty("finishTime") > 0 then + -- 订单已经处理 + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) + return + end + + + local rechargeData = csvdb["shop_rechargeCsv"][orderObject:getProperty("rechargeId")] + if rechargeData.rmb ~= tonumber(params.amount) then + skynet.error(string.format("fake order: %s, roleId: %d, order: %s", + params.transactionId, roleId, partnerOrderStr + )) + return + end + + local diamond = self:recharge({ + id = orderObject:getProperty("rechargeId"), + transactionId = params.transactionId, + pay_time = params.pay_time, + order = partnerOrderStr + }) + orderObject:setProperty("finishTime", skynet.time()) + orderObject:setProperty("status", "finish") + + redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) + + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, + result = "success", diamond = diamond})) + + return orderObject:getProperty("rechargeId") + end + + + function Role:recharge(params) + local id = tonumber(params.id) + local rechargeData = csvdb["shop_rechargeCsv"][id] + if not rechargeData then + skynet.error("recharge id not exist", id) + return + end + + local diamondCount = 0 + if rechargeData.type == 0 then -- 钻石 + local rechargeF = role:getProperty("rechargeF") + diamondCount = rechargeData.diamond + rechargeData.diamondExtra + if not rechargeF[id] then + diamondCount = diamondCount + rechargeData.diamondFirst + rechargeF[id] = 1 + role:updateProperty({field = "rechargeF", value = rechargeF}) + end + role:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) + elseif rechargeData.type == 1 then --月卡 + return + elseif rechargeData.type == 2 then -- 赛季通行证 + return + else + return + end + + -- 累充 + local rmb = rechargeData.rmb + role:updateProperty({field = "rmbC", delta = rmb}) + + self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time}) + + return diamondCount + end + end return RolePlugin \ No newline at end of file -- libgit2 0.21.2