server.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. import Koa from 'koa';
  2. import Router from '@koa/router';
  3. import Msg from './msg'; // 确保路径是正确的
  4. const winston = require('winston');
  5. const DailyRotateFile = require('winston-daily-rotate-file');
  6. const path = require('path');
  7. const bodyParser = require('koa-bodyparser');
  8. const CryptoJS = require("crypto-js");
  9. const axios = require('axios');
  10. const querystring = require('querystring');
  11. const servers = require('./serverList.json')
  12. const AppSecret = "67db708fdc1b3f61341db6e8551143c0"
  13. const AppKey = "64ba80a7e327f3f334425d8a8d897117"
  14. const AppId = "120"
  15. // var Url = 'ws://43.198.254.107:8192' //服务器地址
  16. const Account = "H1EqhbpA80jt0Jw6Q3T2"//ws请求密钥
  17. const SdkUrl = "https://sdk.87game1.com/cp/user/check"
  18. var orderList = []
  19. const logger = winston.createLogger({
  20. level: 'info',
  21. format: winston.format.json(),
  22. defaultMeta: { service: 'sdk-service' }
  23. });
  24. logger.add(new DailyRotateFile({
  25. dirname: path.join(__dirname, 'logs'),
  26. filename: '%DATE%.log',
  27. datePattern: 'YYYY-MM-DD-HH',
  28. zippedArchive: true,
  29. maxSize: '20m',
  30. maxFiles: '14d'
  31. }));
  32. logger.add(new winston.transports.Console({
  33. format: winston.format.simple(),
  34. }));
  35. const app = new Koa();
  36. const router = new Router();
  37. app.use(bodyParser());
  38. // 将路由应用到 Koa 应用上
  39. app.use(router.routes()).use(router.allowedMethods());
  40. // 支付回调
  41. router.post('/callback', async (ctx, next) => {
  42. let ret = {
  43. code: 0,
  44. msg: '发货失败'
  45. }
  46. var result = await callPay(ctx)
  47. if(result){
  48. ret.code = 1;
  49. ret.msg = '发货成功';
  50. }
  51. ctx.body = JSON.stringify(ret)
  52. })
  53. //账号验证
  54. router.post("/checkUserToken",async (ctx,next)=>{
  55. const result = await checkUserToken(ctx);
  56. let data = {"status":false,"sign":""}
  57. if(result != ""){
  58. data.status = true
  59. data.sign = result
  60. }
  61. ctx.body = data
  62. })
  63. // router.post('/testCallback', async (ctx, next) => {
  64. // //发货
  65. // // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  66. // Msg.connect(Url, Account);
  67. // // 在适当的时机,调用 CG_ASK_LOGIN 方法
  68. // let params = `{"account":"23417","order":"123456","id":102,"cnt":100,"money":6}`
  69. // setTimeout(function() {
  70. // console.log("这个消息将在3秒后打印出来");
  71. // Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN',Url, params);
  72. // }, 3000);
  73. // ctx.body = "ok"
  74. // })
  75. router.get('/serverList',async (ctx,next)=>{
  76. let id = ctx.query.id
  77. console.log(getServerList(id))
  78. ctx.body = servers
  79. })
  80. app.listen(3000);
  81. //根据区服id获取地址
  82. const getServerList = (serverId) => {
  83. for(let i=0;i<servers.length;i++){
  84. if(servers[i].id == serverId){
  85. return 'ws://'+servers[i].ip+':'+ servers[i].port
  86. }
  87. }
  88. }
  89. //支付回调逻辑
  90. const callPay = async(ctx)=>{
  91. let data = ctx.request.body
  92. let sign = data.sign
  93. let serverId = data.serverId
  94. logger.info("pay callback params:",{"url":ctx.href,"params":data})
  95. //签名参数
  96. let signData = Object.keys(data).filter(key => key !== 'sign');
  97. let signStr = signData.map(key => `${data[key]}`).join('');
  98. signStr += AppSecret
  99. let newSign = CryptoJS.MD5(signStr).toString();
  100. console.log("signStr:",signStr)
  101. console.log("newSign:",newSign)
  102. if(sign != newSign){
  103. console.log("签名错误:",signStr,newSign,sign)
  104. return false
  105. }
  106. console.log(111,orderList)
  107. if(orderList.includes(data.orderId)){
  108. logger.error("订单号无效",data.orderId)
  109. return false
  110. }
  111. let url = getServerList(serverId)
  112. if(!url){
  113. console.log("区服id错误")
  114. return false
  115. }
  116. //发货
  117. // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  118. Msg.connect(url, Account);
  119. let orgMemId = data.uid
  120. let orgOderId = data.cpOrder
  121. let orgProductId = data.orderId
  122. let orgExt = data.cText
  123. let orgProductPrice = data.skuPrice
  124. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  125. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  126. setTimeout(function() {
  127. console.log("这个消息将在3秒后打印出来");
  128. Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN',ctx.request.ip, params);
  129. }, 3000);
  130. orderList.push(data.order_id)
  131. return true
  132. }
  133. //验证账号
  134. const checkUserToken = async(ctx)=>{
  135. let id = AppId
  136. let key = AppKey
  137. let memId = ctx.request.body.mem_id
  138. let userToken = ctx.request.body.user_token
  139. let signStr = `app_id=${id}&mem_id=${memId}&user_token=${userToken}&app_key=${key}`
  140. console.log("signStr",signStr)
  141. let sign = CryptoJS.MD5(signStr).toString()
  142. let params = {
  143. "app_id": AppId,
  144. "mem_id":memId,
  145. "user_token":userToken,
  146. "sign":sign
  147. }
  148. logger.info("req params",{"url":SdkUrl,"params":params})
  149. var ret = axios.post(SdkUrl, params)
  150. .then(function (response) {
  151. // 处理成功的情况
  152. logger.info("sdk resp data",response.data)
  153. if(response.data.status ==1){
  154. return sign
  155. }
  156. return ""
  157. })
  158. .catch(function (error) {
  159. // 处理错误的情况
  160. logger.error("请求sdk服务器错误:"+error.response.statusText)
  161. return ""
  162. });
  163. return ret
  164. }