Commit 1d83eec2aee0263591206ce9571665f3b8e9c7b3
Merge branch 'bugfix' into develop
* bugfix: 充值 整理
Showing
4 changed files
with
124 additions
and
108 deletions
Show diff stats
src/RedisKeys.lua
src/actions/StoreAction.lua
| ... | ... | @@ -3,34 +3,6 @@ local _M = {} |
| 3 | 3 | local serverId = tonumber(skynet.getenv("servId")) |
| 4 | 4 | local md5 = require "md5" |
| 5 | 5 | |
| 6 | -local function makeOrder(role, rechargeId) | |
| 7 | - local roleId = role:getProperty("id") | |
| 8 | - local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] | |
| 9 | - if not rechargeData then | |
| 10 | - skynet.error("recharge id not exist", rechargeId) | |
| 11 | - return "" | |
| 12 | - end | |
| 13 | - local limit = rechargeData.limit | |
| 14 | - local rechargeRecord = role:getProperty("payR") or {} | |
| 15 | - if limit ~= 0 and limit <= (rechargeRecord[rechargeId] or 0) then | |
| 16 | - skynet.error(string.format("recharge id:%d count over limit, user id:%d", rechargeId, roleId)) | |
| 17 | - return "" | |
| 18 | - end | |
| 19 | - | |
| 20 | - local orderId = redisproxy:hincrby("autoincrement_set", "order", 1) | |
| 21 | - local partnerOrderId = string.format("%d_%d_%d", serverId, roleId, orderId) | |
| 22 | - local orderKey = string.format("order:%d:%d", roleId, orderId) | |
| 23 | - redisproxy:del(orderKey) | |
| 24 | - local order = require("models.Order").new({ | |
| 25 | - key = orderKey, | |
| 26 | - order = partnerOrderId, | |
| 27 | - rechargeId = rechargeId, | |
| 28 | - }) | |
| 29 | - order:create() | |
| 30 | - redisproxy:sadd(string.format("role:%d:orders", roleId), partnerOrderId) | |
| 31 | - return partnerOrderId | |
| 32 | -end | |
| 33 | - | |
| 34 | 6 | -- 入口在正式服关闭 -- mock 充值 |
| 35 | 7 | function _M.rechargeRpc(agent , data) |
| 36 | 8 | local role = agent.role |
| ... | ... | @@ -41,7 +13,7 @@ function _M.rechargeRpc(agent , data) |
| 41 | 13 | local roleId = role:getProperty("id") |
| 42 | 14 | |
| 43 | 15 | --创建订单号 |
| 44 | - local partnerOrderId = makeOrder(role, id) | |
| 16 | + local partnerOrderId = role:getPurchaseOrder(id) | |
| 45 | 17 | SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) |
| 46 | 18 | |
| 47 | 19 | |
| ... | ... | @@ -90,7 +62,7 @@ function _M.googleRechargeRpc(agent, data) |
| 90 | 62 | |
| 91 | 63 | role.ignoreHeartbeat = true |
| 92 | 64 | --创建订单号 |
| 93 | - local partnerOrderId = makeOrder(role, id) | |
| 65 | + local partnerOrderId = role:getPurchaseOrder(id) | |
| 94 | 66 | -- 签名 |
| 95 | 67 | local secret_key = "b7657fa7ccd44c16a35e3f454ac7a075" |
| 96 | 68 | local need = { |
| ... | ... | @@ -117,7 +89,7 @@ function _M.myCardRechargeRpc(agent, data) |
| 117 | 89 | |
| 118 | 90 | role.ignoreHeartbeat = true |
| 119 | 91 | --创建订单号 |
| 120 | - local partnerOrderId = makeOrder(role, id) | |
| 92 | + local partnerOrderId = role:getPurchaseOrder(id) | |
| 121 | 93 | -- 签名 |
| 122 | 94 | local secret_key = "48759e07540f46d9af17ec82669b4272" |
| 123 | 95 | local need = { |
| ... | ... | @@ -143,7 +115,7 @@ function _M.iosRechargeRpc(agent, data) |
| 143 | 115 | |
| 144 | 116 | role.ignoreHeartbeat = true |
| 145 | 117 | --创建订单号 |
| 146 | - local partnerOrderId = makeOrder(role, id) | |
| 118 | + local partnerOrderId = role:getPurchaseOrder(id) | |
| 147 | 119 | -- 签名 |
| 148 | 120 | local secret_key = "9647d2efe1074c73b9ac19af4337a70e" |
| 149 | 121 | local need = { |
| ... | ... | @@ -167,43 +139,15 @@ function _M.purchaseOrderResult(agent, data) |
| 167 | 139 | |
| 168 | 140 | role.ignoreHeartbeat = false |
| 169 | 141 | |
| 170 | - local partnerOrderStr = msg.order | |
| 171 | - local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") | |
| 172 | - local orderObject = require("models.Order").new({ key = string.format("order:%d:%d", roleId, orderId) }) | |
| 173 | - if not orderObject:load() then | |
| 174 | - -- 订单不存在 | |
| 175 | - skynet.error("cancelPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) | |
| 176 | - return true | |
| 177 | - end | |
| 178 | - | |
| 179 | - if msg.status == "success" then | |
| 180 | - orderObject:setProperty("transactionId", msg.platformOrder or "") | |
| 181 | - local rechargeId = orderObject:getProperty("rechargeId") | |
| 182 | - local dataSet = csvdb["shop_rechargeCsv"][rechargeId] | |
| 183 | - | |
| 184 | - role:log("setOrder", { | |
| 185 | - order_status = 100, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" | |
| 186 | - item_id = rechargeId, -- 道具id | |
| 187 | - item_type = dataSet.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 | |
| 188 | - item_name = dataSet.title, -- 购买的道具名 | |
| 189 | - item_number = 1, -- 购买的道具数量 | |
| 190 | - item_level = 1, -- 购买的道具等级 | |
| 191 | - order_cost = dataSet.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' | |
| 192 | - order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 | |
| 193 | - order_type = role:getProperty("rmbC") > 0 and 0 or 1, -- 订单类型,首充记录为1,否则为0 | |
| 194 | - order_id = msg.platformOrder, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' | |
| 195 | - }) | |
| 196 | - | |
| 197 | - return true | |
| 198 | - end | |
| 142 | + local status = { | |
| 143 | + fail = true, | |
| 144 | + success = true | |
| 145 | + } | |
| 199 | 146 | |
| 200 | - if orderObject:getProperty("finishTime") > 0 then | |
| 201 | - return true | |
| 147 | + local partnerOrderStr = msg.order | |
| 148 | + if partnerOrderStr then | |
| 149 | + role:updatePurchaseOrder(partnerOrderStr, msg.platformOrder, status[msg.status] and msg.status or "unknown") | |
| 202 | 150 | end |
| 203 | - | |
| 204 | - orderObject:setProperty("status", msg.status) | |
| 205 | - | |
| 206 | - redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) | |
| 207 | 151 | return true |
| 208 | 152 | end |
| 209 | 153 | ... | ... |
src/models/RolePlugin.lua
| ... | ... | @@ -1534,6 +1534,102 @@ function RolePlugin.bind(Role) |
| 1534 | 1534 | self:updateProperty({field = "redp", value = redp}) |
| 1535 | 1535 | end |
| 1536 | 1536 | |
| 1537 | + -- 获取充值订单号 | |
| 1538 | + function Role:getPurchaseOrder(rechargeId) | |
| 1539 | + local roleId = self:getProperty("id") | |
| 1540 | + local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] | |
| 1541 | + if not rechargeData then | |
| 1542 | + skynet.error("recharge id not exist", rechargeId) | |
| 1543 | + return "" | |
| 1544 | + end | |
| 1545 | + local limit = rechargeData.limit | |
| 1546 | + local rechargeRecord = self:getProperty("payR") or {} | |
| 1547 | + if limit ~= 0 and limit <= (rechargeRecord[rechargeId] or 0) then | |
| 1548 | + return "" | |
| 1549 | + end | |
| 1550 | + | |
| 1551 | + local orderId = redisproxy:hget(string.format(R_ORDERS, roleId), rechargeId) | |
| 1552 | + if orderId then | |
| 1553 | + local orderObject = require("models.Order").new({ key = string.format(R_ORDER, roleId, orderId) }) | |
| 1554 | + if orderObject:load() and orderObject:getProperty("rechargeId") == rechargeId and math.abs(skynet.timex() - orderObject:getProperty("createTime")) < 5 * 60 then | |
| 1555 | + return string.format("%d_%d_%d", serverId, roleId, orderId) | |
| 1556 | + end | |
| 1557 | + end | |
| 1558 | + | |
| 1559 | + orderId = redisproxy:hincrby("autoincrement_set", "order", 1) | |
| 1560 | + local partnerOrderId = string.format("%d_%d_%d", serverId, roleId, orderId) | |
| 1561 | + local orderKey = string.format(R_ORDER, roleId, orderId) | |
| 1562 | + redisproxy:del(orderKey) -- 删掉可能有了 | |
| 1563 | + local order = require("models.Order").new({ | |
| 1564 | + key = orderKey, | |
| 1565 | + order = partnerOrderId, | |
| 1566 | + rechargeId = rechargeId, | |
| 1567 | + }) | |
| 1568 | + order:create() | |
| 1569 | + -- 正在进行中的订单 缓存 | |
| 1570 | + redisproxy:hset(string.format(R_ORDERS, roleId), rechargeId, orderId) | |
| 1571 | + return partnerOrderId | |
| 1572 | + end | |
| 1573 | + | |
| 1574 | + -- 更新订单信息 | |
| 1575 | + --[[ | |
| 1576 | + | |
| 1577 | + status | |
| 1578 | + | |
| 1579 | + success | |
| 1580 | + fail | |
| 1581 | + finsh | |
| 1582 | + unknow | |
| 1583 | + | |
| 1584 | + --]] | |
| 1585 | + function Role:updatePurchaseOrder(partnerOrderStr, platformOrder, status) | |
| 1586 | + if not partnerOrderStr then return false end | |
| 1587 | + local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") | |
| 1588 | + | |
| 1589 | + local roleId = self:getProperty("id") | |
| 1590 | + local orderObject = require("models.Order").new({ key = string.format(R_ORDER, roleId, orderId) }) | |
| 1591 | + if not orderObject:load() then | |
| 1592 | + return false | |
| 1593 | + end | |
| 1594 | + | |
| 1595 | + local rechargeId = orderObject:getProperty("rechargeId") | |
| 1596 | + local dataSet = csvdb["shop_rechargeCsv"][rechargeId] | |
| 1597 | + | |
| 1598 | + if orderObject:getProperty("finishTime") > 0 then | |
| 1599 | + return false, "finsh" | |
| 1600 | + end | |
| 1601 | + | |
| 1602 | + if msg.platformOrder then | |
| 1603 | + orderObject:setProperty("transactionId", msg.platformOrder) | |
| 1604 | + end | |
| 1605 | + orderObject:setProperty("status", msg.status) | |
| 1606 | + | |
| 1607 | + -- 开始下单 | |
| 1608 | + if status == "success" then | |
| 1609 | + elseif status == "fail" then | |
| 1610 | + redisproxy:hdel(string.format(R_ORDERS, roleId), orderId) | |
| 1611 | + elseif status == "finsh" then | |
| 1612 | + orderObject:setProperty("finishTime", skynet.time()) | |
| 1613 | + redisproxy:hdel(string.format(R_ORDERS, roleId), orderId) | |
| 1614 | + end | |
| 1615 | + | |
| 1616 | + if status ~= "unknow" then | |
| 1617 | + self:log("setOrder", { | |
| 1618 | + order_status = ({success = 100, finsh = 200, fail = 300})[status] or 1000, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" | |
| 1619 | + item_id = rechargeId, -- 道具id | |
| 1620 | + item_type = dataSet.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 | |
| 1621 | + item_name = dataSet.title, -- 购买的道具名 | |
| 1622 | + item_number = 1, -- 购买的道具数量 | |
| 1623 | + item_level = 1, -- 购买的道具等级 | |
| 1624 | + order_cost = dataSet.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' | |
| 1625 | + order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 | |
| 1626 | + order_type = self:getProperty("rmbC") > 0 and 0 or 1, -- 订单类型,首充记录为1,否则为0 | |
| 1627 | + order_id = platformOrder, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' | |
| 1628 | + }) | |
| 1629 | + end | |
| 1630 | + | |
| 1631 | + return true, rechargeId | |
| 1632 | + end | |
| 1537 | 1633 | |
| 1538 | 1634 | -- 充值 -- |
| 1539 | 1635 | --[[ |
| ... | ... | @@ -1548,63 +1644,37 @@ function RolePlugin.bind(Role) |
| 1548 | 1644 | local roleId = self:getProperty("id") |
| 1549 | 1645 | local partnerOrderStr = params.order |
| 1550 | 1646 | |
| 1551 | - local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") | |
| 1552 | - local orderObject = require("models.Order").new({ key = string.format("order:%d:%d", roleId, orderId) }) | |
| 1553 | - if not orderObject:load() then | |
| 1554 | - -- 订单不存在 | |
| 1555 | - skynet.error("ayncPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) | |
| 1556 | - return | |
| 1557 | - end | |
| 1558 | 1647 | |
| 1559 | - if orderObject:getProperty("finishTime") > 0 then | |
| 1560 | - -- 订单已经处理 | |
| 1561 | - SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) | |
| 1648 | + local status, back = self:updatePurchaseOrder(partnerOrderStr, params.transactionId, "finsh") | |
| 1649 | + if not status then | |
| 1650 | + if back == "finsh" then | |
| 1651 | + -- 订单已经处理 | |
| 1652 | + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) | |
| 1653 | + end | |
| 1562 | 1654 | return |
| 1563 | 1655 | end |
| 1564 | - local rechargeId = orderObject:getProperty("rechargeId") | |
| 1656 | + local rechargeId = back | |
| 1565 | 1657 | local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] |
| 1566 | 1658 | if rechargeData.rmb ~= tonumber(params.amount) then |
| 1567 | - skynet.error(string.format("fake order: %s, roleId: %d, order: %s, rmb %s, get %s", | |
| 1659 | + skynet.error(string.format("[recharge] fake order: %s, roleId: %d, order: %s, rmb %s, get %s", | |
| 1568 | 1660 | params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount |
| 1569 | 1661 | )) |
| 1570 | 1662 | return |
| 1571 | 1663 | end |
| 1572 | 1664 | |
| 1573 | - local order_type = self:getProperty("rmbC") > 0 and 0 or 1 | |
| 1574 | 1665 | local status, reward = self:recharge({ |
| 1575 | 1666 | id = rechargeId, |
| 1576 | 1667 | transactionId = params.transactionId, |
| 1577 | 1668 | pay_time = params.pay_time, |
| 1578 | 1669 | order = partnerOrderStr, |
| 1579 | 1670 | }) |
| 1580 | - orderObject:setProperty("finishTime", skynet.time()) | |
| 1581 | - orderObject:setProperty("status", "finish") | |
| 1582 | - | |
| 1583 | - redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) | |
| 1584 | 1671 | |
| 1585 | 1672 | if not status then |
| 1586 | - status = 200 | |
| 1587 | - else | |
| 1588 | - status = 1000 + status | |
| 1589 | - end | |
| 1590 | - self:log("setOrder", { | |
| 1591 | - order_status = status, -- "订单状态:100 - 开始下单(玩家还未开始付费行为记录)200 - 支付完成并发货(SDK通知可以发货时记录),300 - 订单被取消,1000 - 其他" | |
| 1592 | - item_id = rechargeId, -- 道具id | |
| 1593 | - item_type = rechargeData.type, -- 购买的道具类型,具体见"onItems"方法中道具类型枚举表 | |
| 1594 | - item_name = rechargeData.title, -- 购买的道具名 | |
| 1595 | - item_number = 1, -- 购买的道具数量 | |
| 1596 | - item_level = 1, -- 购买的道具等级 | |
| 1597 | - order_cost = rechargeData.rmb * 100, -- 此次消费的现金金额(单位:分),如 51800即未518元,对应客户端SDK传入的'total_fee' | |
| 1598 | - order_currency = "CNY", -- 货币类型,默认为"CNY"(人民币),遵循ISO 4217规范 | |
| 1599 | - order_type = order_type, -- 订单类型,首充记录为1,否则为0 | |
| 1600 | - order_id = params.transactionId, -- 本条记录的订单号,对应客户端SDK返回的'bs_trade_no' | |
| 1601 | - }) | |
| 1602 | - if status ~= 200 then return end | |
| 1603 | - | |
| 1604 | - SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, | |
| 1605 | - result = "success", reward = reward})) | |
| 1673 | + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, | |
| 1674 | + result = "success", reward = reward})) | |
| 1675 | + end | |
| 1606 | 1676 | |
| 1607 | - return orderObject:getProperty("rechargeId") | |
| 1677 | + return rechargeId | |
| 1608 | 1678 | end |
| 1609 | 1679 | |
| 1610 | 1680 | |
| ... | ... | @@ -1612,7 +1682,7 @@ function RolePlugin.bind(Role) |
| 1612 | 1682 | local id = tonumber(params.id) |
| 1613 | 1683 | local rechargeData = csvdb["shop_rechargeCsv"][id] |
| 1614 | 1684 | if not rechargeData then |
| 1615 | - skynet.error("recharge id not exist", id) | |
| 1685 | + skynet.error("[recharge] recharge id not exist", id) | |
| 1616 | 1686 | return 1 |
| 1617 | 1687 | end |
| 1618 | 1688 | |
| ... | ... | @@ -1637,7 +1707,7 @@ function RolePlugin.bind(Role) |
| 1637 | 1707 | elseif rechargeData.shop == 3 then -- 礼包商店 |
| 1638 | 1708 | reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}}) |
| 1639 | 1709 | else |
| 1640 | - skynet.error("invalid recharge shop type " .. id) | |
| 1710 | + skynet.error("[recharge] invalid recharge shop type " .. id) | |
| 1641 | 1711 | return 3 |
| 1642 | 1712 | end |
| 1643 | 1713 | ... | ... |
src/models/Store.lua
| ... | ... | @@ -226,7 +226,7 @@ end |
| 226 | 226 | function Store:checkRechargeRecord(limit, id) |
| 227 | 227 | local rechargeRecord = self:getProperty("payR") or {} |
| 228 | 228 | if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then |
| 229 | - skynet.error(string.format("recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) | |
| 229 | + skynet.error(string.format("[recharge] recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) | |
| 230 | 230 | return false |
| 231 | 231 | end |
| 232 | 232 | rechargeRecord[id] = (rechargeRecord[id] or 0) + 1 | ... | ... |