zhanwencai 1 tahun lalu
induk
melakukan
d667f9b46e

File diff ditekan karena terlalu besar
+ 681 - 851
webServer/package-lock.json


+ 3 - 0
webServer/package.json

@@ -17,6 +17,9 @@
     "koa": "^2.15.3",
     "koa-bodyparser": "^4.4.1",
     "koa-logger": "^3.2.1",
+    "mysql": "^2.18.1",
+    "ts-node-dev": "^2.0.0",
+    "typescript": "^5.5.4",
     "utf-8-validate": "^6.0.3",
     "winston": "^3.13.0",
     "winston-daily-rotate-file": "^5.0.0",

+ 186 - 0
webServer/src/controller/ApiController.ts

@@ -0,0 +1,186 @@
+import Msg from '../msg'; // 确保路径是正确的
+
+const servers = require('../serverList.json')
+const CryptoJS = require("crypto-js");
+const crypto = require('crypto');
+const AppSecret = "67db708fdc1b3f61341db6e8551143c0"
+const AppKey = "57afbdc608db9aa423e1b15b321d7de0"
+const Account = "H1EqhbpA80jt0Jw6Q3T2"//ws请求密钥
+const Order = require('../model/OrderModel')
+const logger = require('../log')
+var orderList = []
+
+//根据区服id获取地址
+const getServerList = (serverId) => {
+    for (let i = 0; i < servers.length; i++) {
+        if (servers[i].id == serverId) {
+            return 'ws://' + servers[i].ip + ':' + servers[i].port
+        }
+    }
+}
+
+const callPay = async (ctx) => {
+
+    let data = ctx.request.body
+    let sign = data.sign
+    let serverId = data.serverId
+
+    logger.info("pay callback params:", { "url": ctx.href, "params": data })
+
+    //签名参数
+    let signData = Object.keys(data).filter(key => key !== 'sign');
+    let signStr = signData.map(key => `${data[key]}`).join('');
+    signStr += AppSecret
+
+    let newSign = CryptoJS.MD5(signStr).toString();
+    console.log("signStr:", signStr)
+    console.log("newSign:", newSign)
+    if (sign != newSign) {
+        console.log("签名错误:", signStr, newSign, sign)
+        return false
+    }
+    console.log(111, orderList)
+    if (orderList.includes(data.orderId)) {
+        logger.error("订单号无效", data.orderId)
+        return false
+    }
+
+    let url = getServerList(serverId)
+    if (!url) {
+        console.log("区服id错误")
+        return false
+    }
+
+    //发货
+    // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
+    Msg.connect(url, Account);
+
+    let orgMemId = data.uid
+    let orgOderId = data.cpOrder
+    let orgProductId = data.orderId
+    let orgExt = data.cText
+    let orgProductPrice = data.skuPrice
+    // 在适当的时机,调用 CG_ASK_LOGIN 方法
+    let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
+
+    setTimeout(function () {
+        console.log("这个消息将在3秒后打印出来");
+        Msg.CG_ASK_LOGIN("payCallback", 0, "", 'cn', 'CN', ctx.request.ip, params);
+    }, 3000);
+    orderList.push(data.order_id)
+    return true
+}
+
+//验证账号
+const checkUserToken = async (ctx) => {
+    let data = ctx.request.body
+
+    //签名参数
+    let signData = Object.keys(data).filter(key => key !== 'sign');
+    let signStr = signData.map(key => `${data[key]}`).join('');
+    signStr += AppKey
+
+    let newSign = CryptoJS.MD5(signStr).toString();
+    console.log("signStr:", signStr)
+    console.log("newSign:", newSign)
+    if (data.sign != newSign) {
+        console.log("签名错误:", signStr, newSign, data.sign)
+        return false
+    }
+
+    return data.sign
+}
+
+const generateOrderNumber = () => {
+    const date = new Date();
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1).toString().padStart(2, '0');
+    const day = date.getDate().toString().padStart(2, '0');
+    const hours = date.getHours().toString().padStart(2, '0');
+    const minutes = date.getMinutes().toString().padStart(2, '0');
+    const seconds = date.getSeconds().toString().padStart(2, '0');
+    const datestring = `${year}${month}${day}${hours}${minutes}${seconds}`;
+    const randomString1 = Math.floor(Math.random() * 1090000000800)
+        .toString()
+        .slice(0, 4);
+    const randomString2 = Math.floor(Math.random() * 1090000000800)
+        .toString()
+        .slice(0, 4);
+    return datestring + randomString1 + randomString2;
+}
+
+const formatDate = (date: Date) => {
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1).toString().padStart(2, '0');
+    const day = date.getDate().toString().padStart(2, '0');
+    return `${year}-${month}-${day}`;
+}
+
+class ApiController {
+    async createOrder(ctx) {
+        let {
+            uid,
+            level,
+            amount,
+            role_id,
+            role_name,
+            product_id
+        } = ctx.request.body
+
+        logger.info("create params:", {"params": ctx.request.body })
+
+        const orderId = generateOrderNumber(); // 生成一个长度为8的订单号
+        const create_time = formatDate(new Date())
+        const res = await Order.createOrder(
+            orderId,
+            uid,
+            level,
+            amount,
+            role_id,
+            role_name,
+            product_id,
+            create_time
+        );
+
+        if (res.affectedRows > 0) {
+            ctx.body = { code: 0, message: '创建订单成功', data: orderId }
+        } else {
+            ctx.body = { code: -1, message: '创建订单失败', data: '' }
+        }
+    }
+
+    async checkUserToken(ctx) {
+        const result = await checkUserToken(ctx);
+        let data = { "status": false, "sign": "" }
+        if (result) {
+            data.status = true
+            data.sign = result
+        }
+        ctx.body = data
+    }
+
+    async callPay(ctx) {
+
+        let ret = {
+            code: 0,
+            msg: '发货失败'
+        }
+
+        var result = await callPay(ctx)
+
+        if (result) {
+            ret.code = 1;
+            ret.msg = '发货成功';
+        }
+        ctx.body = JSON.stringify(ret)
+    }
+
+    async getServerList(ctx) {
+        let id = ctx.query.id
+        console.log(getServerList(id))
+        ctx.body = servers
+    }
+}
+
+
+module.exports = new ApiController()

+ 24 - 0
webServer/src/log.ts

@@ -0,0 +1,24 @@
+const winston = require('winston');
+const DailyRotateFile = require('winston-daily-rotate-file');
+const path = require('path');
+
+const logger = winston.createLogger({
+    level: 'info',
+    format: winston.format.json(),
+    defaultMeta: { service: 'sdk-service' }
+});
+
+logger.add(new DailyRotateFile({
+    dirname: path.join(__dirname, 'logs'),
+    filename: '%DATE%.log',
+    datePattern: 'YYYY-MM-DD-HH',
+    zippedArchive: true,
+    maxSize: '20m',
+    maxFiles: '14d'
+}));
+
+logger.add(new winston.transports.Console({
+    format: winston.format.simple(),
+}));
+
+module.exports = logger;

+ 24 - 0
webServer/src/model/OrderModel.ts

@@ -0,0 +1,24 @@
+import { query } from '../sql/query'; // 确保路径是正确的
+
+class OrderModel {
+    //获取订单
+    async getOrder(order_id: any) {
+        return await query(`SELECT * FROM order WHERE order_id = '${order_id}'`)
+    }
+
+    //添加订单
+    async createOrder(
+        orderId: any,
+        uid: any,
+        level: any,
+        amount: any,
+        role_id: any,
+        role_name: any,
+        product_id: any,
+        create_time: string
+    ) {
+        return await query(`INSERT INTO game_order(order_id, uid, level,amount,role_id,role_name,product_id,create_time) VALUES('${orderId}', '${uid}', '${level}', '${amount}', '${role_id}', '${role_name}','${product_id}', '${create_time}')`)
+    }
+}
+
+module.exports = new OrderModel()

+ 20 - 0
webServer/src/router/index.ts

@@ -0,0 +1,20 @@
+import Router from '@koa/router';
+const router = new Router()
+
+//用户
+const ApiController = require('../controller/ApiController')
+
+//支付回头奥
+router.post('/callback', ApiController.callPay)
+
+//登陆验证
+router.post('/checkUserToken', ApiController.checkUserToken)
+
+//获取区服列表
+router.get('/serverList', ApiController.getServerList)
+
+//获取订单信息
+router.post('/createOrder', ApiController.createOrder)
+
+
+module.exports = router

+ 12 - 197
webServer/src/server.ts

@@ -1,198 +1,13 @@
-import Koa from 'koa';
-import Router from '@koa/router';
-import Msg from './msg'; // 确保路径是正确的
-const winston = require('winston');
-const DailyRotateFile = require('winston-daily-rotate-file');
-const path = require('path');
+// 导入koa
+const Koa = require('koa')
 const bodyParser = require('koa-bodyparser');
-const CryptoJS = require("crypto-js");
-const axios = require('axios');
-const querystring = require('querystring');
-const servers = require('./serverList.json')
-
-const AppSecret = "67db708fdc1b3f61341db6e8551143c0"
-const AppKey = "57afbdc608db9aa423e1b15b321d7de0"
-const AppId = "120"
-// var 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: 'sdk-service' }
-});
-
-logger.add(new DailyRotateFile({
-  dirname: path.join(__dirname, 'logs'),
-  filename: '%DATE%.log',
-  datePattern: 'YYYY-MM-DD-HH',
-  zippedArchive: true,
-  maxSize: '20m',
-  maxFiles: '14d'
-}));
-
-logger.add(new winston.transports.Console({
-  format: winston.format.simple(),
-}));
-
-const app = new Koa();
-const router = new Router();
-
-app.use(bodyParser());
-// 将路由应用到 Koa 应用上
-app.use(router.routes()).use(router.allowedMethods());
-
-// 支付回调
-router.post('/callback', async (ctx, next) => {
-  let ret = {
-    code: 0,
-    msg: '发货失败'
-  }
-  var result = await callPay(ctx)
-  if(result){
-      ret.code = 1;
-      ret.msg = '发货成功';
-  }
-  ctx.body = JSON.stringify(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"
-// })
-
-router.get('/serverList',async (ctx,next)=>{
-  let id = ctx.query.id
-  console.log(getServerList(id))
-  ctx.body = servers
-
-})
-
-
-app.listen(3000);
-
-
-//根据区服id获取地址
-const getServerList = (serverId) => {
-  for(let i=0;i<servers.length;i++){
-      if(servers[i].id == serverId){
-        return 'ws://'+servers[i].ip+':'+ servers[i].port
-      }
-  }
-}
-
-//支付回调逻辑
-const callPay = async(ctx)=>{
-
-  let data = ctx.request.body
-  let sign = data.sign
-  let serverId = data.serverId
-
-  logger.info("pay callback params:",{"url":ctx.href,"params":data})
-
-  //签名参数
-  let signData = Object.keys(data).filter(key => key !== 'sign');
-  let signStr = signData.map(key => `${data[key]}`).join('');
-  signStr += AppSecret
-
-  let newSign = CryptoJS.MD5(signStr).toString();
-  console.log("signStr:",signStr)
-  console.log("newSign:",newSign)
-  if(sign != newSign){
-    console.log("签名错误:",signStr,newSign,sign)
-    return false
-  }
-  console.log(111,orderList)
-  if(orderList.includes(data.orderId)){
-    logger.error("订单号无效",data.orderId)
-    return false
-  }
-  let url = getServerList(serverId)
-    if(!url){
-     console.log("区服id错误")
-    return false
-  }
-  //发货
-  // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
-  Msg.connect(url, Account);
-  
-  let orgMemId = data.uid
-  let orgOderId = data.cpOrder
-  let orgProductId = data.orderId
-  let orgExt = data.cText
-  let orgProductPrice = data.skuPrice
-  // 在适当的时机,调用 CG_ASK_LOGIN 方法
-  let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
-
-  setTimeout(function() {
-    console.log("这个消息将在3秒后打印出来");
-     Msg.CG_ASK_LOGIN("payCallback", 0, "", 'cn', 'CN',ctx.request.ip, params);
-  }, 3000);
-  orderList.push(data.order_id)
-  return true
-
-}
-
-//验证账号
-const checkUserToken = async(ctx)=>{
-  let data = ctx.request.body
-    
-    //签名参数
-  let signData = Object.keys(data).filter(key => key !== 'sign');
-  let signStr = signData.map(key => `${data[key]}`).join('');
-  signStr += AppKey
-
-let newSign = CryptoJS.MD5(signStr).toString();
-  console.log("signStr:",signStr)
-  console.log("newSign:",newSign)
-  if(data.sign != newSign){
-    console.log("签名错误:",signStr,newSign,data.sign)
-    return false
-  }
-  
-  return data.sign
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+const router = require('./router/index')
+// 创建一个koa对象
+const app = new Koa()
+
+app.use(bodyParser());//中间件
+app.use(router.routes()); //路由
+//监听端口
+const port = 3000
+app.listen(port);
+console.log(`启动成功,服务端口为:${port}`)

+ 9 - 0
webServer/src/sql/config.ts

@@ -0,0 +1,9 @@
+const mysqlConfig = {
+    user: "root", //账号
+    password: "wch123.com", //密码
+    database: "sdk", //数据库
+    host: "127.0.0.1", //服务器地址
+    port: 3306, //数据库端口
+    timezone: '08:00'
+};
+module.exports = mysqlConfig;

+ 25 - 0
webServer/src/sql/query.ts

@@ -0,0 +1,25 @@
+const mysql = require("mysql");
+const config = require("./config");
+
+//创建连接池
+const pool = mysql.createPool(config);
+const query = (sql, val) => {
+    return new Promise((resolve, reject) => {
+        pool.getConnection(function (err, connection) {
+            if (err) {
+                reject(err);
+            } else {
+                connection.query(sql, val, (err, fields) => {
+                    if (err) {
+                        reject(err);
+                    } else {
+                        resolve(fields);
+                    }
+                    connection.release();
+                });
+            }
+        });
+    });
+};
+
+export { query };

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini