Commit 192b96d36b4ff53faf252fe6b70dd0609f1e513a
1 parent
17d9316a
重置
Showing
4 changed files
with
159 additions
and
22 deletions
Show diff stats
src/actions/GmAction.lua
src/actions/StoreAction.lua
| 1 | 1 | local _M = {} |
| 2 | 2 | |
| 3 | +local serverId = tonumber(skynet.getenv("servId")) | |
| 4 | + | |
| 3 | 5 | function _M.rechargeRpc(agent , data) |
| 6 | + | |
| 4 | 7 | local role = agent.role |
| 5 | 8 | local msg = MsgPack.unpack(data) |
| 6 | 9 | local id = msg.id |
| 7 | 10 | local dataSet = csvdb["shop_rechargeCsv"][id] |
| 11 | + local roleId = role:getProperty("id") | |
| 8 | 12 | if not dataSet then return end |
| 9 | - local diamondCount | |
| 10 | - if dataSet.type == 0 then -- 钻石 | |
| 11 | - local rechargeF = role:getProperty("rechargeF") | |
| 12 | - diamondCount = dataSet.diamond + dataSet.diamondExtra | |
| 13 | - if not rechargeF[id] then | |
| 14 | - diamondCount = diamondCount + dataSet.diamondFirst | |
| 15 | - rechargeF[id] = 1 | |
| 16 | - role:updateProperty({field = "rechargeF", value = rechargeF}) | |
| 17 | - end | |
| 18 | - role:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) | |
| 19 | - elseif dataSet.type == 1 then --月卡 | |
| 20 | - return | |
| 21 | - elseif dataSet.type == 2 then -- 赛季通行证 | |
| 22 | - return | |
| 23 | - else | |
| 24 | - return | |
| 13 | + | |
| 14 | + --创建订单号 | |
| 15 | + local orderId = redisproxy:hincrby("autoincrement_set", "order", 1) | |
| 16 | + local partnerOrderId = string.format("%d_%d_%d", serverId, roleId, orderId) | |
| 17 | + local orderKey = string.format("order:%d:%d", roleId, orderId) | |
| 18 | + redisproxy:del(orderKey) | |
| 19 | + | |
| 20 | + local order = require("models.Order").new({ key = orderKey, order = partnerOrderId, rechargeId = dataSet.id }) | |
| 21 | + order:create() | |
| 22 | + redisproxy:sadd(string.format("role:%d:orders", roleId), partnerOrderId) | |
| 23 | + | |
| 24 | + -- 暂时忽略心跳检查 | |
| 25 | + role.ignoreHeartbeat = true | |
| 26 | + SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ rechargeId = id, order = partnerOrderId })) | |
| 27 | + return true | |
| 28 | +end | |
| 29 | + | |
| 30 | +function _M.purchaseOrderResult(agent, data) | |
| 31 | + local role = agent.role | |
| 32 | + | |
| 33 | + local roleId = role:getProperty("id") | |
| 34 | + local msg = MsgPack.unpack(data) | |
| 35 | + | |
| 36 | + role.ignoreHeartbeat = false | |
| 37 | + | |
| 38 | + local partnerOrderStr = msg.order | |
| 39 | + local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") | |
| 40 | + local orderObject = require("models.Order").new({ key = string.format("order:%d:%d", roleId, orderId) }) | |
| 41 | + if not orderObject:load() then | |
| 42 | + -- 订单不存在 | |
| 43 | + skynet.error("cancelPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) | |
| 44 | + return true | |
| 25 | 45 | end |
| 26 | 46 | |
| 27 | - -- 累充 | |
| 28 | - local rmb = dataSet.rmb | |
| 29 | - role:updateProperty({field = "rmbC", delta = rmb}) | |
| 30 | - | |
| 31 | - role:log("role_action", {desc = "recharge", int1 = id, int2 = rmb}) | |
| 47 | + if msg.status == "success" then | |
| 48 | + orderObject:setProperty("transactionId", msg.platformOrder or "") | |
| 49 | + return true | |
| 50 | + end | |
| 51 | + | |
| 52 | + if orderObject:getProperty("finishTime") > 0 then | |
| 53 | + return true | |
| 54 | + end | |
| 55 | + | |
| 56 | + orderObject:setProperty("status", msg.status) | |
| 32 | 57 | |
| 33 | - SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({diamond = diamondCount})) | |
| 58 | + redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) | |
| 34 | 59 | return true |
| 35 | 60 | end |
| 36 | 61 | ... | ... |
| ... | ... | @@ -0,0 +1,26 @@ |
| 1 | +local Order = class("Order", require("shared.ModelBase")) | |
| 2 | + | |
| 3 | +function Order:ctor(properties) | |
| 4 | + Order.super.ctor(self, properties) | |
| 5 | +end | |
| 6 | + | |
| 7 | +Order.schema = { | |
| 8 | + key = {"string"}, -- redis key | |
| 9 | + order = {"string"}, -- 自己订单号 | |
| 10 | + rechargeId = {"number", 0}, | |
| 11 | + transactionId = {"string", ""}, | |
| 12 | + createTime = {"number", skynet.timex()}, -- 订单创建时间 | |
| 13 | + finishTime = {"number", 0}, -- 服务端验证完成时间 | |
| 14 | + status = {"string", "create"}, | |
| 15 | +} | |
| 16 | + | |
| 17 | +Order.fields = { | |
| 18 | + order = true, | |
| 19 | + rechargeId = true, | |
| 20 | + transactionId = true, | |
| 21 | + createTime = true, | |
| 22 | + finishTime = true, | |
| 23 | + status = true, | |
| 24 | +} | |
| 25 | + | |
| 26 | +return Order | |
| 0 | 27 | \ No newline at end of file | ... | ... |
src/models/RolePlugin.lua
| ... | ... | @@ -1397,6 +1397,88 @@ function RolePlugin.bind(Role) |
| 1397 | 1397 | self:updateProperty({field = "redp", value = redp}) |
| 1398 | 1398 | end |
| 1399 | 1399 | |
| 1400 | + | |
| 1401 | + -- 充值 -- | |
| 1402 | + function Role:handlePurchase(params) | |
| 1403 | + local roleId = self:getProperty("id") | |
| 1404 | + local partnerOrderStr = params.order | |
| 1405 | + | |
| 1406 | + local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") | |
| 1407 | + local orderObject = require("models.Order").new({ key = string.format("order:%d:%d", roleId, orderId) }) | |
| 1408 | + if not orderObject:load() then | |
| 1409 | + -- 订单不存在 | |
| 1410 | + skynet.error("ayncPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) | |
| 1411 | + return | |
| 1412 | + end | |
| 1413 | + | |
| 1414 | + if orderObject:getProperty("finishTime") > 0 then | |
| 1415 | + -- 订单已经处理 | |
| 1416 | + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ result = "handled" })) | |
| 1417 | + return | |
| 1418 | + end | |
| 1419 | + | |
| 1420 | + | |
| 1421 | + local rechargeData = csvdb["shop_rechargeCsv"][orderObject:getProperty("rechargeId")] | |
| 1422 | + if rechargeData.rmb ~= tonumber(params.amount) then | |
| 1423 | + skynet.error(string.format("fake order: %s, roleId: %d, order: %s", | |
| 1424 | + params.transactionId, roleId, partnerOrderStr | |
| 1425 | + )) | |
| 1426 | + return | |
| 1427 | + end | |
| 1428 | + | |
| 1429 | + local diamond = self:recharge({ | |
| 1430 | + id = orderObject:getProperty("rechargeId"), | |
| 1431 | + transactionId = params.transactionId, | |
| 1432 | + pay_time = params.pay_time, | |
| 1433 | + order = partnerOrderStr | |
| 1434 | + }) | |
| 1435 | + orderObject:setProperty("finishTime", skynet.time()) | |
| 1436 | + orderObject:setProperty("status", "finish") | |
| 1437 | + | |
| 1438 | + redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) | |
| 1439 | + | |
| 1440 | + SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, | |
| 1441 | + result = "success", diamond = diamond})) | |
| 1442 | + | |
| 1443 | + return orderObject:getProperty("rechargeId") | |
| 1444 | + end | |
| 1445 | + | |
| 1446 | + | |
| 1447 | + function Role:recharge(params) | |
| 1448 | + local id = tonumber(params.id) | |
| 1449 | + local rechargeData = csvdb["shop_rechargeCsv"][id] | |
| 1450 | + if not rechargeData then | |
| 1451 | + skynet.error("recharge id not exist", id) | |
| 1452 | + return | |
| 1453 | + end | |
| 1454 | + | |
| 1455 | + local diamondCount = 0 | |
| 1456 | + if rechargeData.type == 0 then -- 钻石 | |
| 1457 | + local rechargeF = role:getProperty("rechargeF") | |
| 1458 | + diamondCount = rechargeData.diamond + rechargeData.diamondExtra | |
| 1459 | + if not rechargeF[id] then | |
| 1460 | + diamondCount = diamondCount + rechargeData.diamondFirst | |
| 1461 | + rechargeF[id] = 1 | |
| 1462 | + role:updateProperty({field = "rechargeF", value = rechargeF}) | |
| 1463 | + end | |
| 1464 | + role:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) | |
| 1465 | + elseif rechargeData.type == 1 then --月卡 | |
| 1466 | + return | |
| 1467 | + elseif rechargeData.type == 2 then -- 赛季通行证 | |
| 1468 | + return | |
| 1469 | + else | |
| 1470 | + return | |
| 1471 | + end | |
| 1472 | + | |
| 1473 | + -- 累充 | |
| 1474 | + local rmb = rechargeData.rmb | |
| 1475 | + role:updateProperty({field = "rmbC", delta = rmb}) | |
| 1476 | + | |
| 1477 | + self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time}) | |
| 1478 | + | |
| 1479 | + return diamondCount | |
| 1480 | + end | |
| 1481 | + | |
| 1400 | 1482 | end |
| 1401 | 1483 | |
| 1402 | 1484 | return RolePlugin |
| 1403 | 1485 | \ No newline at end of file | ... | ... |