StoreAction.lua 11 KB
local _M = {}

local serverId = tonumber(skynet.getenv("servId"))
local md5 = require "md5"

-- 入口在正式服关闭  -- 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 = role:getPurchaseOrder(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 = role:getPurchaseOrder(id)
	-- 签名
	local secret_key = "b7657fa7ccd44c16a35e3f454ac7a075"
	local need = {
		out_trade_no = partnerOrderId,
		money = dataSet.rmb * 100,
		game_money = dataSet.diamond,
		product_id = dataSet.productId,
		notify_url = msg.notifyUrl
	}
	local sign = signPms(need, secret_key)

	SendPacket(actionCodes.Store_googleRechargeRpc, MsgPack.pack({ order = partnerOrderId, sign = sign}))
	return true
end

-- mycard 充值 入口
function _M.myCardRechargeRpc(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 = role:getPurchaseOrder(id)
	-- 签名
	local secret_key = "48759e07540f46d9af17ec82669b4272"
	local need = {
		out_trade_no = partnerOrderId,
		money = dataSet.rmb * 100,
		game_money = dataSet.diamond,
		notify_url = msg.notifyUrl
	}
	local sign = signPms(need, secret_key)

	SendPacket(actionCodes.Store_myCardRechargeRpc, MsgPack.pack({ order = partnerOrderId, sign = sign}))
	return true
end

-- mycard 充值 入口
function _M.iosRechargeRpc(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 = role:getPurchaseOrder(id)
	-- 签名
	local secret_key = "9647d2efe1074c73b9ac19af4337a70e"
	local need = {
		out_trade_no = partnerOrderId,
		money = dataSet.rmb * 100,
		game_money = dataSet.diamond,
		product_id = dataSet.iap_product_id,
		notify_url = msg.notifyUrl
	}
	local sign = signPms(need, secret_key)

	SendPacket(actionCodes.Store_iosRechargeRpc, 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 status = {
		fail = true,
		success = true
	}

	local partnerOrderStr = msg.order
	if partnerOrderStr then
		role:updatePurchaseOrder(partnerOrderStr, msg.platformOrder, status[msg.status] and msg.status or "unknown")
	end
	return true
end


function _M.shopBuyRpc(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_normalCsv"][id]
	if not dataSet then return end

	if dataSet.unlock ~= "" then
		if not role:checkHangPass(tonumber(dataSet.unlock)) then
			skynet.error(string.format("shopBuyRpc,user do not finish hang pass, user_id:%d", role:getProperty("id")))
			return 1
		end
	end

	local buyRecord = role.storeData:getProperty("buyR")
	if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (buyRecord[id] or 0))) then 
		skynet.error(string.format("shop buy over limit, user_id:%d, goods_id:%d", role:getProperty("id"), id))
		return 1 
	end

	local cost = {[dataSet.icon] = dataSet.cost * count}

	local desc = "unknown"
	if dataSet.shop == 1 then		-- 普通商店
		desc = "dailyShop"
		local dailySDD = role.dailyData:getProperty("dailySDD")
		if dailySDD[id] then -- 折扣
			cost = math.ceil(dataSet.cost * (1 - dataSet.disount / 100))
		end
	elseif dataSet.shop == 2 then		-- 美食商店
		desc = "dinerShop"
	elseif dataSet.shop == 3 then		-- 竞技场商店
		desc = "pvpShop"
	end

	if not role:checkItemEnough(cost) then return end

	if dataSet.limit ~= 0 then
		buyRecord[id] = (buyRecord[id] or 0) + count
		role.storeData:updateProperty({field = "buyR", value = buyRecord})
	end
	role:costItems(cost, {log = {desc = desc, 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 = desc, int1 = id, int2 = count}})
	
	if dataSet.shop == 1 then
		role:checkTaskEnter("ShopAll", {count = count})
	end
	local costId, costCount = next(cost)

	role:log("shop_purchase", {
		item_id = id, -- 道具id
		item_type = 0, -- 道具类型,具体见枚举表中道具类型枚举表
		item_level = 0, -- 道具等级
		item_cnt = count, -- 购买数量技术
		currency_type = costId or 0, -- 购买道具消耗的货币类型,记录货币ID
		shop_purchase_current = costCount or 0, -- 购买道具消耗的货币数量
		shop_id = dataSet.shop, -- 商店ID
	})
	role:mylog("role_action", {desc = desc, int1 = id, int2 = count})
	SendPacket(actionCodes.Store_shopBuyRpc, MsgPack.pack({reward = reward}))
	return true
end

function _M.getFreeChestRpc(agent, data)
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local id = msg.id

	local config = csvdb["shop_rechargeCsv"][id]
	if not config then return end

    local rechargeRecord = role.storeData:getProperty("payR")
	local getCount = (rechargeRecord[id] or 0)
	if getCount >= config.limit then
		return 1
	end
	local reward, _ = role:award(config.itemFirst, {log = {desc = "freeGift", int1 = id}})

	rechargeRecord[id] = getCount + 1
	role.storeData:updateProperty({field = "payR", value = rechargeRecord})

	SendPacket(actionCodes.Store_getFreeChestRpc, MsgPack.pack({reward = reward}))
	return true
end

function _M.getGrowFundRewardRpc(agent, data)	
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local id = msg.id

	local config = csvdb["reward_newbeeCsv"][id]
	if not config then return end

    local growFundFlag = role.storeData:getProperty("growFund")
	local growFundRecord = role.storeData:getProperty("growFundR")
	
	if growFundFlag == 0 then
		skynet.error("user do not buy grow fund")
		return 1
	end

	if not role:checkHangPass(config.condition) then
		skynet.error(string.format("user do not finish hang pass, user_id:%d", role:getProperty("id")))
		return 1
	end

	local b = string.getbit(growFundRecord, id)
	if string.char(b) == "1" then
		return 1
	end

	growFundRecord = string.setbit(growFundRecord, id)
	role.storeData:updateProperty({field = "growFundR", value = growFundRecord})

	local gift = config.giftFree .. " " .. config.giftLimit
	local reward, _ = role:award(gift, {log = {desc = "grownFund", int1 = id}})

	SendPacket(actionCodes.Store_getGrowFundRewardRpc, MsgPack.pack({reward = reward}))
	return true
end

-- 赛季卡
function _M.getBattlePassRewardRpc(agent, data)	
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local id = msg.id

	local config = csvdb["reward_battlepassCsv"][id]
	if not config then return end

	local timeNow = skynet.timex()
    local battleCardFlag = role.storeData:getProperty("battleCard")
	local battleCardFreeRecord = role.storeData:getProperty("battleFR")
	local battleCardLimitRecord = role.storeData:getProperty("battleLR")

	local freeFlag = string.char(string.getbit(battleCardFreeRecord, id))
	local limitFlag = string.char(string.getbit(battleCardLimitRecord, id))

	if freeFlag == "1" and limitFlag == "1" then
		skynet.error("user already get battle pass reward")
		return 1
	end

	if battleCardFlag == 1 and limitFlag == "1" then
		return 1
	end

	if role:getProperty("battlePoint") < config.point then
		skynet.error(string.format("user do not have enough battle point, user_id:%d", role:getProperty("id")))
		return 1
	end

	local gift = ""
	if  freeFlag == "0" then
		gift = config.giftFree

		battleCardFreeRecord = string.setbit(battleCardFreeRecord, id)
		role.storeData:updateProperty({field = "battleFR", value = battleCardFreeRecord})
	end

	if battleCardFlag == 1 and limitFlag == "0" then
		if gift ~= "" then
			gift = gift .. " "
		end
		gift = gift .. config.giftLimit

		battleCardLimitRecord = string.setbit(battleCardLimitRecord, id)
		role.storeData:updateProperty({field = "battleLR", value = battleCardLimitRecord})
	end
	
	local reward, _ = role:award(gift, {log = {desc = "battleCard", int1 = id}})

	SendPacket(actionCodes.Store_getBattlePassRewardRpc, MsgPack.pack({reward = reward}))
	return true
end

-- 探索指令奖励
function _M.getExploreCommandRewardRpc(agent, data)	
	local role = agent.role
	local msg = MsgPack.unpack(data)
	local id = msg.id		-- 探索id
	local subId = msg.subId		-- 领取的阶段id

	local tab_name = "reward_levelpass" .. id .. "Csv"
	local config = csvdb[tab_name][subId]
	if not config then return end

	local bpInfo = role.storeData:getProperty("bpInfo") or {}
	local info = bpInfo[id] or {}
	local flag = info["flag"] or 0
	--if flag == 0 then return 1 end

	local freeRecord = info["fr"] or ""
	local buyRecord = info["br"] or ""

	local freeFlag = string.char(string.getbit(freeRecord, subId))
	local limitFlag = string.char(string.getbit(buyRecord, subId))

	if freeFlag == "1" and limitFlag == "1" then
		skynet.error("user already get explore command reward")
		return 2
	end

	if flag == 1 and limitFlag == "1" then
		return 3
	end

	if not role:checkHangPass(config.level) then
		return 4
	end

	local gift = ""
	if  freeFlag == "0" then
		gift = config.giftFree

		freeRecord = string.setbit(freeRecord, subId)
		info["fr"] = freeRecord
	end

	if flag == 1 and limitFlag == "0" then
		if gift ~= "" then
			gift = gift .. " "
		end
		gift = gift .. config.giftLimit

		buyRecord = string.setbit(buyRecord, subId)
		info["br"] = buyRecord
	end

	bpInfo[id] = info
	role.storeData:updateProperty({field = "bpInfo", value = bpInfo})
	
	local reward, _ = role:award(gift, {log = {desc = "exploreCommand", int1 = id, int2 = subId}})

	SendPacket(actionCodes.Store_getExploreCommandRewardRpc, MsgPack.pack({reward = reward}))
	return true
end

return _M