zhanwencai před 1 rokem
rodič
revize
ac6a89c091
69 změnil soubory, kde provedl 2523 přidání a 2206 odebrání
  1. binární
      webServer.zip
  2. 3 0
      webServer/.gitignore
  3. 0 0
      webServer/dist/app.js
  4. 2 0
      webServer/dist/app.js.LICENSE.txt
  5. 0 35
      webServer/dist/logs/.8a70d79328fd0741697a15f16425094136c36bff-audit.json
  6. 0 15
      webServer/dist/logs/.9558865336ad223180d463c8ab06979cf71e1f42-audit.json
  7. 0 20
      webServer/dist/logs/.d2e4a549c1cf362057f9505e7d52dcfdbdb26ad3-audit.json
  8. 0 2
      webServer/dist/logs/2024-08-17-00.log
  9. 0 3
      webServer/dist/logs/2024-08-17-01.log
  10. 0 3
      webServer/dist/logs/2024-08-21-10.log
  11. 0 8
      webServer/dist/logs/2024-08-21-21.log
  12. 0 0
      webServer/dist/logs/2024-08-25-17.log
  13. 0 0
      webServer/dist/logs/2024-08-28-19.log
  14. 0 16
      webServer/dist/logs/2024-08-29-00.log
  15. 6 0
      webServer/node_modules/acorn-walk/CHANGELOG.md
  16. 3 9
      webServer/node_modules/acorn-walk/dist/walk.js
  17. 3 9
      webServer/node_modules/acorn-walk/dist/walk.mjs
  18. 10 10
      webServer/node_modules/acorn-walk/package.json
  19. 0 43
      webServer/node_modules/koa2-cors/LICENSE
  20. 0 72
      webServer/node_modules/koa2-cors/README.md
  21. 0 97
      webServer/node_modules/koa2-cors/dist/index.js
  22. 0 74
      webServer/node_modules/koa2-cors/package.json
  23. 0 97
      webServer/node_modules/koa2-cors/src/index.js
  24. 12 10
      webServer/node_modules/ts-md5/package.json
  25. 339 755
      webServer/package-lock.json
  26. 4 2
      webServer/package.json
  27. 82 0
      webServer/src/config/sdk.sql
  28. 1177 552
      webServer/src/controller/ApiController.ts
  29. 3 2
      webServer/src/json/notice.json
  30. 37 0
      webServer/src/json/order.php
  31. 58 0
      webServer/src/json/run.php
  32. 2 12
      webServer/src/json/serverList.json
  33. 2 0
      webServer/src/json/th_notice.json
  34. 8 0
      webServer/src/json/xky_notice.json
  35. 15 0
      webServer/src/json/区服.txt
  36. 1 1
      webServer/src/model/CDK.ts
  37. 21 3
      webServer/src/model/OrderModel.ts
  38. 88 21
      webServer/src/model/ServerModel.ts
  39. 11 0
      webServer/src/model/SystemModel.ts
  40. 43 0
      webServer/src/model/UserModel.ts
  41. 14 0
      webServer/src/router/index.ts
  42. 3 0
      webServer/src/server.ts
  43. 18 0
      webServer/src/serverList.json
  44. 37 1
      webServer/src/sql/sdk.sql
  45. 47 36
      webServer/src/utils/common.ts
  46. 1 1
      webServer/src/utils/log.ts
  47. 3 3
      webServer/src/utils/logs/.0304eb38f40d986235d7449a630e55701cab0b51-audit.json
  48. 0 30
      webServer/src/utils/logs/.b1cd853ba866c173ec05e9dc6d43d42025004f0d-audit.json
  49. 0 0
      webServer/src/utils/logs/2024-08-28-19.log
  50. 0 10
      webServer/src/utils/logs/2024-08-29-00.log
  51. 0 2
      webServer/src/utils/logs/2024-08-29-12.log
  52. 0 0
      webServer/src/utils/logs/2024-08-29-16.log
  53. 0 0
      webServer/src/utils/logs/2024-09-12-13.log
  54. 0 0
      webServer/src/utils/logs/2024-09-13-14.log
  55. 0 3
      webServer/src/utils/logs/2024-09-21-12.log
  56. 0 0
      webServer/src/utils/logs/2024-09-22-12.log
  57. 0 0
      webServer/src/utils/logs/2024-09-26-20.log
  58. 0 0
      webServer/src/utils/logs/2024-11-13-14.log
  59. 0 1
      webServer/src/utils/logs/2024-11-13-15.log
  60. 0 10
      webServer/src/utils/logs/2024-11-15-10.log
  61. 0 2
      webServer/src/utils/logs/2024-11-15-11.log
  62. 0 0
      webServer/src/utils/logs/2024-11-18-10.log
  63. 0 0
      webServer/src/utils/logs/2024-11-18-11.log
  64. 0 9
      webServer/src/utils/logs/2024-11-18-13.log
  65. 0 6
      webServer/src/utils/logs/2024-11-18-14.log
  66. 227 221
      webServer/src/utils/msg.ts
  67. 120 0
      webServer/src/utils/quickAsy.ts
  68. 84 0
      webServer/src/utils/retryPay.php
  69. 39 0
      webServer/src/utils/task.ts

binární
webServer.zip


+ 3 - 0
webServer/.gitignore

@@ -0,0 +1,3 @@
+node_modules
+dist
+logs

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
webServer/dist/app.js


+ 2 - 0
webServer/dist/app.js.LICENSE.txt

@@ -209,6 +209,8 @@
  * MIT Licensed
  */
 
+/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
+
 /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
 
 /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */

+ 0 - 35
webServer/dist/logs/.8a70d79328fd0741697a15f16425094136c36bff-audit.json

@@ -1,35 +0,0 @@
-{
-    "keep": {
-        "days": true,
-        "amount": 14
-    },
-    "auditLog": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/.8a70d79328fd0741697a15f16425094136c36bff-audit.json",
-    "files": [
-        {
-            "date": 1723826559751,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-17-00.log",
-            "hash": "108648672074e1608123d058fb1d81b42c0ecd31e8dc928f0ceda639267b495e"
-        },
-        {
-            "date": 1723827878846,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-17-01.log",
-            "hash": "c8733d6eb607777654d2a3e94eab184ff59c78ef802d0ec037316ad9909e180d"
-        },
-        {
-            "date": 1724209058039,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-21-10.log",
-            "hash": "9ba18cee8b6cb69bc5331527d2b59e911b5038192764e71ba8df837aab604b9c"
-        },
-        {
-            "date": 1724247187681,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-21-21.log",
-            "hash": "426952504852e4f2643c1ba2644b58df77103d6ddd93792fc4407298b5aa609b"
-        },
-        {
-            "date": 1724577517606,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-25-17.log",
-            "hash": "20ba9e62e268b5e6bd6c103776fab6509892f4365b2153322328df9f364bb3b5"
-        }
-    ],
-    "hashType": "sha256"
-}

+ 0 - 15
webServer/dist/logs/.9558865336ad223180d463c8ab06979cf71e1f42-audit.json

@@ -1,15 +0,0 @@
-{
-    "keep": {
-        "days": true,
-        "amount": 14
-    },
-    "auditLog": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/.9558865336ad223180d463c8ab06979cf71e1f42-audit.json",
-    "files": [
-        {
-            "date": 1724861895702,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-29-00.log",
-            "hash": "19f731d3069c2c97cd2932133f89842a9d2ea5bd6c9e3a6b872b71d026c4b590"
-        }
-    ],
-    "hashType": "sha256"
-}

+ 0 - 20
webServer/dist/logs/.d2e4a549c1cf362057f9505e7d52dcfdbdb26ad3-audit.json

@@ -1,20 +0,0 @@
-{
-    "keep": {
-        "days": true,
-        "amount": 14
-    },
-    "auditLog": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/.d2e4a549c1cf362057f9505e7d52dcfdbdb26ad3-audit.json",
-    "files": [
-        {
-            "date": 1724843576275,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-28-19.log",
-            "hash": "d54e85a057aa70d2a7e10bb7a758a49f6f9c49216b6217d5e81b05a60c4760f5"
-        },
-        {
-            "date": 1724861448410,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/dist/logs/2024-08-29-00.log",
-            "hash": "2f13ae3849c082252e5eda672d2b18a276a6d32ac97c95d876876f7d3369d38a"
-        }
-    ],
-    "hashType": "sha256"
-}

+ 0 - 2
webServer/dist/logs/2024-08-17-00.log

@@ -1,2 +0,0 @@
-{"level":"info","message":"pay callback params:","params":{"channelID":1308,"cpOrderID":"CP202408162315567958647","currency":"RMB","extension":1,"gameID":13,"money":100,"orderID":159331322052565500,"productID":1,"realMoney":100,"serverID":1,"sign":"196ab77dd32b3a51d7453b2c3702fc1a","state":2,"userID":1667},"service":"sdk-service","url":"http://localhost:3000/callback"}
-{"level":"info","message":"pay callback params:","params":{"channelID":1308,"cpOrderID":"CP202408162315567958647","currency":"RMB","extension":1,"gameID":13,"money":100,"orderID":159331322052565500,"productID":1,"realMoney":100,"serverID":1,"sign":"196ab77dd32b3a51d7453b2c3702fc1a","state":2,"userID":1667},"service":"sdk-service","url":"http://localhost:3000/callback"}

+ 0 - 3
webServer/dist/logs/2024-08-17-01.log

@@ -1,3 +0,0 @@
-{"level":"info","message":"pay callback params:","params":{"channelID":1308,"cpOrderID":"CP202408162315567958647","currency":"RMB","extension":1,"gameID":13,"money":100,"orderID":159331322052565500,"productID":1,"realMoney":100,"serverID":1,"sign":"196ab77dd32b3a51d7453b2c3702fc1a","state":2,"userID":1667},"service":"sdk-service","url":"http://localhost:3000/callback"}
-{"level":"info","message":"pay callback params:","params":{"channelID":1308,"cpOrderID":"CP202408162315567958647","currency":"RMB","extension":1,"gameID":13,"money":100,"orderID":159331322052565500,"productID":1,"realMoney":100,"serverID":1,"sign":"196ab77dd32b3a51d7453b2c3702fc1a","state":2,"userID":1667},"service":"sdk-service","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP202408162315567958647已经重复发货","service":"sdk-service"}

+ 0 - 3
webServer/dist/logs/2024-08-21-10.log

@@ -1,3 +0,0 @@
-{"level":"info","message":"pay callback params:","params":{"channelID":1308,"cpOrderID":"CP202408162315567958647","currency":"RMB","extension":1,"gameID":13,"money":100,"orderID":159331322052565500,"productID":1,"realMoney":100,"serverID":1,"sign":"196ab77dd32b3a51d7453b2c3702fc1a","state":2,"userID":1667},"service":"sdk-service","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP202408162315567958647已经重复发货","service":"sdk-service"}
-{"level":"info","message":"pay callback params:","params":{"channelID":1308,"cpOrderID":"CP202408162315567958647","currency":"RMB","extension":1,"gameID":13,"money":100,"orderID":159331322052565500,"productID":1,"realMoney":100,"serverID":1,"sign":"196ab77dd32b3a51d7453b2c3702fc1a","state":2,"userID":1667},"service":"sdk-service","url":"http://localhost:3000/callback"}

+ 0 - 8
webServer/dist/logs/2024-08-21-21.log

@@ -1,8 +0,0 @@
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"uid":1},"service":"sdk-service"}
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"server_id":1,"uid":1},"service":"sdk-service"}
-{"level":"info","message":"创建订单返回结果:","params":{"code":0,"data":"CP2024082121333374691033","message":"创建订单成功"},"service":"sdk-service"}
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"uid":1},"service":"sdk-service"}
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"server_id":1,"uid":1},"service":"sdk-service"}
-{"level":"info","message":"创建订单返回结果:","params":{"code":0,"data":"CP2024082121514910818049","message":"创建订单成功"},"service":"sdk-service"}
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"server_id":1,"uid":1},"service":"sdk-service"}
-{"level":"info","message":"创建订单返回结果:","params":{"code":0,"data":"CP2024082121531760143643","message":"创建订单成功"},"service":"sdk-service"}

+ 0 - 0
webServer/dist/logs/2024-08-25-17.log


+ 0 - 0
webServer/dist/logs/2024-08-28-19.log


+ 0 - 16
webServer/dist/logs/2024-08-29-00.log

@@ -1,16 +0,0 @@
-8/29/2024, 12:11:00 AM info: create params:
-8/29/2024, 12:11:01 AM info: 创建订单返回结果:
-8/29/2024, 12:18:26 AM info: create params:
-8/29/2024, 12:18:26 AM info: 创建订单返回结果:
-8/29/2024, 12:35:59 AM info: create params: 
-
-8/29/2024, 12:35:59 AM info: 创建订单返回结果: 
-
-8/29/2024, 12:36:47 AM info: create params: 
-
-8/29/2024, 12:36:47 AM info: 创建订单返回结果: 
-
-8/29/2024, 12:37:22 AM info: create params: 
-
-8/29/2024, 12:37:22 AM info: 创建订单返回结果: 
-

+ 6 - 0
webServer/node_modules/acorn-walk/CHANGELOG.md

@@ -1,3 +1,9 @@
+## 8.3.4 (2024-09-09)
+
+### Bug fixes
+
+Walk SwitchCase nodes as separate nodes.
+
 ## 8.3.3 (2024-01-11)
 
 ### Bug fixes

+ 3 - 9
webServer/node_modules/acorn-walk/dist/walk.js

@@ -215,16 +215,10 @@
   };
   base.SwitchStatement = function (node, st, c) {
     c(node.discriminant, st, "Expression");
-    for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) {
-      var cs = list$1[i$1];
+    for (var i = 0, list = node.cases; i < list.length; i += 1) {
+      var cs = list[i];
 
-      if (cs.test) { c(cs.test, st, "Expression"); }
-      for (var i = 0, list = cs.consequent; i < list.length; i += 1)
-        {
-        var cons = list[i];
-
-        c(cons, st, "Statement");
-      }
+      c(cs, st);
     }
   };
   base.SwitchCase = function (node, st, c) {

+ 3 - 9
webServer/node_modules/acorn-walk/dist/walk.mjs

@@ -209,16 +209,10 @@ base.WithStatement = function (node, st, c) {
 };
 base.SwitchStatement = function (node, st, c) {
   c(node.discriminant, st, "Expression");
-  for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) {
-    var cs = list$1[i$1];
+  for (var i = 0, list = node.cases; i < list.length; i += 1) {
+    var cs = list[i];
 
-    if (cs.test) { c(cs.test, st, "Expression"); }
-    for (var i = 0, list = cs.consequent; i < list.length; i += 1)
-      {
-      var cons = list[i];
-
-      c(cons, st, "Statement");
-    }
+    c(cs, st);
   }
 };
 base.SwitchCase = function (node, st, c) {

+ 10 - 10
webServer/node_modules/acorn-walk/package.json

@@ -1,32 +1,32 @@
 {
   "_args": [
     [
-      "acorn-walk@8.3.3",
+      "acorn-walk@8.3.4",
       "/Users/zhanwencai/code/game/congkong/webServer"
     ]
   ],
   "_development": true,
-  "_from": "acorn-walk@8.3.3",
-  "_id": "acorn-walk@8.3.3",
+  "_from": "acorn-walk@8.3.4",
+  "_id": "acorn-walk@8.3.4",
   "_inBundle": false,
-  "_integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
+  "_integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
   "_location": "/acorn-walk",
   "_phantomChildren": {},
   "_requested": {
     "type": "version",
     "registry": true,
-    "raw": "acorn-walk@8.3.3",
+    "raw": "acorn-walk@8.3.4",
     "name": "acorn-walk",
     "escapedName": "acorn-walk",
-    "rawSpec": "8.3.3",
+    "rawSpec": "8.3.4",
     "saveSpec": null,
-    "fetchSpec": "8.3.3"
+    "fetchSpec": "8.3.4"
   },
   "_requiredBy": [
     "/ts-node"
   ],
-  "_resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.3.tgz",
-  "_spec": "8.3.3",
+  "_resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz",
+  "_spec": "8.3.4",
   "_where": "/Users/zhanwencai/code/game/congkong/webServer",
   "bugs": {
     "url": "https://github.com/acornjs/acorn/issues"
@@ -78,5 +78,5 @@
     "prepare": "cd ..; npm run build:walk"
   },
   "types": "dist/walk.d.ts",
-  "version": "8.3.3"
+  "version": "8.3.4"
 }

+ 0 - 43
webServer/node_modules/koa2-cors/LICENSE

@@ -1,43 +0,0 @@
-MIT License
-
-Copyright (c) 2016 朱博文
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-This software is licensed under the MIT License.
-
-Copyright (c) 2015 - 2016 koajs and other contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.

+ 0 - 72
webServer/node_modules/koa2-cors/README.md

@@ -1,72 +0,0 @@
-# koa2-cors
-
-## install
-
-> it requires node v7.6.0 or higher now
-
-```bash
-npm install --save koa2-cors
-```
-
-## Usage
-
-```js
-var Koa = require('koa');
-var cors = require('koa2-cors');
-
-var app = new Koa();
-app.use(cors());
-```
-
-## Options
-
-### origin
-
-Configures the **Access-Control-Allow-Origin** CORS header. expects a string. Can also be set to a function, which takes the `ctx` as the first parameter.
-
-### exposeHeaders
-
-Configures the **Access-Control-Expose-Headers** CORS header. Expects a comma-delimited array.
-
-### maxAge
-
-Configures the **Access-Control-Max-Age** CORS header. Expects a
-Number.
-
-### credentials
-
-Configures the **Access-Control-Allow-Credentials** CORS header. Expects a Boolean.
-
-### allowMethods
-
-Configures the **Access-Control-Allow-Methods** CORS header. Expects a comma-delimited array , If not specified, default allowMethods is `['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']`.
-
-### allowHeaders
-Configures the **Access-Control-Allow-Headers** CORS header. Expects a comma-delimited array . If not specified, defaults to reflecting the headers specified in the request's **Access-Control-Request-Headers** header.
-
-```js
-var Koa = require('koa');
-var cors = require('koa2-cors');
-
-var app = new Koa();
-app.use(cors({
-  origin: function(ctx) {
-    if (ctx.url === '/test') {
-      return false;
-    }
-    return '*';
-  },
-  exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
-  maxAge: 5,
-  credentials: true,
-  allowMethods: ['GET', 'POST', 'DELETE'],
-  allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
-}));
-...
-```
-
-[More details about CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS).
-
-## License
-
-[MIT License](http://www.opensource.org/licenses/mit-license.php)

+ 0 - 97
webServer/node_modules/koa2-cors/dist/index.js

@@ -1,97 +0,0 @@
-/**
- * CORS middleware for koa2
- *
- * @param {Object} [options]
- *  - {String|Function(ctx)} origin `Access-Control-Allow-Origin`, default is request Origin header
- *  - {Array} exposeHeaders `Access-Control-Expose-Headers`
- *  - {String|Number} maxAge `Access-Control-Max-Age` in seconds
- *  - {Boolean} credentials `Access-Control-Allow-Credentials`
- *  - {Array} allowMethods `Access-Control-Allow-Methods`,
- *    default is ['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']
- *  - {Array} allowHeaders `Access-Control-Allow-Headers`
- * @return {Function}
- * @api public
- */
-module.exports = function crossOrigin(options = {}) {
-  const defaultOptions = {
-    allowMethods: ['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']
-  };
-
-  // set defaultOptions to options
-  options = Object.assign({}, defaultOptions, options); // eslint-disable-line no-param-reassign
-
-  // eslint-disable-next-line consistent-return
-  return async function cors(ctx, next) {
-    // always set vary Origin Header
-    // https://github.com/rs/cors/issues/10
-    ctx.vary('Origin');
-
-    let origin;
-    if (typeof options.origin === 'function') {
-      origin = options.origin(ctx);
-    } else {
-      origin = options.origin || ctx.get('Origin') || '*';
-    }
-    if (!origin) {
-      return await next();
-    }
-
-    // Access-Control-Allow-Origin
-    ctx.set('Access-Control-Allow-Origin', origin);
-
-    if (ctx.method === 'OPTIONS') {
-      // Preflight Request
-      if (!ctx.get('Access-Control-Request-Method')) {
-        return await next();
-      }
-
-      // Access-Control-Max-Age
-      if (options.maxAge) {
-        ctx.set('Access-Control-Max-Age', String(options.maxAge));
-      }
-
-      // Access-Control-Allow-Credentials
-      if (options.credentials === true) {
-        // When used as part of a response to a preflight request,
-        // this indicates whether or not the actual request can be made using credentials.
-        ctx.set('Access-Control-Allow-Credentials', 'true');
-      }
-
-      // Access-Control-Allow-Methods
-      if (options.allowMethods) {
-        ctx.set('Access-Control-Allow-Methods', options.allowMethods.join(','));
-      }
-
-      // Access-Control-Allow-Headers
-      if (options.allowHeaders) {
-        ctx.set('Access-Control-Allow-Headers', options.allowHeaders.join(','));
-      } else {
-        ctx.set('Access-Control-Allow-Headers', ctx.get('Access-Control-Request-Headers'));
-      }
-
-      ctx.status = 204; // No Content
-    } else {
-      // Request
-      // Access-Control-Allow-Credentials
-      if (options.credentials === true) {
-        if (origin === '*') {
-          // `credentials` can't be true when the `origin` is set to `*`
-          ctx.remove('Access-Control-Allow-Credentials');
-        } else {
-          ctx.set('Access-Control-Allow-Credentials', 'true');
-        }
-      }
-
-      // Access-Control-Expose-Headers
-      if (options.exposeHeaders) {
-        ctx.set('Access-Control-Expose-Headers', options.exposeHeaders.join(','));
-      }
-
-      try {
-        await next();
-      } catch (err) {
-        throw err;
-      }
-    }
-  };
-};

+ 0 - 74
webServer/node_modules/koa2-cors/package.json

@@ -1,74 +0,0 @@
-{
-  "_from": "koa2-cors",
-  "_id": "koa2-cors@2.0.6",
-  "_inBundle": false,
-  "_integrity": "sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg==",
-  "_location": "/koa2-cors",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "tag",
-    "registry": true,
-    "raw": "koa2-cors",
-    "name": "koa2-cors",
-    "escapedName": "koa2-cors",
-    "rawSpec": "",
-    "saveSpec": null,
-    "fetchSpec": "latest"
-  },
-  "_requiredBy": [
-    "#USER",
-    "/"
-  ],
-  "_resolved": "https://registry.npmmirror.com/koa2-cors/-/koa2-cors-2.0.6.tgz",
-  "_shasum": "9ad23df3a0b9bb84530b46f5944f3fb576086554",
-  "_spec": "koa2-cors",
-  "_where": "/Users/zhanwencai/code/game/congkong/webServer",
-  "author": {
-    "name": "zad"
-  },
-  "bugs": {
-    "url": "https://github.com/zadzbw/koa2-cors/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "cors middleware for koa2",
-  "devDependencies": {
-    "babel-cli": "^6.18.0",
-    "chai": "^4.1.2",
-    "eslint": "^5.1.0",
-    "eslint-config-airbnb-base": "^13.0.0",
-    "eslint-plugin-import": "^2.13.0",
-    "istanbul": "^1.1.0-alpha.1",
-    "koa": "^2.5.2",
-    "koa-router": "^7.4.0",
-    "mocha": "^5.2.0",
-    "supertest": "^3.1.0"
-  },
-  "engines": {
-    "node": ">= 7.6.0"
-  },
-  "files": [
-    "src/index.js",
-    "dist/index.js"
-  ],
-  "homepage": "https://github.com/zadzbw/koa2-cors#readme",
-  "keywords": [
-    "koa2",
-    "cors",
-    "middleware"
-  ],
-  "license": "MIT",
-  "main": "dist/index.js",
-  "name": "koa2-cors",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/zadzbw/koa2-cors.git"
-  },
-  "scripts": {
-    "build": "NODE_ENV=production rm -rf dist & babel src -d dist",
-    "lint": "eslint --ext .js src --format codeframe",
-    "test": "NODE_ENV=test mocha",
-    "test:cover": "NODE_ENV=test istanbul cover _mocha"
-  },
-  "version": "2.0.6"
-}

+ 0 - 97
webServer/node_modules/koa2-cors/src/index.js

@@ -1,97 +0,0 @@
-/**
- * CORS middleware for koa2
- *
- * @param {Object} [options]
- *  - {String|Function(ctx)} origin `Access-Control-Allow-Origin`, default is request Origin header
- *  - {Array} exposeHeaders `Access-Control-Expose-Headers`
- *  - {String|Number} maxAge `Access-Control-Max-Age` in seconds
- *  - {Boolean} credentials `Access-Control-Allow-Credentials`
- *  - {Array} allowMethods `Access-Control-Allow-Methods`,
- *    default is ['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']
- *  - {Array} allowHeaders `Access-Control-Allow-Headers`
- * @return {Function}
- * @api public
- */
-module.exports = function crossOrigin(options = {}) {
-  const defaultOptions = {
-    allowMethods: ['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
-  };
-
-  // set defaultOptions to options
-  options = Object.assign({}, defaultOptions, options); // eslint-disable-line no-param-reassign
-
-  // eslint-disable-next-line consistent-return
-  return async function cors(ctx, next) {
-    // always set vary Origin Header
-    // https://github.com/rs/cors/issues/10
-    ctx.vary('Origin');
-
-    let origin;
-    if (typeof options.origin === 'function') {
-      origin = options.origin(ctx);
-    } else {
-      origin = options.origin || ctx.get('Origin') || '*';
-    }
-    if (!origin) {
-      return await next();
-    }
-
-    // Access-Control-Allow-Origin
-    ctx.set('Access-Control-Allow-Origin', origin);
-
-    if (ctx.method === 'OPTIONS') {
-      // Preflight Request
-      if (!ctx.get('Access-Control-Request-Method')) {
-        return await next();
-      }
-
-      // Access-Control-Max-Age
-      if (options.maxAge) {
-        ctx.set('Access-Control-Max-Age', String(options.maxAge));
-      }
-
-      // Access-Control-Allow-Credentials
-      if (options.credentials === true) {
-        // When used as part of a response to a preflight request,
-        // this indicates whether or not the actual request can be made using credentials.
-        ctx.set('Access-Control-Allow-Credentials', 'true');
-      }
-
-      // Access-Control-Allow-Methods
-      if (options.allowMethods) {
-        ctx.set('Access-Control-Allow-Methods', options.allowMethods.join(','));
-      }
-
-      // Access-Control-Allow-Headers
-      if (options.allowHeaders) {
-        ctx.set('Access-Control-Allow-Headers', options.allowHeaders.join(','));
-      } else {
-        ctx.set('Access-Control-Allow-Headers', ctx.get('Access-Control-Request-Headers'));
-      }
-
-      ctx.status = 204; // No Content
-    } else {
-      // Request
-      // Access-Control-Allow-Credentials
-      if (options.credentials === true) {
-        if (origin === '*') {
-          // `credentials` can't be true when the `origin` is set to `*`
-          ctx.remove('Access-Control-Allow-Credentials');
-        } else {
-          ctx.set('Access-Control-Allow-Credentials', 'true');
-        }
-      }
-
-      // Access-Control-Expose-Headers
-      if (options.exposeHeaders) {
-        ctx.set('Access-Control-Expose-Headers', options.exposeHeaders.join(','));
-      }
-
-      try {
-        await next();
-      } catch (err) {
-        throw err;
-      }
-    }
-  };
-};

+ 12 - 10
webServer/node_modules/ts-md5/package.json

@@ -1,33 +1,35 @@
 {
-  "_from": "ts-md5@^1.3.1",
+  "_args": [
+    [
+      "ts-md5@1.3.1",
+      "/Users/zhanwencai/code/game/congkong/webServer"
+    ]
+  ],
+  "_from": "ts-md5@1.3.1",
   "_id": "ts-md5@1.3.1",
   "_inBundle": false,
   "_integrity": "sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg==",
   "_location": "/ts-md5",
   "_phantomChildren": {},
   "_requested": {
-    "type": "range",
+    "type": "version",
     "registry": true,
-    "raw": "ts-md5@^1.3.1",
+    "raw": "ts-md5@1.3.1",
     "name": "ts-md5",
     "escapedName": "ts-md5",
-    "rawSpec": "^1.3.1",
+    "rawSpec": "1.3.1",
     "saveSpec": null,
-    "fetchSpec": "^1.3.1"
+    "fetchSpec": "1.3.1"
   },
   "_requiredBy": [
-    "#USER",
     "/"
   ],
   "_resolved": "https://registry.npmmirror.com/ts-md5/-/ts-md5-1.3.1.tgz",
-  "_shasum": "f5b860c0d5241dd9bb4e909dd73991166403f511",
-  "_spec": "ts-md5@^1.3.1",
+  "_spec": "1.3.1",
   "_where": "/Users/zhanwencai/code/game/congkong/webServer",
   "bugs": {
     "url": "https://github.com/cotag/ts-md5/issues"
   },
-  "bundleDependencies": false,
-  "deprecated": false,
   "description": "TypeScript MD5 implementation",
   "devDependencies": {
     "@types/jest": "^26.0.9",

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 339 - 755
webServer/package-lock.json


+ 4 - 2
webServer/package.json

@@ -19,16 +19,18 @@
     "koa-bodyparser": "^4.4.1",
     "koa-logger": "^3.2.1",
     "koa-redis": "^4.0.1",
-    "koa2-cors": "^2.0.6",
     "moment-timezone": "^0.5.45",
     "mysql": "^2.18.1",
     "mysql2": "^3.11.0",
+    "node-schedule": "^2.1.1",
     "redis": "^4.7.0",
+    "ts-md5": "^1.3.1",
     "typescript": "^5.5.4",
     "utf-8-validate": "^6.0.3",
     "winston": "^3.13.0",
     "winston-daily-rotate-file": "^5.0.0",
-    "ws": "^8.16.0"
+    "ws": "^8.16.0",
+    "xml2js": "^0.6.2"
   },
   "devDependencies": {
     "terser-webpack-plugin": "^5.3.10",

+ 82 - 0
webServer/src/config/sdk.sql

@@ -0,0 +1,82 @@
+DROP TABLE IF EXISTS `game_order`;
+CREATE TABLE `game_order` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `order_id` varchar(50) NOT NULL DEFAULT '' COMMENT '订单id',
+  `uid` varchar(100) NOT NULL DEFAULT '' COMMENT '用户id',
+  `status` int(11) NOT NULL DEFAULT '1' COMMENT '订单状态 1未支付 2成功 3失败',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
+  `out_trade_no` varchar(255) NOT NULL DEFAULT '' COMMENT '第三方订单id',
+  `level` int(11) NOT NULL DEFAULT '0' COMMENT '角色等级',
+  `role_id` varchar(50) NOT NULL DEFAULT '' COMMENT '角色id',
+  `role_name` varchar(100) NOT NULL DEFAULT '' COMMENT '角色名',
+  `product_id` int(11) NOT NULL DEFAULT '0' COMMENT '商品id',
+  `amount` int(11) NOT NULL DEFAULT '0' COMMENT '订单金额 单位分',
+  `server_id` int(11) NOT NULL DEFAULT '0' COMMENT '区服id',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
+
+
+DROP TABLE IF EXISTS `game_server`;
+CREATE TABLE `game_server` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '区服名',
+  `status` int(11) NOT NULL DEFAULT '1' COMMENT '状态',
+  `ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'ip',
+  `port` int(11) NOT NULL DEFAULT '0' COMMENT '端口',
+  `tag` varchar(50) NOT NULL DEFAULT 'default' COMMENT '标识',
+  `tips` varchar(1000) NOT NULL DEFAULT '' COMMENT '公告',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='区服表';
+
+
+DROP TABLE IF EXISTS `game_version`;
+CREATE TABLE `game_version` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `version` varchar(50) NOT NULL DEFAULT '' COMMENT '版本',
+  `download_url` varchar(100) NOT NULL DEFAULT '' COMMENT '下载链接',
+  `tag` varchar(50) NOT NULL DEFAULT 'default' COMMENT '标识',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='游戏版本';
+
+CREATE TABLE `game_enter_server` (
+
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `uid` varchar(50) NOT NULL DEFAULT '' COMMENT '区服名',
+  `server_id` varchar(50) NOT NULL DEFAULT '' COMMENT '区服id',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '进区时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='进区记录表';
+
+ALTER TABLE game_server ADD white_list varchar(1000) NOT NULL DEFAULT '';
+
+ALTER TABLE game_server ADD open_time int(11) NOT NULL DEFAULT 0 COMMENT '开区时间';
+
+ALTER TABLE game_order ADD token text NOT NULL DEFAULT '';
+ALTER TABLE game_order ADD platform varchar(50) NOT NULL DEFAULT '';
+
+//加区服
+ INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (29, 'ขอบเขต 29', 3, '110.234.192.112', 8220, 'default', '','');
+ INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (35, 'เซิร์ฟเวอร์ 35', 1, '110.234.192.112', 8226, 'default', '','');
+
+// 加白名单
+ update game_server set white_list = '171.216.76.130,101.24.120.82' where id =3;
+
+//关闭
+ update game_server set status = 0 where id =3;
+ //开启
+ update game_server set status = 1 where id =5;
+ //改公告
+
+ update game_server set tips = '服务器将于2024-09-07 13:00开启 官方QQ群:992058780' where id =3;
+
+
+  INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (3, '寻宝3区', 1, '118.145.139.78', 28192, 'default', '服务器将于2024-09-07 13:00开启 官方QQ群:992058780','');
+
+
+  INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (1, 'ขอบเขต 1', 3, '110.234.192.112', 8192, 'default', '','');
+  INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (2, 'ขอบเขต 2', 3, '110.234.192.112', 8193, 'default', '','');
+  INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (3, 'ขอบเขต 3', 3, '110.234.192.112', 8194, 'default', '','');
+
+
+ 

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1177 - 552
webServer/src/controller/ApiController.ts


+ 3 - 2
webServer/src/json/notice.json

@@ -1,6 +1,7 @@
 [
     {
-        "content": "这是公告这是公告 \n这是公告这是公告第二行",
-        "status": 1
+        "content": "《寻宝之旅》是一款水墨风格的卡牌游戏,突破了传统的框架,游戏中拥有丰富的支线章节,玩家的每一个决策都会对游戏的故事发展产生深远影响,真正实现了高度互动的剧情体验。\n【礼包码】\n通用礼包:进入游戏直接输入xbzl555、xbzl666、xbzl777\nQQ群礼包:3个礼包。群内不定时会发放礼包。\n社区礼包3个:在tap社区直接领取。\ntaptap签到礼包:总共7个礼包,需要前往taptap签到才能获得。\n领取方式:左上角【人物头像】→【设置】→【礼包码兑换】\n官方QQ交流群:992058780 \n",
+        "status": 1,
+        "content_wh": "2024年11月8日维护内容\n1、新增“铂金周卡”,可在活动处了解详情\n2、新增芷若皮肤“鬼刃皇女”,可在“星届衣间”处了解详情\n3、开放新一轮“英雄兑换”奖池、“枯藤老人的宝藏”、“精英召唤”\n4、新增“天命商店”功能,每次天命召唤可额外获得天命精华*1,商店中可消耗一定数量的精华兑换英雄碎片(已经使用天命召唤卷的不做额外处理)\n5、修复了红叶“训诫”没有生效的问题\n6、修复了红叶无法触发战意获符文“吸血”的问题\n7、修复了红叶“魔战八方”技能伤害系数的问题\n8、修复了仙族英雄的描述错误问题\n"
     }
 ]

+ 37 - 0
webServer/src/json/order.php

@@ -0,0 +1,37 @@
+<?php
+// 确保这些常量已经定义
+defined('DB_SERVER') ? null : define('DB_SERVER', 'localhost');
+defined('DB_USER') ? null : define('DB_USER', 'root');
+defined('DB_PASS') ? null : define('DB_PASS', 'wch123.com');
+defined('DB_NAME') ? null : define('DB_NAME', 'sdk');
+
+// 连接数据库
+$connection = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
+
+// 检查连接
+if ($connection->connect_error) {
+    die("连接失败: " . $connection->connect_error);
+}
+
+// 查询数据库
+// $query = "SELECT ANY_VALUE(order_id) as order_id ,ANY_VALUE(uid) as uid , ANY_VALUE(id) as id FROM game_order where status = 2 group by uid order by id ";
+$query = "SELECT  order_id FROM game_order where status = 2 group by uid order by id ";
+$result = $connection->query($query);
+
+if ($result) {
+    while ($row = $result->fetch_assoc()) {
+
+        $sql = "UPDATE game_order SET is_first = 1 WHERE `order_id` = '{$row['order_id']}' ";
+
+        if (mysqli_query($connection, $sql)) {
+            echo "记录更新成功";
+        } else {
+            echo "更新记录时出错: " . mysqli_error($connection);
+        }
+    }
+} else {
+    die("查询失败: " . $connection->error);
+}
+
+// 关闭数据库连接
+$connection->close();

+ 58 - 0
webServer/src/json/run.php

@@ -0,0 +1,58 @@
+<?php
+// 确保这些常量已经定义
+defined('DB_SERVER') ? null : define('DB_SERVER', 'localhost');
+defined('DB_USER') ? null : define('DB_USER', 'root');
+defined('DB_PASS') ? null : define('DB_PASS', 'wch123.com');
+defined('DB_NAME') ? null : define('DB_NAME', 'sdk');
+
+// 连接数据库
+$connection = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
+
+// 检查连接
+if ($connection->connect_error) {
+    die("连接失败: " . $connection->connect_error);
+}
+
+$sql = "SELECT account FROM accounts ";
+$accountRes = $connection->query($sql);
+
+$accounts = [];
+while ($row = $accountRes->fetch_assoc()) {
+    $accounts[] = $row['account'];
+}
+
+
+// 查询数据库
+$query = "SELECT ANY_VALUE(uid) as uid, ANY_VALUE(create_time) as create_time FROM game_enter_server group by uid ";
+$result = $connection->query($query);
+
+if ($result) {
+    while ($row = $result->fetch_assoc()) {
+
+        if (!in_array($row['uid'], $accounts)) {
+
+            $value1 = $row['uid'];
+            $value2 = '1';
+            $value3 = '1';
+            $value4 = $row['create_time'];
+
+            $sql =  "INSERT INTO accounts (`account`, `status`,`channel_id`,`created_at`) VALUES (?, ?, ?, ?)";
+            $stmt = $connection->prepare($sql);
+            $stmt->bind_param("ssss", $value1, $value2, $value3, $value4);
+
+            // 执行语句
+            if ($stmt->execute()) {
+                echo "{$row['uid']} 新记录插入成功";
+            } else {
+                echo "插入记录时出错: " . $stmt->error;
+            }
+        } else {
+            echo "{$row['uid']} 已经存在";
+        }
+    }
+} else {
+    die("查询失败: " . $connection->error);
+}
+
+// 关闭数据库连接
+$connection->close();

+ 2 - 12
webServer/src/json/serverList.json

@@ -1,18 +1,8 @@
 [{
     "id":1,
     "name":"1区",
-    "ip":"43.198.254.107",
+    "ip":"81.70.25.61",
     "port":8192,
     "status":1
-  },
-    {
-    "id":2,
-    "name":"2区",
-    "ip":"43.198.254.107",
-    "port":8193,
-    "status":2
   }
-]
-
-
-
+]

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 2 - 0
webServer/src/json/th_notice.json


+ 8 - 0
webServer/src/json/xky_notice.json

@@ -0,0 +1,8 @@
+[
+    {
+        "content": "亲爱的《侠客游》玩家:\n你们好!\n感谢你们在这么久来与我们一起度过的无数个快乐时光,在此我们向所有《侠客游》的玩家致以最真诚的感谢!\n在过去的这段时间里,也许大家还有未完成的目标和愿望,也许还想和游戏中结识的小伙伴继续征战……而天下无不散之筵席。\n《侠客游》终于也要到了和大家说再见的时候了!\n《侠客游》11月12日起开始正式停止运营。\n感谢各位玩家对《侠客游》的支持,我们仍将不懈努力为大家推出更多的精品游戏!\n《侠客游》运营团队\n",
+        "status": 1,
+        "content_wh": "亲爱的《侠客游》玩家:\n你们好!\n感谢你们在这么久来与我们一起度过的无数个快乐时光,在此我们向所有《侠客游》的玩家致以最真诚的感谢!\n在过去的这段时间里,也许大家还有未完成的目标和愿望,也许还想和游戏中结识的小伙伴继续征战……而天下无不散之筵席。\n《侠客游》终于也要到了和大家说再见的时候了!\n《侠客游》11月12日起开始正式停止运营。\n感谢各位玩家对《侠客游》的支持,我们仍将不懈努力为大家推出更多的精品游戏!\n《侠客游》运营团队\n"
+    }
+]
+

+ 15 - 0
webServer/src/json/区服.txt

@@ -0,0 +1,15 @@
+//进去数据库命令 密码wch123.com
+mysql -u root -p 
+数据库 sdk
+表 game_sever
+
+//加区服
+ INSERT INTO `game_server` (`id`, `name`, `status`, `ip`, `port`, `tag`, `tips`,`white_list`) VALUES (3, '寻宝3区', 0, '118.145.139.78', 28192, 'default', '服务器将于2024-09-07 13:00开启 官方QQ群:992058780','');
+
+备注:
+status 1 开启 2火爆 3维护 0关闭
+port 按照8192 依据区服id递增+1
+ip 当前游戏服务器的ip
+tips 弹窗公告
+white_list 白名单, 当区服status=0生效, 多个ip以英文逗号隔开
+open_time 时间戳 当区服=0生效 每分钟整点判断  大于时间戳自动更新staus=1

+ 1 - 1
webServer/src/model/CDK.ts

@@ -205,7 +205,7 @@ class CDK {
         let serverList  = jsonret as number[]
         let isServer = false
         for(let i = 0;i < serverList.length;i++) {
-            if (serverList[i] == serverId) {
+            if (serverList[i] == serverId || serverList[i] == 0) {
                 isServer = true
                 break
             }

+ 21 - 3
webServer/src/model/OrderModel.ts

@@ -26,10 +26,28 @@ class OrderModel {
         orderId: any,
         status: any,
         out_trade_no: string,
-        update_time: string
+        update_time: string,
+        uid: any
     ) {
-        const sql = 'UPDATE game_order SET status = ?, update_time = ?, out_trade_no = ? WHERE order_id = ?';
-        return await query(sql, [status, update_time,out_trade_no, orderId])
+        let isFirst = 0
+
+       const order_info =  await query(`SELECT * FROM game_order WHERE uid = ? and status = 2 limit 1`,[uid])
+       if(!order_info[0]){
+         isFirst = 1
+       }
+
+        const sql = 'UPDATE game_order SET status = ?, update_time = ?, out_trade_no = ?, is_first = ? WHERE order_id = ?';
+        return await query(sql, [status, update_time,out_trade_no, isFirst, orderId])
+    }
+
+    //更新订单token
+    async updateOrderToken(
+        orderId: any,
+        token: string,
+        platform: string,
+    ) {
+        const sql = 'UPDATE game_order SET token = ?, platform = ? WHERE order_id = ?';
+        return await query(sql, [token, platform, orderId])
     }
 }
 

+ 88 - 21
webServer/src/model/ServerModel.ts

@@ -1,26 +1,93 @@
-import { query } from '../sql/query'; // 确保路径是正确的
+import { query } from "../sql/query"; // 确保路径是正确的
 
 class ServerModel {
-    //获取
-    async getServerList(tag: any) {
-        return await query(`SELECT id,status,name,ip,port,tips FROM game_server WHERE tag = ?`,[tag])
-    }
-    async getServerListById(tag: any, id:any) {
-        return await query(`SELECT id,status,name,ip,port,tips FROM game_server WHERE tag = ? and id = ? `,[tag,id])
-    }
-    async getAllServerList(tag: any) {
-        const rows = await  query(`SELECT id,status,name,ip,port,tips FROM game_server WHERE tag = ?`,[tag])
-        const resultArray = (rows as any[]).map(row => {
-            return {
-                sid : row.id,
-                id : row.id,
-                name: row.name,
-                server :`ws://${row.ip}:${row.port}`,
-                status: row.status,
-            };
-          });
-        return resultArray
+  //获取
+  async getServerList(tag: any, status: number) {
+    if (status) {
+      return await query(
+        `SELECT id,status,name,ip,port,tips,white_list FROM game_server WHERE tag = ? and status =  ?`,
+        [tag, status]
+      );
+    } else {
+      return await query(
+        `SELECT id,status,name,ip,port,tips,white_list FROM game_server WHERE tag = ?`,
+        [tag]
+      );
     }
+  }
+  async getServerListById(tag: any, id: any) {
+    return await query(`SELECT *  FROM game_enter_server WHERE  id = ? `, [id]);
+  }
+  async getAllServerList(tag: any, ip: string) {
+    const rows = await query(
+      `SELECT * FROM game_server WHERE tag = ?`,
+      [tag]
+    );
+    const resultArray = (rows as any[]).map((row) => {
+      let status = row.status;
+      if ((status == 0 || status == 3) && row.white_list) {
+        const list = row.white_list.split(",");
+        if (list.length > 0) {
+          if (list.includes(ip)) {
+            status = 1;
+          }
+        }
+      }
+
+      let server = "";
+      if (row.wss) {
+        server = row.wss;
+      } else {
+        server = `ws://${row.ip}:${row.port}`;
+      }
+
+      return {
+        sid: row.id,
+        id: row.id,
+        name: row.name,
+        server: server,
+        status: status,
+        tips: row.tips,
+        ip: row.ip,
+        port: row.port,
+      };
+    });
+    return resultArray;
+  }
+
+  async checkEnterServerByUid(uid: any, server_id: any) {
+    return await query(
+      `SELECT * FROM game_enter_server where uid  = ? and server_id  = ?`,
+      [uid, server_id]
+    );
+  }
+
+  async getEnterServerListByUid(uid: any) {
+    return await query(
+      `SELECT ges.id, ges.uid, ges.server_id, ges.create_time as last_login_time , gs.ip, gs.port,gs.status,gs.name,gs.tips FROM game_enter_server as ges left join game_server as gs on ges.server_id = gs.id WHERE ges.uid = ? order by ges.create_time desc `,
+      [uid]
+    );
+  }
+
+  //记录进区
+  async enterServer(uid: any, server_id: any, create_time: string) {
+    return await query(
+      `INSERT INTO game_enter_server(uid,server_id,first_server_id,create_time) VALUES('${uid}','${server_id}', '${server_id}', '${create_time}')`,
+      []
+    );
+  }
+
+  //更新进区
+  async updateEnterServer(id: any, create_time: string) {
+    const sql = "UPDATE game_enter_server SET create_time = ? WHERE id = ?";
+    return await query(sql, [create_time, id]);
+  }
+
+  //更新状态
+  async updateServerStatus(id: any, status: any) {
+    const sql = "UPDATE game_server SET status = ? WHERE id in (?)";
+    return await query(sql, [status, id]);
+  }
 }
 
-module.exports = new ServerModel()
+module.exports = new ServerModel();

+ 11 - 0
webServer/src/model/SystemModel.ts

@@ -0,0 +1,11 @@
+import { query } from '../sql/query'; // 确保路径是正确的
+
+class SystemModel {
+    //获取订单
+    async getSystemConfig() {
+        return await query('SELECT * FROM system_config',[])
+    }
+
+}
+
+module.exports = new SystemModel()

+ 43 - 0
webServer/src/model/UserModel.ts

@@ -0,0 +1,43 @@
+import { query } from "../sql/query"; // 确保路径是正确的
+
+class UserModel {
+    //检查账户是否存在
+    async checkAccountIsExist(uid: any, server_id: any) {
+        return await query(`SELECT * FROM accounts where account  = ?`, [uid]);
+    }
+
+    //创建账户
+    async createAccount(
+        uid: any,
+        channel_id: any,
+        reg_ip: any,
+        device_no: any,
+        reg_device: any,
+        create_time: string,
+    ) {
+        return await query(
+            `INSERT INTO accounts(account,status,channel_id,reg_ip,device_no,reg_device,created_at, updated_at) VALUES('${uid}',1, '${channel_id}', '${reg_ip}', '${device_no}', '${reg_device}', '${create_time}', '${create_time}')`,
+            []
+        );
+    }
+
+    //记录登录信息
+    async logAccountLogin(
+        uid: any,
+        login_ip: any,
+        device_type: any,
+        device_no: any,
+        device_model: any,
+        device_version: any,
+        system_version: string,
+        create_time: string,
+    ) {
+        return await query(
+            `INSERT INTO account_login_logs(account,login_ip,device_no,device_type,device_version,device_model,system_version, created_at, updated_at) VALUES('${uid}', '${login_ip}', '${device_no}', '${device_type}', '${device_version}','${system_version}','${device_model}','${create_time}', '${create_time}')`,
+            []
+        );
+    }
+
+}
+
+module.exports = new UserModel();

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

@@ -6,10 +6,14 @@ const ApiController = require('../controller/ApiController')
 
 //支付回调
 router.post('/callback', ApiController.callPay)
+router.get('/callback', ApiController.callPay)
 
 //登陆验证
 router.post('/checkUserToken', ApiController.checkUserToken)
 
+//quick登陆
+router.post('/quickUserLogin',ApiController.quickUserLogin)
+
 //获取区服列表
 router.get('/serverList', ApiController.getServerList)
 
@@ -23,6 +27,8 @@ router.post('/genCDK',ApiController.genCDK)
 
 router.post('/useCDK',ApiController.useCDK)
 
+router.post('/useCDKV2',ApiController.useCDKV2)
+
 router.post('/getCDK',ApiController.getCDK)
 
 router.post('/validCDK',ApiController.validCDK)
@@ -39,4 +45,12 @@ router.get('/getAllServerList', ApiController.getAllServerList)
 //获取公告
 router.get('/getNotice', ApiController.getNotice)
 
+router.get('/maintenance',ApiController.maintenance)
+
+router.get('/maintenanceAll',ApiController.maintenanceAll)
+
+router.post('/sendMail',ApiController.sendMail)
+
+router.post('/sendAllMail',ApiController.sendAllMail)
+
 module.exports = router

+ 3 - 0
webServer/src/server.ts

@@ -3,6 +3,7 @@ const Koa = require('koa')
 const bodyParser = require('koa-bodyparser');
 const router = require('./router/index')
 const koaRedis = require('koa-redis');
+import Task from './utils/task'
 import {
     redisConfig,
 } from './config/dbConfig'
@@ -27,4 +28,6 @@ app.use(router.routes()); //路由
 //监听端口
 const port = 3000
 app.listen(port);
+// const appTask = new Task();
+// appTask.openServer()
 console.log(`启动成功,服务端口为:${port}`)

+ 18 - 0
webServer/src/serverList.json

@@ -0,0 +1,18 @@
+[{
+    "id":1,
+    "name":"1区",
+    "ip":"43.198.254.107",
+    "port":8192,
+    "status":1
+  },
+    {
+    "id":2,
+    "name":"2区",
+    "ip":"43.198.254.107",
+    "port":8193,
+    "status":2
+  }
+]
+
+
+

+ 37 - 1
webServer/src/sql/sdk.sql

@@ -57,4 +57,40 @@ CREATE TABLE `game_servers` (
   `channel` varchar(50) DEFAULT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `srv_id` (`zone_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='服务器列表';
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='服务器列表';
+
+
+-- 账号表
+CREATE TABLE `accounts` (
+  `id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+  `account` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账号',
+  `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态',
+  `channel_id` int NOT NULL DEFAULT '0' COMMENT '渠道号',
+  `reg_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '注册ip',
+  `device_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '注册设备号',
+  `reg_device` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '注册设备',
+  `created_at` timestamp NOT NULL COMMENT '注册时间',
+  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户表';
+
+-- 登陆日志表
+CREATE TABLE `account_login_logs` (
+  `id` int unsigned NOT NULL AUTO_INCREMENT,
+  `account_id` int DEFAULT NULL COMMENT '用户ID',
+  `login_ip` varchar(50) NOT NULL DEFAULT '0' COMMENT '登录ip',
+  `device_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '设备编号',
+  `device_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '设备类型 1:ios 2:安卓 3:h5',
+  `device_version` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '客户端版本',
+  `system_language` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '系统语言',
+  `system_version` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '系统版本',
+  `device_model` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '设备型号',
+  `created_at` timestamp NULL DEFAULT NULL,
+  `updated_at` timestamp NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  KEY `acc_id_index` (`account_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='登录日志';
+
+
+ALTER TABLE `game_order`
+    ADD `account_id` int NOT NULL DEFAULT '0' COMMENT '账号id';

+ 47 - 36
webServer/src/utils/common.ts

@@ -1,49 +1,60 @@
-const Server = require('../model/ServerModel')
+const Server = require("../model/ServerModel");
 
 export const compareVersions = (v1: string, v2: string) => {
-    const parts1 = v1.split('.').map(Number);
-    const parts2 = v2.split('.').map(Number);
+  const parts1 = v1.split(".").map(Number);
+  const parts2 = v2.split(".").map(Number);
 
-    for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
-        const num1 = parts1[i] || 0;
-        const num2 = parts2[i] || 0;
+  for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
+    const num1 = parts1[i] || 0;
+    const num2 = parts2[i] || 0;
 
-        if (num1 > num2) return 1;
-        if (num1 < num2) return -1;
-    }
+    if (num1 > num2) return 1;
+    if (num1 < num2) return -1;
+  }
 
-    return 0;
-}
+  return 0;
+};
 
 export 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 "CP" + dateString + randomString1 + randomString2;
-}
+  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 "CP" + dateString + randomString1 + randomString2;
+};
 
 export const formatDate = (now: Date) => {
-    const formattedDateTime = now.getFullYear() + '-' + (now.getMonth() + 1) + '-' + now.getDate() + ' ' + now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
-    return formattedDateTime;
-}
+  const formattedDateTime =
+    now.getFullYear() +
+    "-" +
+    (now.getMonth() + 1) +
+    "-" +
+    now.getDate() +
+    " " +
+    now.getHours() +
+    ":" +
+    now.getMinutes() +
+    ":" +
+    now.getSeconds();
+  return formattedDateTime;
+};
 
 //根据区服id获取地址
 export const getServerList = async (serverId, tag) => {
-    const servers = (await Server.getServerList(tag))
-    for (let i = 0; i < servers.length; i++) {
-        if (servers[i].id == serverId) {
-            return 'ws://' + servers[i].ip + ':' + servers[i].port
-        }
+  const servers = await Server.getServerList(tag);
+  for (let i = 0; i < servers.length; i++) {
+    if (servers[i].id == serverId) {
+        return "ws://" + servers[i].ip + ":" + servers[i].port;
     }
-}
+  }
+};

+ 1 - 1
webServer/src/utils/log.ts

@@ -23,7 +23,7 @@ logger.add(new DailyRotateFile({
     dirname: path.join(__dirname, 'logs'),
     filename: '%DATE%.log',
     datePattern: 'YYYY-MM-DD-HH',
-    zippedArchive: true,
+    zippedArchive: false,
     maxSize: '100m',
     maxFiles: '14d'
 }));

+ 3 - 3
webServer/src/utils/logs/.0304eb38f40d986235d7449a630e55701cab0b51-audit.json

@@ -6,9 +6,9 @@
     "auditLog": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/.0304eb38f40d986235d7449a630e55701cab0b51-audit.json",
     "files": [
         {
-            "date": 1724862409501,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/2024-08-29-00.log",
-            "hash": "30f2fdddeecf5a7533eed10f269a2be029cdcf79967cfdbdb2222b9010d73602"
+            "date": 1743735977180,
+            "name": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/2025-04-04-11.log",
+            "hash": "efe85c3cdb1ae2f9216d8229cf6f872c0dbde60c127465a83c3011d03ac84c61"
         }
     ],
     "hashType": "sha256"

+ 0 - 30
webServer/src/utils/logs/.b1cd853ba866c173ec05e9dc6d43d42025004f0d-audit.json

@@ -1,30 +0,0 @@
-{
-    "keep": {
-        "days": true,
-        "amount": 14
-    },
-    "auditLog": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/.b1cd853ba866c173ec05e9dc6d43d42025004f0d-audit.json",
-    "files": [
-        {
-            "date": 1724843706399,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/2024-08-28-19.log",
-            "hash": "24e46b0c5f8ab3c9dc78ef2a570f0e085e7f69c2a3b4cdb78093665df1451fed"
-        },
-        {
-            "date": 1724862784208,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/2024-08-29-00.log",
-            "hash": "a530c5aec4366bc98ed0a6883c27d1ca8894cc783b5b22fba20612b04f1b3ab9"
-        },
-        {
-            "date": 1724904509038,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/2024-08-29-12.log",
-            "hash": "eb9e2417eface64e81544ef60bd893c6933a4986aaec42ff98f4ab94806a1cef"
-        },
-        {
-            "date": 1724919807480,
-            "name": "/Users/zhanwencai/code/game/congkong/webServer/src/utils/logs/2024-08-29-16.log",
-            "hash": "016cfbeb55e960aab5c689d4f010f8a7cc8d2559f12809d89a5357dfe90f41f5"
-        }
-    ],
-    "hashType": "sha256"
-}

+ 0 - 0
webServer/src/utils/logs/2024-08-28-19.log


+ 0 - 10
webServer/src/utils/logs/2024-08-29-00.log

@@ -1,10 +0,0 @@
-2024-08-28T16:26:55.767Z info: create params: 
-
-2024-08-28T16:26:55.814Z info: 创建订单返回结果: 
-
-8/29/2024, 12:34:07 AM info: create params: 
-
-8/29/2024, 12:34:07 AM info: 创建订单返回结果: 
-
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"server_id":1,"uid":1},"timestamp":"2024-08-29T00:40:57+08:00"}
-{"level":"info","message":"创建订单返回结果:","params":{"code":0,"data":"CP2024082900405783151496","message":"创建订单成功"},"timestamp":"2024-08-29T00:40:57+08:00"}

+ 0 - 2
webServer/src/utils/logs/2024-08-29-12.log

@@ -1,2 +0,0 @@
-{"level":"info","message":"create params:","params":{"amount":1,"level":1,"product_id":1,"role_id":1,"role_name":1,"server_id":1,"uid":1},"timestamp":"2024-08-29T12:08:38+08:00"}
-{"level":"info","message":"创建订单返回结果:","params":{"code":0,"data":"CP2024082912083877708003","message":"创建订单成功"},"timestamp":"2024-08-29T12:08:38+08:00"}

+ 0 - 0
webServer/src/utils/logs/2024-08-29-16.log


+ 0 - 0
webServer/src/utils/logs/2024-09-12-13.log


+ 0 - 0
webServer/src/utils/logs/2024-09-13-14.log


+ 0 - 3
webServer/src/utils/logs/2024-09-21-12.log

@@ -1,3 +0,0 @@
-{"ip":"::1","level":"info","message":"getLastServerList 区服接口","timestamp":"2024-09-21T12:30:27+08:00"}
-{"ip":"::1","level":"info","message":"getLastServerList 区服接口","timestamp":"2024-09-21T12:30:32+08:00"}
-{"ip":"::1","level":"info","message":"getLastServerList 区服接口","timestamp":"2024-09-21T12:30:42+08:00"}

+ 0 - 0
webServer/src/utils/logs/2024-09-22-12.log


+ 0 - 0
webServer/src/utils/logs/2024-09-26-20.log


+ 0 - 0
webServer/src/utils/logs/2024-11-13-14.log


+ 0 - 1
webServer/src/utils/logs/2024-11-13-15.log

@@ -1 +0,0 @@
-{"ip":"::1","level":"info","message":"区服接口","timestamp":"2024-11-13T15:30:55+08:00"}

+ 0 - 10
webServer/src/utils/logs/2024-11-15-10.log

@@ -1,10 +0,0 @@
-{"level":"info","message":"pay callback params:","params":{"cText":"","couponAmount":"0","cpOrder":"CP2024090713513130591281","currencyType":"RMB","gameId":2633,"gameNum":"300","orderId":"1754582202409071351324887","orderType":1,"price":"30.00","roleId":"81054013984","serverId":"3","sign":"657fa09c96e7178bd6869a6041a190d0","skuPrice":"30.00","time":1725688302,"uid":1754582},"timestamp":"2024-11-15T10:56:11+08:00","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP2024090713513130591281已经重复发货","timestamp":"2024-11-15T10:56:11+08:00"}
-{"level":"info","message":"pay callback params:","params":{"cText":"","couponAmount":"0","cpOrder":"CP2024090713513130591281","currencyType":"RMB","gameId":2633,"gameNum":"300","orderId":"1754582202409071351324887","orderType":1,"price":"30.00","roleId":"81054013984","serverId":"3","sign":"657fa09c96e7178bd6869a6041a190d0","skuPrice":"30.00","time":1725688302,"uid":1754582},"timestamp":"2024-11-15T10:56:51+08:00","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP2024090713513130591281 ws://81.70.25.61:8192","timestamp":"2024-11-15T10:56:51+08:00"}
-{"level":"info","message":"pay callback params:","params":{"cText":"","couponAmount":"0","cpOrder":"CP2024090713513130591281","currencyType":"RMB","gameId":2633,"gameNum":"300","orderId":"1754582202409071351324887","orderType":1,"price":"30.00","roleId":"81054013984","serverId":"3","sign":"657fa09c96e7178bd6869a6041a190d0","skuPrice":"30.00","time":1725688302,"uid":1754582},"timestamp":"2024-11-15T10:57:20+08:00","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP2024090713513130591281 ws://81.70.25.61:8192","timestamp":"2024-11-15T10:57:21+08:00"}
-{"level":"info","message":"pay callback params:","params":{"cText":"","couponAmount":"0","cpOrder":"CP2024090713513130591281","currencyType":"RMB","gameId":2633,"gameNum":"300","orderId":"1754582202409071351324887","orderType":1,"price":"30.00","roleId":"81054013984","serverId":"3","sign":"657fa09c96e7178bd6869a6041a190d0","skuPrice":"30.00","time":1725688302,"uid":1754582},"timestamp":"2024-11-15T10:58:05+08:00","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP2024090713513130591281 ws://81.70.25.61:8192","timestamp":"2024-11-15T10:58:05+08:00"}
-{"level":"info","message":"pay callback params:","params":{"cText":"","couponAmount":"0","cpOrder":"CP2024090713513130591281","currencyType":"RMB","gameId":2633,"gameNum":"300","orderId":"1754582202409071351324887","orderType":1,"price":"30.00","roleId":"81054013984","serverId":"3","sign":"657fa09c96e7178bd6869a6041a190d0","skuPrice":"30.00","time":1725688302,"uid":1754582},"timestamp":"2024-11-15T10:59:04+08:00","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP2024090713513130591281 ws://81.70.25.61:8192","timestamp":"2024-11-15T10:59:04+08:00"}

+ 0 - 2
webServer/src/utils/logs/2024-11-15-11.log

@@ -1,2 +0,0 @@
-{"level":"info","message":"pay callback params:","params":{"cText":"","couponAmount":"0","cpOrder":"CP2024090713513130591281","currencyType":"RMB","gameId":2633,"gameNum":"300","orderId":"1754582202409071351324887","orderType":1,"price":"30.00","roleId":"81054013984","serverId":"3","sign":"657fa09c96e7178bd6869a6041a190d0","skuPrice":"30.00","time":1725688302,"uid":1754582},"timestamp":"2024-11-15T11:00:02+08:00","url":"http://localhost:3000/callback"}
-{"level":"info","message":"订单CP2024090713513130591281 ws://81.70.25.61:8192","timestamp":"2024-11-15T11:00:03+08:00"}

+ 0 - 0
webServer/src/utils/logs/2024-11-18-10.log


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
webServer/src/utils/logs/2024-11-18-11.log


+ 0 - 9
webServer/src/utils/logs/2024-11-18-13.log

@@ -1,9 +0,0 @@
-{"data":{"code":400,"msg":"激活码已被使用!"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T13:56:32+08:00"}
-{"data":{"code":400,"msg":"激活码已被使用!"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T13:56:32+08:00"}
-{"level":"info","message":"api cdk 发送服务器 param:","param":"{\"code\":\"LWPIQBQ7W9BZR\",\"type\":\"UseFixCDK\"}","timestamp":"2024-11-18T13:56:32+08:00"}
-{"data":{"code":400,"msg":"激活码已被使用!"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T13:58:16+08:00"}
-{"data":{"code":400,"msg":"激活码已被使用!"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T13:58:16+08:00"}
-{"level":"info","message":"api cdk 发送服务器 param:","param":"{\"code\":\"HO75RZCdG14ec\",\"type\":\"UseFixCDK\"}","timestamp":"2024-11-18T13:58:16+08:00"}
-{"data":{"code":400,"msg":"激活码已被使用!"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T13:58:39+08:00"}
-{"data":{"code":400,"msg":"激活码已被使用!"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T13:58:39+08:00"}
-{"level":"info","message":"api cdk 发送服务器 param:","param":"{\"code\":\"HO75RZCdG14ec\",\"type\":\"UseFixCDK\"}","timestamp":"2024-11-18T13:58:39+08:00"}

+ 0 - 6
webServer/src/utils/logs/2024-11-18-14.log

@@ -1,6 +0,0 @@
-{"data":{"code":200,"data":"405007:3;405008:2","msg":"领取成功"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T14:05:36+08:00"}
-{"data":{"code":200,"data":"405007:3;405008:2","msg":"领取成功"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T14:05:36+08:00"}
-{"level":"info","message":"api cdk 发送服务器 param:","param":"{\"type\":\"UseCDK\",\"itemList\":[[405007,3],[405008,2]]}","timestamp":"2024-11-18T14:05:36+08:00"}
-{"data":{"code":200,"data":"405007:3;405008:2","msg":"领取成功"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T14:06:13+08:00"}
-{"data":{"code":200,"data":"405007:3;405008:2","msg":"领取成功"},"level":"info","message":"api cdk 接口返回 response:","timestamp":"2024-11-18T14:06:13+08:00"}
-{"level":"info","message":"api cdk 发送服务器 param:","param":"{\"type\":\"UseCDK\",\"itemList\":[[405007,3],[405008,2]]}","timestamp":"2024-11-18T14:06:13+08:00"}

+ 227 - 221
webServer/src/utils/msg.ts

@@ -1,228 +1,234 @@
 import WebSocket from 'ws';
 
 export default class Msg {
-	private static  sendBufLen = 0;
-	private static sendBuf = new ArrayBuffer(512);
-	private static sendBufDV = new DataView(Msg.sendBuf, 0);
-	static websocket;
-	static isConnect: Boolean;
-	static isConnecting: boolean;
-	static websocketM;
-	static isConnectM:Boolean;
-	static isConnectingM:Boolean;
-	static isInitiative: boolean = false;
-	static handler;
-	static account;
-
-	static connect(url, inputAccount) {
-		console.log("开始连接 url ============== ", url);
-		if (Msg.isConnect) {
-			console.log("msg connect 连接已存在");
-		} else if (Msg.isConnecting) {
-			console.log("msg connect 正在连接中");
-		} else {
+    public sendBufLen = 0;
+    public sendBuf = new ArrayBuffer(512);
+    public sendBufDV = new DataView(this.sendBuf, 0);
+    public websocket;
+    public isConnect: Boolean;
+    public isConnecting: boolean;
+    public websocketM;
+    public isConnectM: Boolean;
+    public isConnectingM: Boolean;
+    public isInitiative: boolean = false;
+    public handler;
+    public account;
+
+    onOpen(evt) {
+        this.isConnecting = false;
+        if (this.websocket.readyState == 1 && !this.isConnect) {
+            this.isConnect = true;
+            console.log("连接成功");
+        } else {
+            console.log("连接服务器失败(" + this.websocket.readyState + ")")
+        }
+    }
+
+    onClose(evt) {
+        this.isConnect = false;
+        this.isConnecting = false;
+        if (this.websocket) {
+            this.websocket.close();
+        }
+        if (this.isInitiative) this.isInitiative = false;
+        if (this.isConnectM) this.websocketM.close();
+    }
+
+    onMessage(evt) {
+        this.isConnect = false;
+        this.isConnecting = false;
+        // console.log("receive message ",evt.data)
+    }
+
+    onError(evt) {
+        this.isConnect = false;
+        this.isConnecting = false;
+        if (this.websocket) {
+            this.websocket.close();
+        }
+        if (this.isConnectM) this.websocketM.close();
+        // PlatformManager.onLoginError();
+        // LoadingPanel.instance.tip = "连接服务器失败(" + Msg.websocket.readyState + ")";
+    }
+
+    connect(url, inputAccount) {
+        console.log("开始连接 url ============== ", url);
+        if (this.isConnect) {
+            console.log("msg connect 连接已存在");
+        } else if (this.isConnecting) {
+            console.log("msg connect 正在连接中");
+        } else {
             console.log("msg connect 开始连接");
-			Msg.isConnect = false;
-			Msg.isConnecting = true;
-            Msg.websocket = new WebSocket(url);
-			Msg.websocket.binaryType = "arraybuffer";
-			Msg.websocket.onopen = function (evt) { Msg.onOpen(evt) };
-			Msg.websocket.onclose = function (evt) { Msg.onClose(evt) };
-			Msg.websocket.onmessage = function (evt) { Msg.handler.onMessage(evt) };
-			Msg.websocket.onerror = function (evt) { Msg.onError(evt) };
-			Msg.account = inputAccount;
-		}
-	}
-
-	static onOpen(evt) {
-		Msg.isConnecting = false;
-		if (Msg.websocket.readyState == 1 && !Msg.isConnect) {
-			Msg.isConnect = true;
-			console.log("连接成功");
-		} else {
-			console.log("连接服务器失败(" + Msg.websocket.readyState + ")")
-		}
-	}
-
-	static onClose(evt) {
-		Msg.isConnect = false;
-		Msg.isConnecting = false;
-		if (Msg.websocket) {
-			Msg.websocket.close();
-		}
-		if (Msg.isInitiative) Msg.isInitiative = false;
-		if (Msg.isConnectM) Msg.websocketM.close();
-	}
-
-	static onError(evt) {
-		Msg.isConnect = false;
-		Msg.isConnecting = false;
-		if (Msg.websocket) {
-			Msg.websocket.close();
-		}
-		if (Msg.isConnectM) Msg.websocketM.close();
-		// PlatformManager.onLoginError();
-		// LoadingPanel.instance.tip = "连接服务器失败(" + Msg.websocket.readyState + ")";
-	}
-
-	static connectM(url)
-	{
-		if (Msg.isConnectM) {
-			console.log("msg connectM 连接已存在");
-		} else if (Msg.isConnectingM) {
-			console.log("msg connectM 正在连接中");
-		} else {
-			Msg.isConnectM = false;
-			Msg.isConnectingM = true;
-			Msg.websocketM = new WebSocket(url);
-			Msg.websocketM.binaryType="arraybuffer";
-			Msg.websocketM.onopen = function(evt) { Msg.onOpenM(evt) };
-			Msg.websocketM.onclose = function(evt) { Msg.onCloseM(evt) };
-			Msg.websocketM.onmessage = function(evt) { Msg.handler.onMessageM(evt) };
-			Msg.websocketM.onerror = function(evt) { Msg.onErrorM(evt) };
-		}
-	}
-
-	static onOpenM(evt) {
-		Msg.isConnectingM = false;
-		if (Msg.websocketM.readyState == 1 && !Msg.isConnectM) {
-			Msg.isConnectM = true;
-			// Msg.CG_MIDDLE_LOGIN(account);
-		} else {
-			//trace("sopcket middle err:", websocketM.readyState);
-		}
-	}
-
-	static onCloseM(evt)
-	{
-		Msg.isConnectM = false;
-		Msg.isConnectingM = false;
-		console.log('onCloseM>>>>>>>>>>>>>>>>>>>>>>>>>>')
-		if (Msg.websocketM) {
-			Msg.websocketM.close();
-		}
-	}
-
-	static onErrorM(evt)
-	{
-		Msg.isConnectM = false;
-
-		Msg.isConnectM = false;
-		Msg.isConnectingM = false;
-		console.log('onErrorM>>>>>>>>>>>>>>>>>>>>>>>>>>')
-		if (Msg.websocketM) {
-			Msg.websocketM.close();
-		}
-	}	
-
-	static writeDouble(n) {
-		Msg.sendBufDV.setFloat64(Msg.sendBufLen, n);
-		Msg.sendBufLen = Msg.sendBufLen + 8;
-	}
-
-	static writeInt(n) {
-		Msg.sendBufDV.setInt32(Msg.sendBufLen, n);
-		Msg.sendBufLen = Msg.sendBufLen + 4;
-	}
-
-	static writeUint(n) {
-		Msg.sendBufDV.setUint32(Msg.sendBufLen, n);
-		Msg.sendBufLen = Msg.sendBufLen + 4;
-	}
-
-
-	static writeShort(n) {
-		Msg.sendBufDV.setInt16(Msg.sendBufLen, n);
-		Msg.sendBufLen = Msg.sendBufLen + 2;
-	}
-
-	static writeByte(n) {
-		Msg.sendBufDV.setInt8(Msg.sendBufLen, n);
-		Msg.sendBufLen = Msg.sendBufLen + 1;
-	}
-
-	static writeString(str) {
-		var oldPos = Msg.sendBufLen
-		Msg.writeShort(0)
-		var totalByte = 0
-		var strLen = str.length
-		for (var i = 0; i < strLen; ++i) {
-			var t = str.charCodeAt(i)
-			if (t < 128) {
-				totalByte = totalByte + 1
-				Msg.writeByte(t)
-			}
-			else if (t < 2048) {
-				totalByte = totalByte + 2
-				Msg.writeByte(t >> 6 | 192)
-				Msg.writeByte(t & 63 | 128)
-			}
-			else if (t < 65536) {
-				totalByte = totalByte + 3
-				Msg.writeByte(t >> 12 | 224)
-				Msg.writeByte(t >> 6 & 63 | 128)
-				Msg.writeByte(t & 63 | 128)
-			}
-			else {
-				throw "error";
-			}
-		}
-		Msg.sendBufDV.setInt16(oldPos, totalByte);
-	}
-
-	static send(packetID) {
-		var ab = new Uint8Array(Msg.sendBufLen)
-		for (var i = 0; i < Msg.sendBufLen; ++i) {
-			ab[i] = Msg.sendBufDV.getInt8(i);
-		}
-
-			Msg.websocket.send(ab.buffer);
-	}
-
-	static close() {
-	    if (Msg.websocket) {
-	        Msg.websocket.close();
-	    }
-	    if (Msg.websocketM) {
-	        Msg.websocketM.close();
-	    }
-	    Msg.isConnect = false;
-	    Msg.isConnecting = false;
-	    Msg.isConnectM = false;
-	    Msg.isConnectingM = false;
-	}
-  
-    static CG_ASK_LOGIN(account: string, timestamp: number, authkey: string, lang: string, region: string, ip: string, params: string)
-	{
-		console.log("发送登录消息",Msg.websocket.readyState,Msg.isConnect);
-		if (Msg.isConnect != true || Msg.websocket.readyState != 1) return false;
-		Msg.sendBufLen = 4;
-		Msg.writeString(account);
-		Msg.writeInt(timestamp);
-		Msg.writeString(authkey);
-		Msg.writeString(lang);
-		Msg.writeString(region);
-		Msg.writeString(ip);
-		Msg.writeString(params);
-		Msg.sendBufDV.setInt16(2, 62);	
-		Msg.sendBufDV.setInt16(0, Msg.sendBufLen - 4);
-		Msg.send(62);
-		console.log("发送完了断开连接");
-        Msg.close();  // 主动断开连接
+            const _that = this
+            this.isConnect = false;
+            this.isConnecting = true;
+            this.websocket = new WebSocket(url);
+            this.websocket.binaryType = "arraybuffer";
+            this.websocket.onopen = function (evt) { _that.onOpen(evt) };
+            this.websocket.onclose = function (evt) { _that.onClose(evt) };
+            this.websocket.onmessage = function (evt) { _that.onMessage(evt) };
+            this.websocket.onerror = function (evt) { _that.onError(evt) };
+            this.account = inputAccount;
+        }
+    }
+
+    connectM(url) {
+        if (this.isConnectM) {
+            console.log("msg connectM 连接已存在");
+        } else if (this.isConnectingM) {
+            console.log("msg connectM 正在连接中");
+        } else {
+            const _that = this
+            this.isConnectM = false;
+            this.isConnectingM = true;
+            this.websocketM = new WebSocket(url);
+            this.websocketM.binaryType = "arraybuffer";
+            this.websocketM.onopen = function (evt) { _that.onOpenM(evt) };
+            this.websocketM.onclose = function (evt) { _that.onCloseM(evt) };
+            this.websocketM.onmessage = function (evt) { _that.handler.onMessageM(evt) };
+            this.websocketM.onerror = function (evt) { _that.onErrorM(evt) };
+        }
+    }
+
+    onOpenM(evt) {
+        this.isConnectingM = false;
+        if (this.websocketM.readyState == 1 && !this.isConnectM) {
+            this.isConnectM = true;
+            // Msg.CG_MIDDLE_LOGIN(account);
+        } else {
+            //trace("sopcket middle err:", websocketM.readyState);
+        }
+    }
+
+    onCloseM(evt) {
+        this.isConnectM = false;
+        this.isConnectingM = false;
+        console.log('onCloseM>>>>>>>>>>>>>>>>>>>>>>>>>>')
+        if (this.websocketM) {
+            this.websocketM.close();
+        }
+    }
+
+    onErrorM(evt) {
+        this.isConnectM = false;
+
+        this.isConnectM = false;
+        this.isConnectingM = false;
+        console.log('onErrorM>>>>>>>>>>>>>>>>>>>>>>>>>>')
+        if (this.websocketM) {
+            this.websocketM.close();
+        }
+    }
+
+    writeDouble(n) {
+        this.sendBufDV.setFloat64(this.sendBufLen, n);
+        this.sendBufLen = this.sendBufLen + 8;
+    }
+
+    writeInt(n) {
+        this.sendBufDV.setInt32(this.sendBufLen, n);
+        this.sendBufLen = this.sendBufLen + 4;
+    }
+
+    writeUint(n) {
+        this.sendBufDV.setUint32(this.sendBufLen, n);
+        this.sendBufLen = this.sendBufLen + 4;
+    }
+
+
+    writeShort(n) {
+        this.sendBufDV.setInt16(this.sendBufLen, n);
+        this.sendBufLen = this.sendBufLen + 2;
+    }
+
+    writeByte(n) {
+        this.sendBufDV.setInt8(this.sendBufLen, n);
+        this.sendBufLen = this.sendBufLen + 1;
+    }
+
+    writeString(str) {
+        var oldPos = this.sendBufLen
+        this.writeShort(0)
+        var totalByte = 0
+        var strLen = str.length
+        for (var i = 0; i < strLen; ++i) {
+            var t = str.charCodeAt(i)
+            if (t < 128) {
+                totalByte = totalByte + 1
+                this.writeByte(t)
+            }
+            else if (t < 2048) {
+                totalByte = totalByte + 2
+                this.writeByte(t >> 6 | 192)
+                this.writeByte(t & 63 | 128)
+            }
+            else if (t < 65536) {
+                totalByte = totalByte + 3
+                this.writeByte(t >> 12 | 224)
+                this.writeByte(t >> 6 & 63 | 128)
+                this.writeByte(t & 63 | 128)
+            }
+            else {
+                throw "error";
+            }
+        }
+        this.sendBufDV.setInt16(oldPos, totalByte);
+    }
+
+    send(packetID) {
+        var ab = new Uint8Array(this.sendBufLen)
+        for (var i = 0; i < this.sendBufLen; ++i) {
+            ab[i] = this.sendBufDV.getInt8(i);
+        }
+
+        this.websocket.send(ab.buffer);
+    }
+
+    close() {
+        if (this.websocket) {
+            this.websocket.close();
+        }
+        if (this.websocketM) {
+            this.websocketM.close();
+        }
+        this.isConnect = false;
+        this.isConnecting = false;
+        this.isConnectM = false;
+        this.isConnectingM = false;
+    }
+
+    CG_ASK_LOGIN(account: string, timestamp: number, authkey: string, lang: string, region: string, ip: string, params: string, server_id: number) {
+        console.log("发送登录消息", this.websocket.readyState, this.isConnect);
+        if (this.isConnect != true || this.websocket.readyState != 1) return false;
+        this.sendBufLen = 4;
+        this.writeString(account);
+        this.writeInt(timestamp);
+        this.writeString(authkey);
+        this.writeString(lang);
+        this.writeString(region);
+        this.writeString(ip);
+        this.writeString(params);
+        this.writeInt(server_id);
+        this.sendBufDV.setInt16(2, 62);
+        this.sendBufDV.setInt16(0, this.sendBufLen - 4);
+        this.send(62);
+        console.log("发送完了断开连接");
+        this.close();  // 主动断开连接
         return true;
-	}
-
-	static CG_TEST_PROTO(account:string,param:string) {
-		console.log("发送CDK道具消息",Msg.websocket.readyState,Msg.isConnect);
-		if (Msg.isConnect != true || Msg.websocket.readyState != 1) return false;
-		Msg.sendBufLen = 4;
-		Msg.writeString(account)
-		Msg.writeString(param)
-		Msg.sendBufDV.setInt16(2, 1259);	
-		Msg.sendBufDV.setInt16(0, Msg.sendBufLen - 4);
-		Msg.send(1259);
-		console.log("发送完了断开连接");
-        Msg.close();  // 主动断开连接
+    }
+
+    CG_TEST_PROTO(account: string, param: string,server_id = 1) {
+        console.log("发送CDK道具消息", this.websocket.readyState, this.isConnect);
+        if (this.isConnect != true || this.websocket.readyState != 1) return false;
+        this.sendBufLen = 4;
+        this.writeString(account)
+        this.writeString(param)
+        this.writeInt(server_id);
+        this.sendBufDV.setInt16(2, 1259);
+        this.sendBufDV.setInt16(0, this.sendBufLen - 4);
+        this.send(1259);
+        console.log("发送完了断开连接");
+        this.close();  // 主动断开连接
         return true;
-	}
+    }
 }

+ 120 - 0
webServer/src/utils/quickAsy.ts

@@ -0,0 +1,120 @@
+import { parseString } from 'xml2js';
+import { Md5 } from 'ts-md5';
+
+export default class QuickAsy {
+
+    /**
+     * 解码函数
+     * @param strEncode 加密字符串
+     * @param keys 解密密钥 (在游戏中通常是 callback_key)
+     * @returns 解码后的字符串
+     */
+    static decode(strEncode: string, keys: string): string {
+        if (!strEncode) {
+            return strEncode;
+        }
+
+        const list = strEncode.match(/\d+/g);
+        if (list && list.length > 0) {
+            const keyBytes = QuickAsy.getBytes(keys);
+            const data: number[] = [];
+
+            for (let i = 0; i < list.length; i++) {
+                const keyVar = keyBytes[i % keyBytes.length];
+                data[i] = parseInt(list[i]) - (0xff & keyVar);
+            }
+
+            return QuickAsy.toStr(data);
+        } else {
+            return strEncode;
+        }
+    }
+
+    /**
+     * 生成游戏同步签名
+     * @param params 参数对象
+     * @param callbackKey 回调密钥
+     * @returns 签名字符串
+     */
+    static getSign(params: { nt_data: string, sign: string }, callbackKey: string): string {
+        return QuickAsy.md5(params.nt_data + params.sign + callbackKey);
+    }
+
+    /**
+     * 替换MD5
+     * @param md5 传入的MD5值
+     * @returns 替换后的MD5值
+     */
+    static replaceMD5(md5: string): string {
+        md5 = md5.toLowerCase();
+        const bytes = QuickAsy.getBytes(md5);
+        const len = bytes.length;
+
+        if (len >= 23) {
+            let change = bytes[1];
+            bytes[1] = bytes[13];
+            bytes[13] = change;
+
+            let change2 = bytes[5];
+            bytes[5] = bytes[17];
+            bytes[17] = change2;
+
+            let change3 = bytes[7];
+            bytes[7] = bytes[23];
+            bytes[23] = change3;
+        } else {
+            return md5;
+        }
+
+        return QuickAsy.toStr(bytes);
+    }
+
+    /**
+     * 将字符串转换为字节数组
+     * @param string 字符串
+     * @returns 字节数组
+     */
+    private static getBytes(string: string): number[] {
+        const bytes: number[] = [];
+        for (let i = 0; i < string.length; i++) {
+            bytes.push(string.charCodeAt(i));
+        }
+        return bytes;
+    }
+
+    /**
+     * 将字节数组转换为字符串
+     * @param bytes 字节数组
+     * @returns 转换后的字符串
+     */
+    private static toStr(bytes: number[]): string {
+        return String.fromCharCode(...bytes);
+    }
+
+    /**
+     * 计算 MD5 哈希值 (假设我们有一个 md5 函数)
+     * @param str 输入字符串
+     * @returns MD5 哈希值
+     */
+    private static md5(str: string): string {
+        // 假设有一个全局的 `md5` 函数可以使用
+        return Md5.hashStr(str);
+    }
+
+    static parseXmlToObject<T>(xml: string): T {
+    let result: T;
+    parseString(xml, (err, parsedResult) => {
+        if (err) {
+            console.error('Error parsing XML:', err);
+            throw err;
+        }
+        result = parsedResult as T;
+    });
+
+    // 由于 parseString 是异步回调的,所以需要在这里做等待处理
+    if (!result) {
+        throw new Error('Parsing failed');
+    }
+    return result;
+    }
+}

+ 84 - 0
webServer/src/utils/retryPay.php

@@ -0,0 +1,84 @@
+<?php
+// 确保这些常量已经定义
+defined('DB_SERVER') ? null : define('DB_SERVER', 'localhost');
+defined('DB_USER') ? null : define('DB_USER', 'root');
+defined('DB_PASS') ? null : define('DB_PASS', 'wch123.com');
+defined('DB_NAME') ? null : define('DB_NAME', 'sdk');
+
+// 连接数据库
+$connection = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
+
+// 检查连接
+if ($connection->connect_error) {
+    die("连接失败: " . $connection->connect_error);
+}
+
+$now = time();
+ 
+// 1天的时间戳
+$halfHourAgo = strtotime("-1 day", $now);
+ 
+// 格式化时间戳为日期时间字符串
+$halfHourAgoFormatted = date("Y-m-d H:i:s", $halfHourAgo);
+
+// 查询数据库
+$query = "SELECT * FROM game_order where status= 1 and token != '' and create_time >= '{$halfHourAgoFormatted}' ";
+$result = $connection->query($query);
+
+$data = [];
+if ($result) {
+    while ($row = $result->fetch_assoc()) {
+        $data[] = $row;
+    }
+} else {
+    die("查询失败: " . $connection->error);
+}
+
+// 关闭数据库连接
+$connection->close();
+
+if(empty($data)){
+    die("查询为空");
+}
+
+foreach ($data as $val) {
+    $apiParams = [
+        'orderId' => $val['order_id'],
+        'platform' => $val['platform'],
+        'purchaseToken' => $val['token']
+    ];
+
+    var_dump($apiParams['orderId']);
+
+    // 发送POST请求
+    $url = 'http://sso.skystoryorigin.com:3000/callback';
+    $jsonStr = json_encode($apiParams);
+    list($returnCode, $returnContent) = http_post_json($url, $jsonStr);
+
+    var_dump($returnCode, $returnContent);
+}
+
+function http_post_json($url, $jsonStr)
+{
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_POST, 1);
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt(
+        $ch,
+        CURLOPT_HTTPHEADER,
+        array(
+            'Content-Type: application/json;charset=utf-8',
+            'Content-Length: ' . strlen($jsonStr)
+        )
+    );
+    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 超时时间设置为10秒
+    
+    $response = curl_exec($ch);
+    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+    curl_close($ch);
+
+    return array($httpCode, $response);
+}
+

+ 39 - 0
webServer/src/utils/task.ts

@@ -0,0 +1,39 @@
+
+import { query } from '../sql/query'; // 确保路径是正确的
+const schedule = require('node-schedule');
+
+async function asyncOpenServer() {
+    const sql = 'SELECT * FROM game_server where status in (0,3) and open_time > 0';
+    return new Promise((resolve, reject) => {
+        query(sql, (error, results, fields) => {
+            if (error) throw error;
+            // 处理查询结果
+            console.log(results);
+            (results as any[]).forEach(row => {
+                const timestamp = new Date().getTime();
+                if (timestamp >= row.open_time) {
+                    const updateSql = `update  game_server set status = 1  where id = ${row.id} `;
+                    query(updateSql, (error, res, fields) => {
+                        resolve(results)
+                    })
+                }
+            })
+        });
+    });
+}
+
+export default class Task {
+    openServer() {
+        const rule = new schedule.RecurrenceRule();
+        rule.second = [0];
+        const job = schedule.scheduleJob(rule, async function () {
+            try {
+                const result = await asyncOpenServer(); // 使用await等待异步任务完成
+                console.log(result);
+            } catch (error) {
+                console.error('区服任务执行出错:', error);
+            }
+        });
+    }
+}
+

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů