Ver código fonte

新协议文档

flowerpig 2 anos atrás
pai
commit
d34c4d1639

+ 1 - 1
script/module/chat/Gm.lua

@@ -730,7 +730,7 @@ function d3.buy(human,val)
 	msg.money = checkMoney
 	ApiLogic.CHARGE_CODE_HIS = {}
 	print("cccc:",val)
-       	BuyLogic.buy(human,val)
+    BuyLogic.buy(human,val)
         --PlatformHandler.CG_TENCENT_BUY(human,msg)
 	--AdminLogic.adminFunction.tencentPay(msg)
 end

+ 3 - 1
script/module/hero/Handler.lua

@@ -204,4 +204,6 @@ end
 
 function CG_HERO_BOOK_SINGLE_QUERY(human,msg)
     HeroBook.queryHeroBookById(human,msg.heroID,msg.star)
-end
+end
+
+

+ 5 - 0
script/module/hero/Proto.lua

@@ -728,3 +728,8 @@ GC_HERO_TEN_ZHIHUAN = {
 	{"heroSimple",         1, HeroSimple},    
 }
 
+
+
+
+
+

+ 31 - 0
script/module/platform/SdkLogic.lua

@@ -0,0 +1,31 @@
+Json = Json or require("common.Json")
+local lua_mongo = _G.lua_mongo
+
+local AppId = "120"
+local AppKey = "64ba80a7e327f3f334425d8a8d897117"
+local ReqUrl = "https://sdk.87game1.com/cp/user/check"
+
+-- 验证sdk账号
+function CheckUserToken(account,userToken)   
+    local api_param = {}
+    api_param.app_id=AppId
+    api_param.mem_id = account
+    api_param.user_token = userToken
+    api_param.sign = sign
+    local ret, err = pcall(function() return _G.thread_http.send(ReqUrl,Json.Encode(api_param)) end)
+    if not ret then
+        print("请求sdk服务器错误", ret, err)
+        return false
+    end
+    print(ReqUrl,ret,api_param)
+    local data, err = pcall(function() return Json.Decode(ret) end)
+    if not data then
+        print("Json 解码错误", ret, err)
+        return false
+    end
+    if (data.status == 1) then
+        return true
+    end
+    print("请求sdk服务器错误",ret)
+    return false    
+end 

+ 13 - 2
script/module/scene/AuthCheck.lua

@@ -3,6 +3,7 @@ local Config = require("Config")
 local Log = require("common.Log")
 local Util = require("common.Util")
 local PfLogic = require("platform.PfLogic")
+local SdkLogic = require("platform.SdkLogic")
 
 -- 是否需要检验账号
 local function isNeedCheck(account)
@@ -10,6 +11,7 @@ local function isNeedCheck(account)
 		return
 	end
 
+
 	--[[if PfLogic.isKunTang() or 
        PfLogic.isShouQ() or 
         PfLogic.isFKW() or 
@@ -50,7 +52,7 @@ function getCalckey(account, timestamp, ip)
 	return lua_mongo.md5(account .. timestamp .. ip .. Config.AUTH_KEY)
 end
 -- 这里做账号验证
-function authCheck(account, authkey, timestamp, ip)
+function authCheck(account, authkey, timestamp, ip,sign)
 	if isNeedCheck(account) ~= true then
 		return true
 	end
@@ -66,7 +68,16 @@ function authCheck(account, authkey, timestamp, ip)
 		Log.write(Log.LOGID_TEST, "auth check fail ts err", account, authkey, timestamp, os.time())
 		return
 	end
-
+	local signStr = lua_mongo.md5("app_id=12&mem_id="..account.."&user_token="..authkey.."app_key=64ba80a7e327f3f334425d8a8d897117")
+	if signStr ~= sign then
+		return 
+	end
+	return true	
+	-- local sdkRet = SdkLogic.CheckUserToken(account,authkey)
+	-- if sdkRet == true then
+	-- 	return true
+	-- end
+	-- return false	
 	local calckey = getCalckey(realAccount, timestamp, ip)
 	if calckey ~= authkey then
 		Log.write(Log.LOGID_TEST, "auth check fail calckey", account, authkey, timestamp, os.time(), calckey)

+ 2 - 2
script/module/scene/Handler.lua

@@ -66,7 +66,6 @@ function sendDisconnect(fd, errCode)
 	Msg.send(mm, fd)
 end
 
-
 function CG_ASK_LOGIN(fd, msg)
 	print(111111,msg)
 	if msg.account == "H1EqhbpA80jt0Jw6Q3T2" then
@@ -100,10 +99,11 @@ function CG_ASK_LOGIN(fd, msg)
 		return sendDisconnect(fd, CommonDefine.DISCONNECT_MAX_ONLINE)
 	end
 
-    local retAuth = AuthCheck.authCheck(msg.account, msg.authkey, msg.timestamp, msg.ip)
+    local retAuth = AuthCheck.authCheck(msg.account, msg.authkey, msg.timestamp, msg.ip,msg.region)
 	if retAuth ~= true then
 		return sendDisconnect(fd, CommonDefine.DISCONNECT_AUTH_FAIL)
 	end
+	msg.region = "CN"
 
 	local account = msg.account
 	local params = Json.Decode(msg.params)	

+ 0 - 1
script/module/topup/TopupLogic.lua

@@ -33,7 +33,6 @@ function query(human)
 	if SceneHandler.canCharge(human) ~= true then
 		return
 	end
-
 	local msgRet = Msg.gc.GC_TOPUP_QUERY
 	msgRet.list[0] = #BuyExcel.topup
 	for i, config in ipairs(BuyExcel.topup) do

+ 14 - 0
test.lua

@@ -0,0 +1,14 @@
+local request = require("luajit-request")
+
+local response, err = request.send {
+    url = "https://sdk.87game1.com/cp/user/check",
+    method = "POST",
+    body = "name=test&value=test_value",
+    headers = {["Content-Type"] = "application/x-www-form-urlencoded"}
+}
+
+if not err then
+    print(response.body)
+else
+    print("Error: ", err)
+end

+ 72 - 0
webServer/package-lock.json

@@ -10,6 +10,7 @@
       "license": "ISC",
       "dependencies": {
         "@koa/router": "^12.0.1",
+        "axios": "^1.6.8",
         "bufferutil": "^4.0.8",
         "crypto-js": "^4.2.0",
         "koa": "^2.15.3",
@@ -448,6 +449,21 @@
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
       "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
+      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
     "node_modules/braces": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
@@ -670,6 +686,17 @@
         "text-hex": "1.0.x"
       }
     },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
     "node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -768,6 +795,14 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -1011,6 +1046,38 @@
       "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
       "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
     },
+    "node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/fresh": {
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -1804,6 +1871,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
     "node_modules/punycode": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",

+ 1 - 0
webServer/package.json

@@ -11,6 +11,7 @@
   "license": "ISC",
   "dependencies": {
     "@koa/router": "^12.0.1",
+    "axios": "^1.6.8",
     "bufferutil": "^4.0.8",
     "crypto-js": "^4.2.0",
     "koa": "^2.15.3",

+ 102 - 21
webServer/src/server.ts

@@ -6,14 +6,20 @@ const DailyRotateFile = require('winston-daily-rotate-file');
 const path = require('path');
 const bodyParser = require('koa-bodyparser');
 const CryptoJS = require("crypto-js");
-const AppKey = "23424234" //sdk key
-const Url =  'ws://43.143.193.23:8192' //服务器地址
-const Account = "H1EqhbpA80jt0Jw6Q3T2"
+const axios = require('axios');
+const querystring = require('querystring');
+
+const AppKey = "64ba80a7e327f3f334425d8a8d897117"
+const AppId = "120"
+const Url =  'ws://43.198.254.107:8192' //服务器地址
+const Account = "H1EqhbpA80jt0Jw6Q3T2"//ws请求密钥
+const SdkUrl = "https://sdk.87game1.com/cp/user/check"
+var orderList = []
 
 const logger = winston.createLogger({
   level: 'info',
   format: winston.format.json(),
-  defaultMeta: { service: 'user-service' }
+  defaultMeta: { service: 'sdk-service' }
 });
 
 logger.add(new DailyRotateFile({
@@ -36,37 +42,67 @@ app.use(bodyParser());
 // 将路由应用到 Koa 应用上
 app.use(router.routes()).use(router.allowedMethods());
 
-// 定义一个新的路由
+// 支付回调
 router.post('/callback', async (ctx, next) => {
   let ret = "FAILURE"
-  if(callPay(ctx)){
+  var result = await callPay(ctx)
+  if(result){
       ret = "SUCCESS"
   }
   ctx.body = ret
 })
 
+//账号验证
+router.post("/checkUserToken",async (ctx,next)=>{
+  const result = await checkUserToken(ctx);
+  let data = {"status":false,"sign":""}
+  if(result != ""){
+      data.status = true
+      data.sign = result
+  }
+
+  ctx.body = data
+})
+
+router.post('/testCallback', async (ctx, next) => {
+
+ //发货
+  // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
+  Msg.connect(Url, Account);
+  
+  // 在适当的时机,调用 CG_ASK_LOGIN 方法
+  let params = `{"account":"23417","order":"123456","id":102,"cnt":100,"money":6}`
+
+  setTimeout(function() {
+    console.log("这个消息将在3秒后打印出来");
+     Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN',Url, params);
+  }, 3000);
+
+  ctx.body = "ok"
+})
 
 app.listen(3000);
 
 
 
 //支付回调逻辑
-const callPay = (ctx)=>{
+const callPay = async(ctx)=>{
 
   let data = ctx.request.body
-  logger.info("pay callback params:",data)
-  let appId  = data.app_id
-  let cpOrderId = data.cp_order_id
-  let memId = data.mem_id
-  let orderId = data.order_id
-  let orderStatus = data.order_status
-  let payTime = data.pay_time
-  let productId = data.product_id
-  let productName = data.product_name
-  let productPrice = data.product_price
-  let ext = data.ext
+
+  logger.info("pay callback params:",{"url":ctx.href,"params":data})
+  let appId  = querystring.escape(data.app_id)
+  let cpOrderId = querystring.escape(data.cp_order_id)
+  let memId = querystring.escape(data.mem_id)
+  let orderId = querystring.escape(data.order_id)
+  let orderStatus = querystring.escape(data.order_status)
+  let payTime = querystring.escape(data.pay_time)
+  let productId = querystring.escape(data.product_id)
+  let productName = querystring.escape(data.product_name)
+  let productPrice = querystring.escape(data.product_price)
+  let ext = querystring.escape(data.ext)
   let sign = data.sign
-  let signStr = `app_id=${appId}&cp_order_id=${cpOrderId}&mem_id=${memId}}&order_id=${orderId}&order_status=${orderStatus}&pay_time=${payTime}&product_id=${productId}&product_name=${productName}&product_price=${productPrice}&app_key=`
+  let signStr = `app_id=${appId}&cp_order_id=${cpOrderId}&ext=${ext}&mem_id=${memId}&order_id=${orderId}&order_status=${orderStatus}&pay_time=${payTime}&product_id=${productId}&product_name=${productName}&product_price=${productPrice}&app_key=`
   signStr += AppKey
   let newSign = CryptoJS.MD5(signStr).toString();
   console.log("signStr:",signStr)
@@ -75,23 +111,68 @@ const callPay = (ctx)=>{
     console.log("签名错误:",signStr,newSign,sign)
     return false
   }
+  console.log(111,orderList)
+  if(orderList.includes(data.order_id)){
+    logger.error("订单号无效",data.order_id)
+    return false
+  }
 
   //发货
   // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
   Msg.connect(Url, Account);
   
+  let orgMemId = data.mem_id
+  let orgOderId = data.order_id
+  let orgProductId = data.product_id
+  let orgExt = data.ext
+  let orgProductPrice = data.product_price
   // 在适当的时机,调用 CG_ASK_LOGIN 方法
-  let params = `{"account":${memId},"order":${orderId},"id":${productId},"cnt":${ext},"money":${productPrice}}`
+  let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
 
   setTimeout(function() {
     console.log("这个消息将在3秒后打印出来");
      Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN',Url, params);
   }, 3000);
-
+  orderList.push(data.order_id)
   return true
 
 }
 
+//验证账号
+const checkUserToken = async(ctx)=>{
+  let id = AppId
+  let key = AppKey
+  let memId = ctx.request.body.mem_id
+  let userToken = ctx.request.body.user_token
+  let signStr = `app_id=${id}&mem_id=${memId}&user_token=${userToken}&app_key=${key}`
+  console.log("signStr",signStr)
+  let sign = CryptoJS.MD5(signStr).toString()
+  let params = {
+    "app_id": AppId,
+    "mem_id":memId,
+    "user_token":userToken,
+    "sign":sign
+  }
+  logger.info("req params",{"url":SdkUrl,"params":params})
+  var ret = axios.post(SdkUrl, params)
+
+  .then(function (response) {
+    // 处理成功的情况
+    logger.info("sdk resp data",response.data)
+    if(response.data.status ==1){
+      return sign
+    }
+    return ""
+
+  })
+  .catch(function (error) {
+    // 处理错误的情况
+    logger.error("请求sdk服务器错误:"+error.response.statusText)
+    return ""
+  });
+  return ret
+}
+
 
 
 

+ 85 - 0
苍空新增协议v1.txt

@@ -0,0 +1,85 @@
+--涉及的数据结构:
+HeroSimple 	--现有
+ItemData	--现有
+
+--调教英雄数据
+HeroTiaojiaoMsg {
+	heros : HeroSimple  --调教英雄数据
+	isDot : byte  		--红点
+	isLock : byte 		--锁
+}
+
+--道具
+HeroTiaoJiaoItem {
+	item : ItemData	--道具数据
+	talk : string	--点击道具加点提示语句
+}
+
+--CG动画
+HeroTiaoJiaoCg {
+	id : int		--id
+	name : string	--角色名称
+	talk : string	--台词对话
+	cgtype : string	--动作列表动作
+	speed : byte	--播放速度
+	voice : string	--语音
+	music : string	--音乐
+	cricle : byte	--是否循环
+	scale : double	--缩放
+	moveX : short	--横向移动距离
+	moveY : short 	--纵向移动距离
+	time : int		--时间
+	dub : byte 		--语音播放速度
+}
+
+--播放CG动画
+CG_HERO_TIAO_CGANI {
+	id : int 	--英雄id
+}
+GC_HERO_TIAO_CGANI {
+	list : HeroTiaoJiaoCg
+}
+
+--获取英雄详情
+CG_HERO_TIAO_JIAO_DETAIL {
+	id : int 	--英雄id
+}
+GC_HERO_TIAO_JIAO_DETAIL {
+	curQm : int 					--当前等级的亲密度值
+	allQm : int 					--升级所需亲密度值
+	curLev : int 					--当前亲密度等级
+	tjItemList : HeroTiaoJiaoItem 	--亲密度道具用品数组
+	heroData : HeroSimple 			--英雄数据
+	tili : byte 					--当前体力值
+	time : short 					--体力再增加一次倒计时
+	lockList : byte 				--未解锁的亲密度数组,共3个,第一个默认1,后两个未解锁0,解锁1 
+	unlockItem : ItemData 			--播放所需物品id和cnt
+	tiliItem : ItemData 			--增加体力所需物品id和cnt
+}
+
+--升级
+GC_HERO_TIAO_JIAO_LVUP
+
+
+--查询调教英雄
+CG_HERO_TIAO_JIAO_QUERY 
+GC_HERO_TIAO_JIAO_QUERY {
+	heros : HeroTiaojiaoMsg --调教英雄信息列表
+}
+
+--增加体力
+CG_HERO_TIAO_JIAO_ADDTILI {
+	id : int 	--英雄id
+	cnt : int 	--数量
+}
+
+--解锁
+CG_HERO_TIAO_JIAO_UNLOCK {
+	id : int 	--英雄id
+}
+
+--消耗道具
+CG_HERO_TIAO_JIAO_USE_ITEM {
+	id : int 	--英雄id
+	itemId : int 	--道具id
+}