StoreAction.lua 5.53 KB
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


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