From d705a315d66ebbd40c6bf1f09b4822c3e726e240 Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Fri, 20 Nov 2020 18:01:18 +0800 Subject: [PATCH] 充值 整理 --- src/RedisKeys.lua | 2 ++ src/actions/StoreAction.lua | 78 +++++++++++------------------------------------------------------------------- src/models/RolePlugin.lua | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------- src/models/Store.lua | 2 +- 4 files changed, 124 insertions(+), 108 deletions(-) diff --git a/src/RedisKeys.lua b/src/RedisKeys.lua index af9b23b..b83d08d 100644 --- a/src/RedisKeys.lua +++ b/src/RedisKeys.lua @@ -12,6 +12,8 @@ R_RUNE = "role:%d:rune:%d" -- 符文详细信息 R_EMAIL = "role:%d:emailIds" --邮件列表 R_EMAIL_ITEM = "email:%d:%d" --邮件 R_STORE = "role:%d:store" -- 商店 +R_ORDERS = "role:%d:orders" -- 订单 +R_ORDER = "order:%d:%d" -- rank diff --git a/src/actions/StoreAction.lua b/src/actions/StoreAction.lua index daaf26a..cc001b6 100644 --- a/src/actions/StoreAction.lua +++ b/src/actions/StoreAction.lua @@ -3,34 +3,6 @@ local _M = {} local serverId = tonumber(skynet.getenv("servId")) local md5 = require "md5" -local function makeOrder(role, rechargeId) - local roleId = role:getProperty("id") - local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] - if not rechargeData then - skynet.error("recharge id not exist", rechargeId) - return "" - end - local limit = rechargeData.limit - local rechargeRecord = role:getProperty("payR") or {} - if limit ~= 0 and limit <= (rechargeRecord[rechargeId] or 0) then - skynet.error(string.format("recharge id:%d count over limit, user id:%d", rechargeId, roleId)) - return "" - end - - 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 @@ -41,7 +13,7 @@ function _M.rechargeRpc(agent , data) local roleId = role:getProperty("id") --创建订单号 - local partnerOrderId = makeOrder(role, id) + local partnerOrderId = role:getPurchaseOrder(id) SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) @@ -90,7 +62,7 @@ function _M.googleRechargeRpc(agent, data) role.ignoreHeartbeat = true --创建订单号 - local partnerOrderId = makeOrder(role, id) + local partnerOrderId = role:getPurchaseOrder(id) -- 签名 local secret_key = "b7657fa7ccd44c16a35e3f454ac7a075" local need = { @@ -117,7 +89,7 @@ function _M.myCardRechargeRpc(agent, data) role.ignoreHeartbeat = true --创建订单号 - local partnerOrderId = makeOrder(role, id) + local partnerOrderId = role:getPurchaseOrder(id) -- 签名 local secret_key = "48759e07540f46d9af17ec82669b4272" local need = { @@ -143,7 +115,7 @@ function _M.iosRechargeRpc(agent, data) role.ignoreHeartbeat = true --创建订单号 - local partnerOrderId = makeOrder(role, id) + local partnerOrderId = role:getPurchaseOrder(id) -- 签名 local secret_key = "9647d2efe1074c73b9ac19af4337a70e" local need = { @@ -167,43 +139,15 @@ function _M.purchaseOrderResult(agent, 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 "") - local rechargeId = orderObject:getProperty("rechargeId") - local dataSet = csvdb["shop_rechargeCsv"][rechargeId] - - role:log("setOrder", { - order_status = 100, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" - item_id = rechargeId, -- 道具id - item_type = dataSet.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 - item_name = dataSet.title, -- 购买的道具名 - item_number = 1, -- 购买的道具数量 - item_level = 1, -- 购买的道具等级 - order_cost = dataSet.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' - order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 - order_type = role:getProperty("rmbC") > 0 and 0 or 1, -- 订单类型,首充记录为1,否则为0 - order_id = msg.platformOrder, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' - }) - - return true - end + local status = { + fail = true, + success = true + } - if orderObject:getProperty("finishTime") > 0 then - return true + local partnerOrderStr = msg.order + if partnerOrderStr then + role:updatePurchaseOrder(partnerOrderStr, msg.platformOrder, status[msg.status] and msg.status or "unknown") end - - orderObject:setProperty("status", msg.status) - - redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) return true end diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index 4d83433..7ad64cc 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -1497,6 +1497,102 @@ function RolePlugin.bind(Role) self:updateProperty({field = "redp", value = redp}) end + -- 获取充值订单号 + function Role:getPurchaseOrder(rechargeId) + local roleId = self:getProperty("id") + local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] + if not rechargeData then + skynet.error("recharge id not exist", rechargeId) + return "" + end + local limit = rechargeData.limit + local rechargeRecord = self:getProperty("payR") or {} + if limit ~= 0 and limit <= (rechargeRecord[rechargeId] or 0) then + return "" + end + + local orderId = redisproxy:hget(string.format(R_ORDERS, roleId), rechargeId) + if orderId then + local orderObject = require("models.Order").new({ key = string.format(R_ORDER, roleId, orderId) }) + if orderObject:load() and orderObject:getProperty("rechargeId") == rechargeId and math.abs(skynet.timex() - orderObject:getProperty("createTime")) < 5 * 60 then + return string.format("%d_%d_%d", serverId, roleId, orderId) + end + end + + orderId = redisproxy:hincrby("autoincrement_set", "order", 1) + local partnerOrderId = string.format("%d_%d_%d", serverId, roleId, orderId) + local orderKey = string.format(R_ORDER, roleId, orderId) + redisproxy:del(orderKey) -- 删掉可能有了 + local order = require("models.Order").new({ + key = orderKey, + order = partnerOrderId, + rechargeId = rechargeId, + }) + order:create() + -- 正在进行中的订单 缓存 + redisproxy:hset(string.format(R_ORDERS, roleId), rechargeId, orderId) + return partnerOrderId + end + + -- 更新订单信息 + --[[ + + status + + success + fail + finsh + unknow + + --]] + function Role:updatePurchaseOrder(partnerOrderStr, platformOrder, status) + if not partnerOrderStr then return false end + local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") + + local roleId = self:getProperty("id") + local orderObject = require("models.Order").new({ key = string.format(R_ORDER, roleId, orderId) }) + if not orderObject:load() then + return false + end + + local rechargeId = orderObject:getProperty("rechargeId") + local dataSet = csvdb["shop_rechargeCsv"][rechargeId] + + if orderObject:getProperty("finishTime") > 0 then + return false, "finsh" + end + + if msg.platformOrder then + orderObject:setProperty("transactionId", msg.platformOrder) + end + orderObject:setProperty("status", msg.status) + + -- 开始下单 + if status == "success" then + elseif status == "fail" then + redisproxy:hdel(string.format(R_ORDERS, roleId), orderId) + elseif status == "finsh" then + orderObject:setProperty("finishTime", skynet.time()) + redisproxy:hdel(string.format(R_ORDERS, roleId), orderId) + end + + if status ~= "unknow" then + self:log("setOrder", { + order_status = ({success = 100, finsh = 200, fail = 300})[status] or 1000, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" + item_id = rechargeId, -- 道具id + item_type = dataSet.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 + item_name = dataSet.title, -- 购买的道具名 + item_number = 1, -- 购买的道具数量 + item_level = 1, -- 购买的道具等级 + order_cost = dataSet.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 + order_type = self:getProperty("rmbC") > 0 and 0 or 1, -- 订单类型,首充记录为1,否则为0 + order_id = platformOrder, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' + }) + end + + return true, rechargeId + end -- 充值 -- --[[ @@ -1511,63 +1607,37 @@ function RolePlugin.bind(Role) 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" })) + local status, back = self:updatePurchaseOrder(partnerOrderStr, params.transactionId, "finsh") + if not status then + if back == "finsh" then + -- 订单已经处理 + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) + end return end - local rechargeId = orderObject:getProperty("rechargeId") + local rechargeId = back local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] if rechargeData.rmb ~= tonumber(params.amount) then - skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s", + skynet.error(string.format("[recharge] fake order: %s, roleId: %d, order: %s, rmb %s, get %s", params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount )) return end - local order_type = self:getProperty("rmbC") > 0 and 0 or 1 local status, reward = self:recharge({ id = 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) if not status then - status = 200 - else - status = 1000 + status - end - self:log("setOrder", { - order_status = status, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" - item_id = rechargeId, -- 道具id - item_type = rechargeData.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 - item_name = rechargeData.title, -- 购买的道具名 - item_number = 1, -- 购买的道具数量 - item_level = 1, -- 购买的道具等级 - order_cost = rechargeData.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' - order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 - order_type = order_type, -- 订单类型,首充记录为1,否则为0 - order_id = params.transactionId, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' - }) - if status ~= 200 then return end - - SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, - result = "success", reward = reward})) + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, + result = "success", reward = reward})) + end - return orderObject:getProperty("rechargeId") + return rechargeId end @@ -1575,7 +1645,7 @@ function RolePlugin.bind(Role) local id = tonumber(params.id) local rechargeData = csvdb["shop_rechargeCsv"][id] if not rechargeData then - skynet.error("recharge id not exist", id) + skynet.error("[recharge] recharge id not exist", id) return 1 end @@ -1600,7 +1670,7 @@ function RolePlugin.bind(Role) elseif rechargeData.shop == 3 then -- 礼包商店 reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}}) else - skynet.error("invalid recharge shop type " .. id) + skynet.error("[recharge] invalid recharge shop type " .. id) return 3 end diff --git a/src/models/Store.lua b/src/models/Store.lua index f73b8b3..0363ecb 100644 --- a/src/models/Store.lua +++ b/src/models/Store.lua @@ -226,7 +226,7 @@ end function Store:checkRechargeRecord(limit, id) local rechargeRecord = self:getProperty("payR") or {} if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then - skynet.error(string.format("recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) + skynet.error(string.format("[recharge] recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) return false end rechargeRecord[id] = (rechargeRecord[id] or 0) + 1 -- libgit2 0.21.2