ApiController.ts 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554
  1. import Msg from "../utils/msg"; // 确保路径是正确的
  2. import QuickAsy from "../utils/quickAsy";
  3. import { parseString } from "xml2js";
  4. import {
  5. RefreshToken,
  6. PackageName,
  7. ProductId,
  8. IosUrl,
  9. SandboxIosUrl,
  10. Account,
  11. ClientSecret,
  12. ClientId,
  13. AppSecret360,
  14. } from "../config/thirdParams";
  15. import {
  16. compareVersions,
  17. generateOrderNumber,
  18. formatDate,
  19. getServerList,
  20. } from "../utils/common";
  21. const CryptoJS = require("crypto-js");
  22. const Order = require("../model/OrderModel");
  23. const Server = require("../model/ServerModel");
  24. const System = require("../model/SystemModel");
  25. const User = require("../model/UserModel");
  26. const Version = require("../model/VersionModel");
  27. const CDK = require("../model/CDK");
  28. const notice = require("../json/notice.json");
  29. const th_notice = require("../json/th_notice.json");
  30. const xky_notice = require("../json/xky_notice.json");
  31. const logger = require("../utils/log");
  32. const axios = require("axios");
  33. const googleCallPay = async (ctx) => {
  34. let ret = {
  35. code: 0,
  36. msg: "发货失败",
  37. };
  38. let data = ctx.request.body;
  39. let orderId = data.orderId;
  40. let googleToken = data.purchaseToken;
  41. let out_trade_no = "";
  42. logger.info("pay callback params:", { url: ctx.href, params: data });
  43. const res = await Order.updateOrderToken(orderId, googleToken, "google");
  44. const redisClient = ctx.redis.client;
  45. let access_token = await redisClient.get("access_token");
  46. if (!access_token) {
  47. console.log("请求api获取token");
  48. const apiData = {
  49. grant_type: "refresh_token",
  50. client_id: ClientId,
  51. client_secret: ClientSecret,
  52. refresh_token: RefreshToken,
  53. };
  54. const response = await axios.post(
  55. "https://accounts.google.com/o/oauth2/token",
  56. apiData,
  57. {
  58. headers: {
  59. "Content-Type": "application/x-www-form-urlencoded",
  60. },
  61. }
  62. );
  63. logger.info("token params:", { data: response.data, params: apiData });
  64. if (!response.data.access_token) {
  65. return ret;
  66. }
  67. access_token = response.data.access_token;
  68. await redisClient.set("access_token", response.data.access_token);
  69. await redisClient.expire("access_token", 1800);
  70. }
  71. if (!access_token) {
  72. return ret;
  73. }
  74. const orderInfo = (await Order.getOrder(orderId))[0];
  75. if (!orderInfo) {
  76. logger.info(`订单${orderId}不存在`);
  77. ret.msg = `订单${orderId}不存在`;
  78. return ret;
  79. }
  80. if (orderInfo.status == 2) {
  81. logger.info(`订单${orderId}已经重复发货`);
  82. ret.code = 1;
  83. ret.msg = `订单${orderId}已经重复发货`;
  84. return ret;
  85. }
  86. let url = await getServerList(orderInfo.server_id, "default");
  87. if (!url) {
  88. logger.info(`区服id错误: serverId ${orderInfo.server_id}`);
  89. ret.msg = `区服id错误: serverId ${orderInfo.server_id}`;
  90. return ret;
  91. }
  92. const productId = ProductId + orderInfo.product_id;
  93. let apiUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}?access_token=${access_token}`;
  94. let maxRetries = 3;
  95. let currentRetry = 0;
  96. let isCheck = false;
  97. // 使用 while 循环进行重试
  98. while (currentRetry < maxRetries) {
  99. try {
  100. // // 尝试执行的操作
  101. const googleRes = await axios.get(apiUrl, {
  102. headers: {
  103. "Content-Type": "application/x-www-form-urlencoded",
  104. },
  105. });
  106. console.log(googleRes.data);
  107. // 如果操作成功,退出循环
  108. if (googleRes.data.purchaseState == 0) {
  109. out_trade_no = googleRes.data.orderId;
  110. isCheck = true;
  111. break;
  112. }
  113. } catch (error) {
  114. // 捕获请求中的错误
  115. if (error.response) {
  116. // 请求已发出,服务器用状态码响应
  117. console.error(error.response.data);
  118. console.error(error.response.status);
  119. console.error(error.response.headers);
  120. } else if (error.request) {
  121. // 请求已发出但没有收到响应
  122. // 这通常是网络错误
  123. console.error(error.request);
  124. } else {
  125. // 在设置请求时出现错误
  126. console.error("Error", error.message);
  127. }
  128. }
  129. currentRetry++;
  130. }
  131. if (!isCheck) {
  132. return ret;
  133. }
  134. let sendMsg = new Msg();
  135. sendMsg.connect(url, Account);
  136. let orgMemId = orderInfo.uid;
  137. let orgOderId = orderId;
  138. let orgProductId = orderInfo.product_id;
  139. let orgProductPrice = orderInfo.amount;
  140. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  141. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`;
  142. return new Promise((resolve) => {
  143. setTimeout(async () => {
  144. const send_res = sendMsg.CG_ASK_LOGIN(
  145. Account,
  146. 0,
  147. "",
  148. "cn",
  149. "CN",
  150. ctx.request.ip,
  151. params,
  152. orderInfo.server_id
  153. );
  154. if (!send_res) {
  155. resolve(ret);
  156. return;
  157. }
  158. try {
  159. let acknowledgeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:acknowledge?access_token=${access_token}`;
  160. const acknowledgeRes = await axios.post(
  161. acknowledgeUrl,
  162. {
  163. developerPayload: "",
  164. },
  165. {
  166. headers: {
  167. "Content-Type": "application/json",
  168. },
  169. }
  170. );
  171. } catch (error) {
  172. // 捕获请求中的错误
  173. if (error.response) {
  174. // 请求已发出,服务器用状态码响应
  175. console.error(error.response.data);
  176. console.error(error.response.status);
  177. console.error(error.response.headers);
  178. } else if (error.request) {
  179. // 请求已发出但没有收到响应
  180. // 这通常是网络错误
  181. console.error(error.request);
  182. } else {
  183. // 在设置请求时出现错误
  184. console.error("Error", error.message);
  185. }
  186. ret.msg = "请求第三方失败";
  187. resolve(ret);
  188. }
  189. try {
  190. let consumeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:consume?access_token=${access_token}`;
  191. const consumeRes = await axios.post(
  192. consumeUrl,
  193. {
  194. developerPayload: "",
  195. },
  196. {
  197. headers: {
  198. "Content-Type": "application/json",
  199. },
  200. }
  201. );
  202. } catch (error) {
  203. // 捕获请求中的错误
  204. if (error.response) {
  205. // 请求已发出,服务器用状态码响应
  206. console.error(error.response.data);
  207. console.error(error.response.status);
  208. console.error(error.response.headers);
  209. } else if (error.request) {
  210. // 请求已发出但没有收到响应
  211. // 这通常是网络错误
  212. console.error(error.request);
  213. } else {
  214. // 在设置请求时出现错误
  215. console.error("Error", error.message);
  216. }
  217. ret.msg = "请求第三方失败";
  218. resolve(ret);
  219. }
  220. logger.info("谷歌 pass :", { orderId: orderId });
  221. const update_time = formatDate(new Date());
  222. const res = await Order.updateOrderStats(
  223. orderId,
  224. 2,
  225. out_trade_no,
  226. update_time,
  227. orderInfo.uid
  228. );
  229. if (res.affectedRows <= 0) {
  230. logger.info(`订单${orderId} 发货失败`);
  231. ret.msg = "发货失败";
  232. resolve(ret);
  233. return;
  234. }
  235. ret.code = 1;
  236. ret.msg = "发货成功";
  237. resolve(ret);
  238. }, 1000);
  239. });
  240. };
  241. const appleCallPay = async (ctx) => {
  242. let ret = {
  243. code: 0,
  244. msg: "发货失败",
  245. };
  246. let data = ctx.request.body;
  247. logger.info("pay callback params:", { url: ctx.href, params: data });
  248. if (!data.purchaseToken || !data.orderId) {
  249. return ret;
  250. }
  251. let receipt_data = data.purchaseToken.replace(/ /g, "+");
  252. let orderId = data.orderId;
  253. let maxRetries = 5;
  254. let currentRetry = 0;
  255. let isCheck = false;
  256. let out_trade_no = orderId;
  257. const res = await Order.updateOrderToken(orderId, receipt_data, "apple");
  258. // 使用 while 循环进行重试
  259. while (currentRetry < maxRetries) {
  260. try {
  261. const apiData = {
  262. "receipt-data": receipt_data,
  263. };
  264. const response = await axios.post(IosUrl, apiData, {
  265. headers: {
  266. "Content-Type": "application/json",
  267. },
  268. });
  269. logger.info(`苹果返回的状态:${response.data.status}`);
  270. // 如果操作成功,退出循环
  271. if (response.data.status == 0) {
  272. isCheck = true;
  273. break;
  274. }
  275. } catch (error) {
  276. // 如果操作失败,记录错误并继续尝试
  277. console.log(error);
  278. }
  279. currentRetry++;
  280. }
  281. if (!isCheck) {
  282. logger.info(`票据验证失败!`);
  283. ret.msg = `票据验证失败!`;
  284. return ret;
  285. }
  286. const orderInfo = (await Order.getOrder(orderId))[0];
  287. if (!orderInfo) {
  288. logger.info(`订单${orderId}不存在`);
  289. ret.msg = `订单${orderId}不存在`;
  290. return ret;
  291. }
  292. if (orderInfo.status == 2) {
  293. logger.info(`订单${orderId}已经重复发货`);
  294. ret.code = 1;
  295. ret.msg = `订单${orderId}已经重复发货`;
  296. return ret;
  297. }
  298. let url = await getServerList(orderInfo.server_id, "default");
  299. if (!url) {
  300. logger.info(`区服id错误: serverId ${orderInfo.server_id}`);
  301. ret.msg = `区服id错误: serverId ${orderInfo.server_id}`;
  302. return ret;
  303. }
  304. let sendMsg = new Msg();
  305. sendMsg.connect(url, Account);
  306. let orgMemId = orderInfo.uid;
  307. let orgOderId = orderId;
  308. let orgProductId = orderInfo.product_id;
  309. let orgProductPrice = orderInfo.amount;
  310. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  311. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`;
  312. return new Promise((resolve) => {
  313. setTimeout(async () => {
  314. logger.info(`订单${orderId}通知游戏发货开始`);
  315. const send_res = sendMsg.CG_ASK_LOGIN(
  316. Account,
  317. 0,
  318. "",
  319. "cn",
  320. "CN",
  321. ctx.request.ip,
  322. params,
  323. orderInfo.server_id
  324. );
  325. if (!send_res) {
  326. resolve(ret);
  327. return;
  328. }
  329. logger.info(`订单${orderId}通知游戏发货结束`);
  330. const update_time = formatDate(new Date());
  331. const res = await Order.updateOrderStats(
  332. orderId,
  333. 2,
  334. out_trade_no,
  335. update_time,
  336. orderInfo.uid
  337. );
  338. if (res.affectedRows <= 0) {
  339. logger.info(`订单${orderId} 发货失败`);
  340. ret.msg = "发货失败";
  341. resolve(ret);
  342. return;
  343. }
  344. ret.code = 1;
  345. ret.msg = "发货成功";
  346. resolve(ret);
  347. }, 1000);
  348. });
  349. };
  350. //qucik发货
  351. //扩展参数格式为${serverId};${productId}
  352. const CallPayQuick = async (ctx) => {
  353. let ret = {
  354. code: 0,
  355. msg: "发货失败",
  356. };
  357. //sdk参数
  358. let md5Key = "q97tvr1yqpum8y2h7d0mhvosffrplwlm";
  359. let callbackKey = "77410735093537425113205417841669";
  360. let data = ctx.request.body;
  361. logger.info("qucik 回调参数", { data: data });
  362. let md5Sign = data.md5Sign;
  363. let ntData = data.nt_data;
  364. let verifySignData = QuickAsy.getSign(data, md5Key);
  365. if (verifySignData != md5Sign) {
  366. logger.error("quick 调用md5Sign错误", {
  367. $verifySignData: verifySignData,
  368. md5Sign: md5Sign,
  369. });
  370. return ret;
  371. }
  372. let xmlData = QuickAsy.decode(ntData, callbackKey);
  373. const result = await new Promise((resolve, reject) => {
  374. parseString(xmlData, (err, result) => {
  375. if (err) {
  376. return reject(err);
  377. }
  378. resolve(result);
  379. });
  380. });
  381. const message = (result as any).quicksdk_message.message[0];
  382. const channel = message.channel[0];
  383. const orgMemId = message.channel_uid[0];
  384. const channelOrder = message.channel_order[0];
  385. const orderId = message.game_order[0]; //cp单号
  386. const orderNo = message.order_no[0]; //sdk订单号
  387. const payTime = message.pay_time[0];
  388. const orgProductPrice = message.amount[0]; //充值成功的金额
  389. const status = message.status[0]; //0成功
  390. const extrasParams = message.extras_params[0];
  391. if (status == 1) {
  392. return;
  393. }
  394. const orderInfo = (await Order.getOrder(orderId))[0];
  395. if (!orderInfo) {
  396. logger.info(`订单${orderId}不存在`);
  397. ret.msg = `订单${orderId}不存在`;
  398. return ret;
  399. }
  400. let serverId = orderInfo.server_id; //区服id
  401. let orgProductId = orderInfo.product_id; //商品id
  402. if (orderInfo.status == 2) {
  403. logger.info(`订单${orderId}已经重复发货`);
  404. ret.code = 1;
  405. ret.msg = `订单${orderId}已经重复发货`;
  406. return ret;
  407. }
  408. let url = await getServerList(serverId, "default");
  409. if (!url) {
  410. logger.info(`区服id错误: serverId ${serverId}`);
  411. ret.msg = `区服id错误: serverId ${serverId}`;
  412. return ret;
  413. }
  414. // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  415. let sendMsg = new Msg();
  416. sendMsg.connect(url, Account);
  417. logger.info(`订单${orderId} ${url}`);
  418. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  419. let params = `{"account":"${orgMemId}","order":"${orderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`;
  420. return new Promise((resolve) => {
  421. setTimeout(async () => {
  422. console.log("这个消息将在3秒后打印出来");
  423. const send_res = sendMsg.CG_ASK_LOGIN(
  424. Account,
  425. 0,
  426. "",
  427. "cn",
  428. "CN",
  429. ctx.request.ip,
  430. params,
  431. serverId
  432. );
  433. if (!send_res) {
  434. resolve(ret);
  435. return;
  436. }
  437. const update_time = formatDate(new Date());
  438. const res = await Order.updateOrderStats(
  439. orderId,
  440. 2,
  441. orderNo,
  442. update_time,
  443. orderInfo.uid
  444. );
  445. if (res.affectedRows <= 0) {
  446. logger.info(`订单${orderId} 发货失败`);
  447. ret.msg = "发货失败";
  448. resolve(ret);
  449. return;
  450. }
  451. ret.code = 1;
  452. ret.msg = "发货成功";
  453. resolve(ret);
  454. }, 1000);
  455. });
  456. };
  457. const CallPay360 = async (ctx) => {
  458. let ret = {
  459. code: 0,
  460. msg: "发货失败",
  461. };
  462. let data = ctx.request.body;
  463. let sign = data.sign;
  464. let serverId = data.serverId;
  465. let orderId = data.cpOrder;
  466. let out_trade_no = data.orderId;
  467. logger.info("pay callback params:", { url: ctx.href, params: data });
  468. const orderInfo = (await Order.getOrder(orderId))[0];
  469. if (!orderInfo) {
  470. logger.info(`订单${orderId}不存在`);
  471. ret.msg = `订单${orderId}不存在`;
  472. return ret;
  473. }
  474. if (orderInfo.status == 2) {
  475. logger.info(`订单${orderId}已经重复发货`);
  476. ret.code = 1;
  477. ret.msg = `订单${orderId}已经重复发货`;
  478. return ret;
  479. }
  480. //签名参数
  481. let signData = Object.keys(data)
  482. .sort()
  483. .filter((key) => key !== "sign");
  484. let signStr = signData.map((key) => `${data[key]}`).join("");
  485. signStr += AppSecret360;
  486. let newSign = CryptoJS.MD5(signStr).toString();
  487. console.log("signStr:", signStr);
  488. console.log("newSign:", newSign);
  489. if (sign != newSign) {
  490. logger.info(`签名错误: 签名串 ${signStr} newSign ${newSign} sign ${sign}`);
  491. ret.msg = `签名错误`;
  492. return ret;
  493. }
  494. let url = await getServerList(serverId, "default");
  495. if (!url) {
  496. logger.info(`区服id错误: serverId ${serverId}`);
  497. ret.msg = `区服id错误: serverId ${serverId}`;
  498. return ret;
  499. }
  500. //发货
  501. // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  502. let sendMsg = new Msg();
  503. sendMsg.connect(url, Account);
  504. logger.info(`订单${orderId} ${url}`);
  505. let orgMemId = data.uid;
  506. let orgOderId = data.cpOrder;
  507. let orgProductId = orderInfo.product_id;
  508. let orgExt = data.cText;
  509. let orgProductPrice = data.skuPrice;
  510. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  511. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`;
  512. return new Promise((resolve) => {
  513. setTimeout(async () => {
  514. console.log("这个消息将在3秒后打印出来");
  515. const send_res = sendMsg.CG_ASK_LOGIN(
  516. Account,
  517. 0,
  518. "",
  519. "cn",
  520. "CN",
  521. ctx.request.ip,
  522. params,
  523. serverId
  524. );
  525. if (!send_res) {
  526. resolve(ret);
  527. return;
  528. }
  529. const update_time = formatDate(new Date());
  530. const res = await Order.updateOrderStats(
  531. orderId,
  532. 2,
  533. out_trade_no,
  534. update_time,
  535. orderInfo.uid
  536. );
  537. if (res.affectedRows <= 0) {
  538. logger.info(`订单${orderId} 发货失败`);
  539. ret.msg = "发货失败";
  540. resolve(ret);
  541. return;
  542. }
  543. ret.code = 1;
  544. ret.msg = "发货成功";
  545. resolve(ret);
  546. }, 1000);
  547. });
  548. };
  549. const testGoogleCallPay = async (ctx) => {
  550. let ret = {
  551. code: 0,
  552. msg: "消费失败",
  553. };
  554. let data = ctx.request.body;
  555. logger.info("pay callback params:", { url: ctx.href, params: data });
  556. const redisClient = ctx.redis.client;
  557. let access_token = await redisClient.get("access_token");
  558. if (!access_token) {
  559. console.log("请求api获取token");
  560. const apiData = {
  561. grant_type: "refresh_token",
  562. client_id: ClientId,
  563. client_secret: ClientSecret,
  564. refresh_token: RefreshToken,
  565. };
  566. const response = await axios.post(
  567. "https://accounts.google.com/o/oauth2/token",
  568. apiData,
  569. {
  570. headers: {
  571. "Content-Type": "application/x-www-form-urlencoded",
  572. },
  573. }
  574. );
  575. logger.info("token params:", { data: response.data, params: apiData });
  576. if (!response.data.access_token) {
  577. return ret;
  578. }
  579. access_token = response.data.access_token;
  580. await redisClient.set("access_token", response.data.access_token);
  581. await redisClient.expire("access_token", 1800);
  582. }
  583. if (!access_token) {
  584. return ret;
  585. }
  586. let googleToken = data.purchaseToken;
  587. let product_id = data.orderId;
  588. const productId = ProductId + product_id;
  589. let apiUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}?access_token=${access_token}`;
  590. let maxRetries = 5;
  591. let currentRetry = 0;
  592. let isCheck = false;
  593. // 使用 while 循环进行重试
  594. while (currentRetry < maxRetries) {
  595. try {
  596. // // 尝试执行的操作
  597. const googleRes = await axios.get(apiUrl, {
  598. headers: {
  599. "Content-Type": "application/x-www-form-urlencoded",
  600. },
  601. });
  602. console.log(googleRes.data);
  603. // 如果操作成功,退出循环
  604. if (googleRes.data.purchaseState == 0) {
  605. isCheck = true;
  606. break;
  607. }
  608. } catch (error) {
  609. // 如果操作失败,记录错误并继续尝试
  610. console.log(error);
  611. }
  612. currentRetry++;
  613. }
  614. if (!isCheck) {
  615. return ret;
  616. }
  617. return new Promise(async (resolve) => {
  618. let acknowledgeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:acknowledge?access_token=${access_token}`;
  619. console.log(acknowledgeUrl);
  620. const acknowledgeRes = await axios.post(
  621. acknowledgeUrl,
  622. {
  623. developerPayload: "",
  624. },
  625. {
  626. headers: {
  627. "Content-Type": "application/json",
  628. },
  629. }
  630. );
  631. let consumeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:consume?access_token=${access_token}`;
  632. const consumeRes = await axios.post(
  633. consumeUrl,
  634. {
  635. developerPayload: "",
  636. },
  637. {
  638. headers: {
  639. "Content-Type": "application/json",
  640. },
  641. }
  642. );
  643. ret.code = 1;
  644. ret.msg = "发货成功";
  645. resolve(ret);
  646. });
  647. };
  648. const checkVersion = async (ctx) => {
  649. let ret = {
  650. code: 0,
  651. msg: "无需更新",
  652. url: "",
  653. };
  654. let data = ctx.request.body;
  655. let version = data.version;
  656. let tag = data.tag || "default";
  657. logger.info("checkVersion params:", { url: ctx.href, params: data });
  658. const versionInfo = (await Version.getGameVersion(tag))[0];
  659. if (!versionInfo) {
  660. return ret;
  661. }
  662. if (compareVersions(versionInfo.version, version) === 1) {
  663. if (versionInfo.download_url) {
  664. ret.code = 1;
  665. ret.msg = "需要更新";
  666. ret.url = versionInfo.download_url;
  667. }
  668. }
  669. return ret;
  670. };
  671. function splitString(input: string, separator: string): string[] {
  672. return input.split(separator);
  673. }
  674. function extractIPAddresses(text: string): string[] {
  675. // 正则表达式匹配IP地址
  676. const ipRegex = /(?:(?:\d{1,3}\.){3}\d{1,3})/g;
  677. // 使用正则表达式执行匹配并返回结果
  678. return text.match(ipRegex) || [];
  679. }
  680. //验证账号
  681. const checkUserToken = async (ctx) => {
  682. let ret = {
  683. code: 0,
  684. msg: "请求失败",
  685. };
  686. let ip = ctx.request.ip;
  687. if (ip.startsWith("::ffff:")) {
  688. ip = ip.substring("::ffff:".length);
  689. }
  690. let {
  691. uid,
  692. channel_id,
  693. device_no,
  694. reg_device,
  695. device_type,
  696. device_model,
  697. device_version,
  698. system_version,
  699. } = ctx.request.body;
  700. const create_time = formatDate(new Date());
  701. const accountInfo = (await User.checkAccountIsExist(uid))[0];
  702. let accountRes = null;
  703. let res = null;
  704. if (!accountInfo) {
  705. accountRes = await User.createAccount(
  706. uid,
  707. channel_id,
  708. ip,
  709. device_no,
  710. reg_device,
  711. create_time
  712. );
  713. if (accountRes.affectedRows <= 0) {
  714. ret.msg = "添加账户失败";
  715. return ret;
  716. }
  717. }
  718. res = await User.logAccountLogin(
  719. uid,
  720. ip,
  721. device_type,
  722. device_no,
  723. device_model,
  724. device_version,
  725. system_version,
  726. create_time
  727. );
  728. if (res.affectedRows <= 0) {
  729. ret.msg = "添加日志失败";
  730. return ret;
  731. }
  732. ret.code = 1;
  733. ret.msg = "请求成功";
  734. return ret;
  735. };
  736. class ApiController {
  737. async createOrder(ctx) {
  738. let { uid, level, amount, role_id, role_name, product_id, server_id } =
  739. ctx.request.body;
  740. logger.info("create params:", { params: ctx.request.body });
  741. if (
  742. !product_id ||
  743. !server_id ||
  744. !role_name ||
  745. !role_id ||
  746. !amount ||
  747. !uid
  748. ) {
  749. ctx.body = { code: -1, message: "参数错误,创建订单失败!!", data: "" };
  750. return;
  751. }
  752. const orderId = generateOrderNumber(); // 生成一个长度为8的订单号
  753. const create_time = formatDate(new Date());
  754. const res = await Order.createOrder(
  755. orderId,
  756. uid,
  757. level,
  758. amount,
  759. role_id,
  760. role_name,
  761. product_id,
  762. server_id,
  763. create_time
  764. );
  765. if (res.affectedRows > 0) {
  766. ctx.body = { code: 0, message: "创建订单成功", data: orderId };
  767. } else {
  768. ctx.body = { code: -1, message: "创建订单失败", data: "" };
  769. }
  770. logger.info("创建订单返回结果:", { params: ctx.body });
  771. }
  772. async checkUserToken(ctx) {
  773. let data = ctx.request.body;
  774. let platform = "360"; // 默认360
  775. if (ctx.query.platform) {
  776. platform = ctx.query.platform;
  777. }
  778. if (data.platform) {
  779. platform = data.platform;
  780. }
  781. switch (platform) {
  782. case "360":
  783. var result = await checkUserToken(ctx);
  784. ctx.body = result;
  785. break;
  786. case "th":
  787. var result = await checkUserToken(ctx);
  788. ctx.body = result;
  789. break;
  790. case "quick":
  791. var result = await checkUserToken(ctx);
  792. ctx.body = result;
  793. break;
  794. default:
  795. ctx.body = {
  796. code: 0,
  797. msg: "渠道错误",
  798. };
  799. }
  800. }
  801. //quick登陆
  802. async quickUserLogin(ctx) {
  803. //sdk参数
  804. let productCode = "40202114039243214268433998697181";
  805. let data = ctx.request.body;
  806. let uid = data.uid;
  807. let token = data.token;
  808. let reqUrl =
  809. "http://checkuser.quickapi.net/v2/checkUserInfo?token=" +
  810. token +
  811. "&uid=" +
  812. uid +
  813. "product_code=" +
  814. productCode;
  815. logger.info("quick登陆验证请求", { params: data, url: reqUrl });
  816. const res = await axios.get(reqUrl);
  817. logger.info("quick req", { res: res.data });
  818. if (res.data == "1") {
  819. ctx.body = {
  820. code: 200,
  821. msg: "success",
  822. };
  823. } else {
  824. ctx.body = {
  825. code: 0,
  826. msg: "fail",
  827. };
  828. }
  829. }
  830. async callPay(ctx) {
  831. console.log(234234234);
  832. let data = ctx.request.body;
  833. let platform = "360"; // 默认360
  834. if (ctx.query.platform) {
  835. platform = ctx.query.platform;
  836. }
  837. if (data.platform) {
  838. platform = data.platform;
  839. }
  840. switch (platform) {
  841. case "google":
  842. var result = await googleCallPay(ctx);
  843. console.log("发货结果", result);
  844. ctx.body = result;
  845. break;
  846. case "apple":
  847. var result = await appleCallPay(ctx);
  848. console.log("发货结果", result);
  849. ctx.body = result;
  850. break;
  851. case "360":
  852. var result = await CallPay360(ctx);
  853. console.log("发货结果", result);
  854. ctx.body = result;
  855. break;
  856. // case 'testGoogle':
  857. // var result = await testGoogleCallPay(ctx)
  858. // console.log('发货结果', result)
  859. // ctx.body = result
  860. // break;
  861. case "quick":
  862. var result = await CallPayQuick(ctx);
  863. console.log("发货结果", result);
  864. if ((result as any).code == 1) {
  865. ctx.body = "SUCCESS";
  866. } else {
  867. ctx.body = "Fail";
  868. }
  869. break;
  870. default:
  871. ctx.body = {
  872. code: 0,
  873. msg: "渠道错误",
  874. };
  875. }
  876. }
  877. async checkVersion(ctx) {
  878. var result = await checkVersion(ctx);
  879. console.log("校验版本", result);
  880. ctx.body = result;
  881. }
  882. async getServerList(ctx) {
  883. let tag = ctx.query.tag || "default";
  884. const servers = await Server.getServerList(tag);
  885. let data = [];
  886. let ip = ctx.request.ip;
  887. if (ip.startsWith("::ffff:")) {
  888. ip = ip.substring("::ffff:".length);
  889. }
  890. logger.info("区服接口", { ip: ctx.request.ip });
  891. if (servers.length > 0) {
  892. servers.forEach(function (element) {
  893. let status = element.status;
  894. if ((status == 0 || status == 3) && element.white_list) {
  895. const list = element.white_list.split(",");
  896. if (list.length > 0) {
  897. if (list.includes(ip)) {
  898. status = 1;
  899. }
  900. }
  901. }
  902. data.push({
  903. id: element.id,
  904. name: element.name,
  905. ip: element.ip,
  906. port: element.port,
  907. tips: element.tips,
  908. status: status,
  909. });
  910. });
  911. }
  912. ctx.body = data;
  913. }
  914. async getAllServerList(ctx) {
  915. let tag = ctx.query.tag || "default";
  916. let ip = ctx.request.ip;
  917. if (ip.startsWith("::ffff:")) {
  918. ip = ip.substring("::ffff:".length);
  919. }
  920. logger.info("getAllServerList 区服接口", { ip: ctx.request.ip });
  921. const servers = await Server.getAllServerList(tag, ip);
  922. ctx.body = servers;
  923. }
  924. async enterServer(ctx) {
  925. let ret = {
  926. code: 0,
  927. msg: "请求失败",
  928. };
  929. let { uid, server_id } = ctx.request.body;
  930. let url = await getServerList(server_id, "default");
  931. if (!url) {
  932. ctx.body = {
  933. code: -1,
  934. message: `区服id错误: serverId ${server_id}`,
  935. data: "",
  936. };
  937. return;
  938. }
  939. logger.info("create params:", { params: ctx.request.body });
  940. if (!server_id || !uid) {
  941. ctx.body = { code: -1, message: "参数错误!!", data: "" };
  942. return;
  943. }
  944. const create_time = formatDate(new Date());
  945. const serverInfo = (await Server.checkEnterServerByUid(uid, server_id))[0];
  946. let res = null;
  947. if (serverInfo) {
  948. res = await Server.updateEnterServer(serverInfo.id, create_time);
  949. } else {
  950. res = await Server.enterServer(uid, server_id, create_time);
  951. }
  952. if (res.affectedRows > 0) {
  953. ctx.body = { code: 0, message: "请求成功", data: "" };
  954. } else {
  955. ctx.body = { code: -1, message: "请求失败", data: "" };
  956. }
  957. }
  958. async getLastServerList(ctx) {
  959. let { uid } = ctx.request.body;
  960. let tag = "default";
  961. let data = [];
  962. let isNewAccount = 1;
  963. let enterServerList = await Server.getEnterServerListByUid(uid);
  964. let ip = ctx.request.ip;
  965. if (ip.startsWith("::ffff:")) {
  966. ip = ip.substring("::ffff:".length);
  967. }
  968. logger.info("getLastServerList 区服接口", { ip: ctx.request.ip });
  969. if (enterServerList.length > 0) {
  970. isNewAccount = 0;
  971. // const servers = (await Server.getServerList(tag, 1))
  972. const servers = await Server.getAllServerList(tag, ip);
  973. enterServerList.forEach(function (element) {
  974. data.push({
  975. channel: "Thailand", //渠道固定
  976. minSid: 1, //最小服务器
  977. maxSid: servers.length, //最大服务器 这里会控制 服务器列表显示的数量
  978. isNewAccount: isNewAccount, //1为新号 会弹出用户协议
  979. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  980. sid: element.server_id || 1,
  981. id: element.server_id || 1,
  982. name: element.name || "1区",
  983. tips: element.tips || "",
  984. server: element.ip ? `ws://${element.ip}:${element.port}` : "",
  985. status: element.status || 0,
  986. });
  987. });
  988. } else {
  989. // const servers = (await Server.getServerList(tag, 1))
  990. const servers = await Server.getAllServerList(tag, ip);
  991. if (servers.length > 0) {
  992. const serverInfo = servers[servers.length - 1];
  993. data.push({
  994. channel: "Thailand", //渠道固定
  995. minSid: 1, //最小服务器
  996. maxSid: servers.length, //最大服务器 这里会控制 服务器列表显示的数量
  997. isNewAccount: isNewAccount, //1为新号 会弹出用户协议
  998. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  999. sid: serverInfo.id || 1,
  1000. id: serverInfo.id || 1,
  1001. name: serverInfo.name || "1区",
  1002. tips: serverInfo.tips || "",
  1003. server: serverInfo.ip
  1004. ? `ws://${serverInfo.ip}:${serverInfo.port}`
  1005. : "",
  1006. status: serverInfo.status || 0,
  1007. });
  1008. } else {
  1009. data.push({
  1010. channel: "Thailand", //渠道固定
  1011. minSid: 1, //最小服务器
  1012. maxSid: 10, //最大服务器 这里会控制 服务器列表显示的数量
  1013. isNewAccount: isNewAccount, //1为新号 会弹出用户协议
  1014. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  1015. sid: 1,
  1016. id: 1,
  1017. name: "1区",
  1018. tips: "",
  1019. server: "",
  1020. status: 0,
  1021. });
  1022. }
  1023. }
  1024. ctx.body = data;
  1025. }
  1026. async getNotice(ctx) {
  1027. let data = ctx.request.body;
  1028. let platform = "th";
  1029. if (ctx.query.platform) {
  1030. platform = ctx.query.platform;
  1031. }
  1032. let content = "";
  1033. let content_wh = "";
  1034. const system = await System.getSystemConfig();
  1035. if (system) {
  1036. system.forEach((element) => {
  1037. if (element.key == "content") {
  1038. content = element.value;
  1039. }
  1040. if (element.key == "content_wh") {
  1041. content_wh = element.value;
  1042. }
  1043. });
  1044. }
  1045. let notice_data = [
  1046. {
  1047. status: 1,
  1048. content: content,
  1049. content_wh: content_wh,
  1050. },
  1051. ];
  1052. if (notice_data[0].content == "") {
  1053. switch (platform) {
  1054. case "th":
  1055. notice_data = th_notice;
  1056. break;
  1057. case "360":
  1058. notice_data = notice;
  1059. break;
  1060. case "xky":
  1061. notice_data = xky_notice;
  1062. break;
  1063. default:
  1064. notice_data = notice;
  1065. }
  1066. }
  1067. ctx.body = notice_data;
  1068. }
  1069. async genCDK(ctx) {
  1070. /*
  1071. data = {
  1072. cnt : number -- 生成数量
  1073. useCnt : number -- 当前批次最大使用数量
  1074. serverList : string -- 区服列表Json字符串
  1075. itemList : string -- CDK对应物品列表Json字符串
  1076. }
  1077. */
  1078. let data = ctx.request.body;
  1079. await CDK.genCDK(
  1080. ctx,
  1081. data.cnt,
  1082. data.useCnt,
  1083. data.serverList,
  1084. data.itemList
  1085. );
  1086. ctx.body = {
  1087. code: 0,
  1088. msg: "success",
  1089. };
  1090. return;
  1091. }
  1092. async getCDK(ctx) {
  1093. let data = ctx.request.body;
  1094. let ret = await CDK.getCDK(ctx, data.batch);
  1095. if (ret.length <= 0) {
  1096. ctx.body = {
  1097. code: 1,
  1098. msg: "batch invalid",
  1099. };
  1100. return;
  1101. }
  1102. ctx.body = {
  1103. code: 0,
  1104. msg: ret,
  1105. };
  1106. }
  1107. async useCDK(ctx) {
  1108. let data = ctx.request.body;
  1109. let url = await getServerList(data.serverId, "default");
  1110. let err = "";
  1111. if (!url) {
  1112. ctx.body = {
  1113. code: 1,
  1114. msg: `区服id错误: serverId ${data.serverId}`,
  1115. };
  1116. err = "server id invalid";
  1117. }
  1118. let param: string = "";
  1119. // 验证CDK
  1120. if (err.length == 0) {
  1121. let batchInfo = await CDK.getCDKItemList(ctx, data.code);
  1122. if (batchInfo.length <= 0) {
  1123. err = "cdk not found";
  1124. } else {
  1125. err = await CDK.checkCDK(ctx, data.code, data.serverId);
  1126. param = JSON.stringify({
  1127. type: "UseCDK",
  1128. err: err,
  1129. batchInfo: batchInfo,
  1130. });
  1131. }
  1132. }
  1133. // 固定码
  1134. if (err == "cdk not found" || err == "server id invalid") {
  1135. param = JSON.stringify({
  1136. code: data.code,
  1137. type: "UseFixCDK",
  1138. });
  1139. }
  1140. // 测试是否可以调用过去
  1141. // 通知给服务器,发放道具
  1142. // "ws://43.143.193.23:18192"
  1143. // Msg.connect(url, Account);
  1144. try {
  1145. let sendMsg = new Msg();
  1146. sendMsg.connect(url, Account);
  1147. logger.info(`code ${data.code} id ${data.serverId} ${url}`);
  1148. new Promise((resolve) => {
  1149. setTimeout(async () => {
  1150. sendMsg.CG_TEST_PROTO(data.account, param);
  1151. CDK.useCDK(ctx, data.code);
  1152. }, 1000);
  1153. });
  1154. } catch (error) {
  1155. console.log(error);
  1156. }
  1157. ctx.body = {
  1158. code: 0,
  1159. msg: "success",
  1160. };
  1161. }
  1162. async validCDK(ctx) {
  1163. let data = ctx.request.body;
  1164. if (data.code.length == 10) {
  1165. let ret = await CDK.useCDK(ctx, data.code);
  1166. if (ret != "success") {
  1167. ctx.body = {
  1168. code: 1,
  1169. msg: ret,
  1170. };
  1171. return;
  1172. }
  1173. }
  1174. ctx.body = {
  1175. code: 0,
  1176. msg: "success",
  1177. };
  1178. }
  1179. // 维护服务器,踢掉所有玩家
  1180. async maintenance(ctx) {
  1181. let data = ctx.request.body;
  1182. let url = await getServerList(data.serverId, "default");
  1183. if (!url) {
  1184. ctx.body = {
  1185. code: 1,
  1186. msg: `区服id错误: serverId ${data.serverId}`,
  1187. };
  1188. return;
  1189. }
  1190. let param = JSON.stringify({
  1191. type: "kickAllUser",
  1192. });
  1193. // Msg.connect(url, Account);
  1194. let sendMsg = new Msg();
  1195. sendMsg.connect(url, Account);
  1196. new Promise((resolve) => {
  1197. setTimeout(async () => {
  1198. sendMsg.CG_TEST_PROTO("test", param);
  1199. }, 1000);
  1200. });
  1201. ctx.body = {
  1202. code: 0,
  1203. msg: "success",
  1204. };
  1205. }
  1206. async maintenanceAll(ctx) {
  1207. let data = ctx.request.body;
  1208. const servers = await Server.getServerList("default");
  1209. const serversId = []
  1210. servers.forEach(function (element) {
  1211. let url = "ws://" + element.ip + ":" + element.port;
  1212. if (!url) {
  1213. ctx.body = {
  1214. code: 1,
  1215. msg: `区服id错误: serverId ${element.id}`,
  1216. };
  1217. return;
  1218. }
  1219. serversId.push(element.id)
  1220. let param = JSON.stringify({
  1221. type: "kickAllUser",
  1222. });
  1223. // Msg.connect(url, Account);
  1224. let sendMsg = new Msg();
  1225. sendMsg.connect(url, Account);
  1226. new Promise((resolve) => {
  1227. setTimeout(async () => {
  1228. sendMsg.CG_TEST_PROTO("test", param);
  1229. }, 1000);
  1230. });
  1231. });
  1232. const res = await Server.updateServerStatus(
  1233. serversId,
  1234. 3
  1235. );
  1236. ctx.body = {
  1237. code: 0,
  1238. msg: "success",
  1239. };
  1240. }
  1241. async sendMail(ctx) {
  1242. let data = ctx.request.body;
  1243. let url = await getServerList(data.serverId, "default");
  1244. if (!url) {
  1245. ctx.body = {
  1246. code: 1,
  1247. msg: `区服id错误: serverId ${data.serverId}`,
  1248. };
  1249. return;
  1250. }
  1251. let param = JSON.stringify({
  1252. type: "sendMail",
  1253. mail: JSON.stringify({
  1254. uuid: data.uuid,
  1255. title: data.title,
  1256. content: data.content,
  1257. items: JSON.parse(data.items),
  1258. expire: data.expire,
  1259. }),
  1260. });
  1261. // Msg.connect(url, Account);
  1262. let sendMsg = new Msg();
  1263. sendMsg.connect(url, Account);
  1264. new Promise((resolve) => {
  1265. setTimeout(async () => {
  1266. sendMsg.CG_TEST_PROTO("test", param);
  1267. }, 1000);
  1268. });
  1269. ctx.body = {
  1270. code: 0,
  1271. msg: "success",
  1272. };
  1273. }
  1274. async sendAllMail(ctx) {
  1275. let data = ctx.request.body;
  1276. if (!data.server_list || data.server_list.length === 0) {
  1277. ctx.body = { code: -1, message: "区服不能为空", data: "" };
  1278. return;
  1279. }
  1280. logger.info("sendAllMail 接口请求 data:", { data: data });
  1281. const server_list = data.server_list;
  1282. const servers = await Server.getServerList("default");
  1283. const filteredServer = servers.filter(item => server_list.includes(item.id));
  1284. filteredServer.forEach(function (element) {
  1285. let url = "ws://" + element.ip + ":" + element.port;
  1286. if (!url) {
  1287. ctx.body = {
  1288. code: 1,
  1289. msg: `区服id错误: serverId ${element.server_id}`,
  1290. };
  1291. return;
  1292. }
  1293. let param = JSON.stringify({
  1294. type: "sendAllMail",
  1295. mail: JSON.stringify({
  1296. title: data.title,
  1297. content: data.content,
  1298. items: JSON.parse(data.items),
  1299. expire: data.expire,
  1300. }),
  1301. });
  1302. let sendMsg = new Msg();
  1303. sendMsg.connect(url, Account);
  1304. new Promise((resolve) => {
  1305. setTimeout(async () => {
  1306. sendMsg.CG_TEST_PROTO("test", param);
  1307. }, 1000);
  1308. });
  1309. });
  1310. ctx.body = {
  1311. code: 0,
  1312. msg: "success",
  1313. };
  1314. }
  1315. async useCDKV2(ctx) {
  1316. let body = ctx.request.body;
  1317. let data = {
  1318. code: body.code,
  1319. userId: body.account,
  1320. };
  1321. if (body.uuid) {
  1322. data.userId = body.uuid;
  1323. }
  1324. logger.info("api cdk 接口请求 data:", { data: data });
  1325. let serverUrl = await getServerList(body.serverId, "default");
  1326. let err = "";
  1327. if (!serverUrl) {
  1328. ctx.body = {
  1329. code: 1,
  1330. msg: `区服id错误: serverId ${body.serverId}`,
  1331. };
  1332. return;
  1333. }
  1334. let port = 8004;
  1335. // let host = extractIPAddresses(serverUrl)[0]
  1336. let host = "127.0.0.1";
  1337. let url = "http://" + host + ":" + port + "/api/giftCode/exchange";
  1338. try {
  1339. const response = await axios.post(url, data, {
  1340. headers: {
  1341. "Content-Type": "application/json",
  1342. },
  1343. });
  1344. let param: string = "";
  1345. logger.info("api cdk 接口返回 response:", { data: response.data });
  1346. if (response.data.code != 200) {
  1347. // 可能是固定码 ,游戏再去检测一下
  1348. param = JSON.stringify({
  1349. code: data.code,
  1350. type: "UseFixCDK",
  1351. });
  1352. } else {
  1353. const result = splitString(response.data.data, ";");
  1354. // 重构itemList
  1355. let itemList = Array();
  1356. for (let i = 0; i < result.length; i++) {
  1357. let elem = splitString(result[i], ":");
  1358. let output0 = parseInt(elem[0], 10);
  1359. let output1 = parseInt(elem[1], 10);
  1360. itemList.push([output0, output1]);
  1361. }
  1362. param = JSON.stringify({
  1363. type: "UseCDKV2",
  1364. itemList: itemList,
  1365. });
  1366. }
  1367. let sendMsg = new Msg();
  1368. sendMsg.connect(serverUrl, Account);
  1369. logger.info("api cdk 发送服务器 param:", { param: param });
  1370. new Promise((resolve) => {
  1371. setTimeout(async () => {
  1372. sendMsg.CG_TEST_PROTO(body.account, param);
  1373. }, 1000);
  1374. });
  1375. } catch (error) {
  1376. console.log(error);
  1377. }
  1378. ctx.body = {
  1379. code: 0,
  1380. msg: "success",
  1381. };
  1382. }
  1383. }
  1384. module.exports = new ApiController();