ApiController.ts 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. import Msg from '../utils/msg'; // 确保路径是正确的
  2. import {
  3. RefreshToken,
  4. PackageName,
  5. ProductId,
  6. IosUrl,
  7. SandboxIosUrl,
  8. Account,
  9. ClientSecret,
  10. ClientId,
  11. AppSecret360
  12. } from '../config/thirdParams'
  13. import {
  14. compareVersions,
  15. generateOrderNumber,
  16. formatDate,
  17. getServerList
  18. } from '../utils/common'
  19. const CryptoJS = require("crypto-js");
  20. const Order = require('../model/OrderModel')
  21. const Server = require('../model/ServerModel')
  22. const Version = require('../model/VersionModel')
  23. const CDK = require("../model/CDK")
  24. const notice = require("../json/notice.json")
  25. const th_notice = require("../json/th_notice.json")
  26. const logger = require('../utils/log')
  27. const axios = require('axios');
  28. const googleCallPay = async (ctx) => {
  29. let ret = {
  30. code: 0,
  31. msg: '发货失败'
  32. }
  33. let data = ctx.request.body
  34. let orderId = data.orderId
  35. let googleToken = data.purchaseToken
  36. let out_trade_no = ''
  37. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  38. const res = await Order.updateOrderToken(
  39. orderId,
  40. googleToken,
  41. 'google',
  42. );
  43. const redisClient = ctx.redis.client;
  44. let access_token = await redisClient.get('access_token');
  45. if (!access_token) {
  46. console.log('请求api获取token')
  47. const apiData = {
  48. "grant_type": "refresh_token",
  49. "client_id": ClientId,
  50. "client_secret": ClientSecret,
  51. "refresh_token": RefreshToken
  52. }
  53. const response = await axios.post('https://accounts.google.com/o/oauth2/token', apiData, {
  54. headers: {
  55. 'Content-Type': 'application/x-www-form-urlencoded'
  56. }
  57. });
  58. logger.info("token params:", { "data": response.data, "params": apiData })
  59. if (!response.data.access_token) {
  60. return ret
  61. }
  62. access_token = response.data.access_token
  63. await redisClient.set('access_token', response.data.access_token);
  64. await redisClient.expire('access_token', 1800);
  65. }
  66. if (!access_token) {
  67. return ret;
  68. }
  69. const orderInfo = (await Order.getOrder(orderId))[0]
  70. if (!orderInfo) {
  71. logger.info(`订单${orderId}不存在`)
  72. ret.msg = `订单${orderId}不存在`
  73. return ret
  74. }
  75. if (orderInfo.status == 2) {
  76. logger.info(`订单${orderId}已经重复发货`)
  77. ret.code = 1
  78. ret.msg = `订单${orderId}已经重复发货`
  79. return ret
  80. }
  81. let url = await getServerList(orderInfo.server_id, 'default')
  82. if (!url) {
  83. logger.info(`区服id错误: serverId ${orderInfo.server_id}`)
  84. ret.msg = `区服id错误: serverId ${orderInfo.server_id}`
  85. return ret
  86. }
  87. const productId = ProductId + orderInfo.product_id
  88. let apiUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}?access_token=${access_token}`
  89. let maxRetries = 5;
  90. let currentRetry = 0;
  91. let isCheck = false;
  92. // 使用 while 循环进行重试
  93. while (currentRetry < maxRetries) {
  94. try {
  95. // // 尝试执行的操作
  96. const googleRes = await axios.get(apiUrl, {
  97. headers: {
  98. 'Content-Type': 'application/x-www-form-urlencoded'
  99. }
  100. })
  101. console.log(googleRes.data)
  102. // 如果操作成功,退出循环
  103. if (googleRes.data.purchaseState == 0) {
  104. out_trade_no = googleRes.data.orderId
  105. isCheck = true
  106. break;
  107. }
  108. } catch (error) {
  109. // 如果操作失败,记录错误并继续尝试
  110. console.log(error)
  111. }
  112. currentRetry++;
  113. }
  114. if (!isCheck) {
  115. return ret;
  116. }
  117. let sendMsg = new Msg()
  118. sendMsg.connect(url, Account);
  119. let orgMemId = orderInfo.uid
  120. let orgOderId = orderId
  121. let orgProductId = orderInfo.product_id
  122. let orgProductPrice = orderInfo.amount
  123. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  124. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  125. return new Promise((resolve) => {
  126. setTimeout(async () => {
  127. const send_res = sendMsg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  128. if (!send_res) {
  129. resolve(ret);
  130. return;
  131. }
  132. let acknowledgeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:acknowledge?access_token=${access_token}`
  133. console.log(acknowledgeUrl)
  134. const acknowledgeRes = await axios.post(acknowledgeUrl,
  135. {
  136. developerPayload: ""
  137. }
  138. ,
  139. {
  140. headers: {
  141. 'Content-Type': 'application/json'
  142. }
  143. })
  144. let consumeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:consume?access_token=${access_token}`
  145. const consumeRes = await axios.post(consumeUrl,
  146. {
  147. developerPayload: ""
  148. }
  149. ,
  150. {
  151. headers: {
  152. 'Content-Type': 'application/json'
  153. }
  154. })
  155. logger.info("pass :", { "orderId": orderId })
  156. const update_time = formatDate(new Date())
  157. const res = await Order.updateOrderStats(
  158. orderId,
  159. 2,
  160. out_trade_no,
  161. update_time
  162. );
  163. if (res.affectedRows <= 0) {
  164. logger.info(`订单${orderId} 发货失败`)
  165. ret.msg = '发货失败'
  166. resolve(ret);
  167. return;
  168. }
  169. ret.code = 1
  170. ret.msg = '发货成功'
  171. resolve(ret);
  172. }, 1000);
  173. });
  174. }
  175. const appleCallPay = async (ctx) => {
  176. let ret = {
  177. code: 0,
  178. msg: '发货失败'
  179. }
  180. let data = ctx.request.body
  181. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  182. if (!data.purchaseToken || !data.orderId) {
  183. return ret;
  184. }
  185. let receipt_data = data.purchaseToken.replace(/ /g, '+')
  186. let orderId = data.orderId
  187. let maxRetries = 5;
  188. let currentRetry = 0;
  189. let isCheck = false;
  190. let out_trade_no = orderId
  191. // 使用 while 循环进行重试
  192. while (currentRetry < maxRetries) {
  193. try {
  194. const apiData = {
  195. "receipt-data": receipt_data,
  196. }
  197. const response = await axios.post(IosUrl, apiData, {
  198. headers: {
  199. 'Content-Type': 'application/json'
  200. }
  201. });
  202. logger.info(`苹果返回的状态:${response.data.status}`)
  203. // 如果操作成功,退出循环
  204. if (response.data.status == 0) {
  205. isCheck = true
  206. break;
  207. }
  208. } catch (error) {
  209. // 如果操作失败,记录错误并继续尝试
  210. console.log(error)
  211. }
  212. currentRetry++;
  213. }
  214. if (!isCheck) {
  215. logger.info(`票据验证失败!`)
  216. ret.msg = `票据验证失败!`
  217. return ret;
  218. }
  219. const orderInfo = (await Order.getOrder(orderId))[0]
  220. if (!orderInfo) {
  221. logger.info(`订单${orderId}不存在`)
  222. ret.msg = `订单${orderId}不存在`
  223. return ret
  224. }
  225. if (orderInfo.status == 2) {
  226. logger.info(`订单${orderId}已经重复发货`)
  227. ret.code = 1
  228. ret.msg = `订单${orderId}已经重复发货`
  229. return ret
  230. }
  231. let url = await getServerList(orderInfo.server_id, 'default')
  232. if (!url) {
  233. logger.info(`区服id错误: serverId ${orderInfo.server_id}`)
  234. ret.msg = `区服id错误: serverId ${orderInfo.server_id}`
  235. return ret
  236. }
  237. let sendMsg = new Msg()
  238. sendMsg.connect(url, Account);
  239. let orgMemId = orderInfo.uid
  240. let orgOderId = orderId
  241. let orgProductId = orderInfo.product_id
  242. let orgProductPrice = orderInfo.amount
  243. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  244. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  245. return new Promise((resolve) => {
  246. setTimeout(async () => {
  247. logger.info(`订单${orderId}通知游戏发货开始`)
  248. const send_res = sendMsg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  249. if (!send_res) {
  250. resolve(ret);
  251. return;
  252. }
  253. logger.info(`订单${orderId}通知游戏发货结束`)
  254. const update_time = formatDate(new Date())
  255. const res = await Order.updateOrderStats(
  256. orderId,
  257. 2,
  258. out_trade_no,
  259. update_time
  260. );
  261. if (res.affectedRows <= 0) {
  262. logger.info(`订单${orderId} 发货失败`)
  263. ret.msg = '发货失败'
  264. resolve(ret);
  265. return;
  266. }
  267. ret.code = 1
  268. ret.msg = '发货成功'
  269. resolve(ret);
  270. }, 1000);
  271. });
  272. }
  273. const CallPay360 = async (ctx) => {
  274. let ret = {
  275. code: 0,
  276. msg: '发货失败'
  277. }
  278. let data = ctx.request.body
  279. let sign = data.sign
  280. let serverId = data.serverId
  281. let orderId = data.cpOrder
  282. let out_trade_no = data.orderId
  283. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  284. const orderInfo = (await Order.getOrder(orderId))[0]
  285. if (!orderInfo) {
  286. logger.info(`订单${orderId}不存在`)
  287. ret.msg = `订单${orderId}不存在`
  288. return ret
  289. }
  290. if (orderInfo.status == 2) {
  291. logger.info(`订单${orderId}已经重复发货`)
  292. ret.code = 1
  293. ret.msg = `订单${orderId}已经重复发货`
  294. return ret
  295. }
  296. //签名参数
  297. let signData = Object.keys(data).sort().filter(key => key !== 'sign');
  298. let signStr = signData.map(key => `${data[key]}`).join('');
  299. signStr += AppSecret360
  300. let newSign = CryptoJS.MD5(signStr).toString();
  301. console.log("signStr:", signStr)
  302. console.log("newSign:", newSign)
  303. if (sign != newSign) {
  304. logger.info(`签名错误: 签名串 ${signStr} newSign ${newSign} sign ${sign}`)
  305. ret.msg = `签名错误`
  306. return ret
  307. }
  308. let url = await getServerList(serverId, 'default')
  309. if (!url) {
  310. logger.info(`区服id错误: serverId ${serverId}`)
  311. ret.msg = `区服id错误: serverId ${serverId}`
  312. return ret
  313. }
  314. //发货
  315. // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  316. let sendMsg = new Msg()
  317. sendMsg.connect(url, Account);
  318. logger.info(`订单${orderId} ${url}`)
  319. let orgMemId = data.uid
  320. let orgOderId = data.cpOrder
  321. let orgProductId = orderInfo.product_id
  322. let orgExt = data.cText
  323. let orgProductPrice = data.skuPrice
  324. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  325. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  326. return new Promise((resolve) => {
  327. setTimeout(async () => {
  328. console.log("这个消息将在3秒后打印出来");
  329. const send_res = sendMsg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  330. if (!send_res) {
  331. resolve(ret);
  332. return;
  333. }
  334. const update_time = formatDate(new Date())
  335. const res = await Order.updateOrderStats(
  336. orderId,
  337. 2,
  338. out_trade_no,
  339. update_time
  340. );
  341. if (res.affectedRows <= 0) {
  342. logger.info(`订单${orderId} 发货失败`)
  343. ret.msg = '发货失败'
  344. resolve(ret);
  345. return;
  346. }
  347. ret.code = 1
  348. ret.msg = '发货成功'
  349. resolve(ret);
  350. }, 1000);
  351. });
  352. }
  353. const testGoogleCallPay = async (ctx) => {
  354. let ret = {
  355. code: 0,
  356. msg: '消费失败'
  357. }
  358. let data = ctx.request.body
  359. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  360. const redisClient = ctx.redis.client;
  361. let access_token = await redisClient.get('access_token');
  362. if (!access_token) {
  363. console.log('请求api获取token')
  364. const apiData = {
  365. "grant_type": "refresh_token",
  366. "client_id": ClientId,
  367. "client_secret": ClientSecret,
  368. "refresh_token": RefreshToken
  369. }
  370. const response = await axios.post('https://accounts.google.com/o/oauth2/token', apiData, {
  371. headers: {
  372. 'Content-Type': 'application/x-www-form-urlencoded'
  373. }
  374. });
  375. logger.info("token params:", { "data": response.data, "params": apiData })
  376. if (!response.data.access_token) {
  377. return ret
  378. }
  379. access_token = response.data.access_token
  380. await redisClient.set('access_token', response.data.access_token);
  381. await redisClient.expire('access_token', 1800);
  382. }
  383. if (!access_token) {
  384. return ret;
  385. }
  386. let googleToken = data.purchaseToken
  387. let product_id = data.orderId
  388. const productId = ProductId + product_id
  389. let apiUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}?access_token=${access_token}`
  390. let maxRetries = 5;
  391. let currentRetry = 0;
  392. let isCheck = false;
  393. // 使用 while 循环进行重试
  394. while (currentRetry < maxRetries) {
  395. try {
  396. // // 尝试执行的操作
  397. const googleRes = await axios.get(apiUrl, {
  398. headers: {
  399. 'Content-Type': 'application/x-www-form-urlencoded'
  400. }
  401. })
  402. console.log(googleRes.data)
  403. // 如果操作成功,退出循环
  404. if (googleRes.data.purchaseState == 0) {
  405. isCheck = true
  406. break;
  407. }
  408. } catch (error) {
  409. // 如果操作失败,记录错误并继续尝试
  410. console.log(error)
  411. }
  412. currentRetry++;
  413. }
  414. if (!isCheck) {
  415. return ret;
  416. }
  417. return new Promise(async (resolve) => {
  418. let acknowledgeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:acknowledge?access_token=${access_token}`
  419. console.log(acknowledgeUrl)
  420. const acknowledgeRes = await axios.post(acknowledgeUrl,
  421. {
  422. developerPayload: ""
  423. }
  424. ,
  425. {
  426. headers: {
  427. 'Content-Type': 'application/json'
  428. }
  429. })
  430. let consumeUrl = `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${PackageName}/purchases/products/${productId}/tokens/${googleToken}:consume?access_token=${access_token}`
  431. const consumeRes = await axios.post(consumeUrl,
  432. {
  433. developerPayload: ""
  434. }
  435. ,
  436. {
  437. headers: {
  438. 'Content-Type': 'application/json'
  439. }
  440. })
  441. ret.code = 1
  442. ret.msg = '发货成功'
  443. resolve(ret);
  444. });
  445. }
  446. const checkVersion = async (ctx) => {
  447. let ret = {
  448. code: 0,
  449. msg: '无需更新',
  450. url: '',
  451. }
  452. let data = ctx.request.body
  453. let version = data.version
  454. let tag = data.tag || 'default'
  455. logger.info("checkVersion params:", { "url": ctx.href, "params": data })
  456. const versionInfo = (await Version.getGameVersion(tag))[0]
  457. if (!versionInfo) {
  458. return ret
  459. }
  460. if (compareVersions(versionInfo.version, version) === 1) {
  461. if (versionInfo.download_url) {
  462. ret.code = 1
  463. ret.msg = '需要更新'
  464. ret.url = versionInfo.download_url
  465. }
  466. }
  467. return ret
  468. }
  469. //验证账号
  470. const checkUserToken = async (ctx) => {
  471. }
  472. class ApiController {
  473. async createOrder(ctx) {
  474. let {
  475. uid,
  476. level,
  477. amount,
  478. role_id,
  479. role_name,
  480. product_id,
  481. server_id
  482. } = ctx.request.body
  483. logger.info("create params:", { "params": ctx.request.body })
  484. if (!product_id || !server_id || !role_name || !role_id || !amount || !uid) {
  485. ctx.body = { code: -1, message: '参数错误,创建订单失败!!', data: '' }
  486. return
  487. }
  488. const orderId = generateOrderNumber(); // 生成一个长度为8的订单号
  489. const create_time = formatDate(new Date())
  490. const res = await Order.createOrder(
  491. orderId,
  492. uid,
  493. level,
  494. amount,
  495. role_id,
  496. role_name,
  497. product_id,
  498. server_id,
  499. create_time
  500. );
  501. if (res.affectedRows > 0) {
  502. ctx.body = { code: 0, message: '创建订单成功', data: orderId }
  503. } else {
  504. ctx.body = { code: -1, message: '创建订单失败', data: '' }
  505. }
  506. logger.info("创建订单返回结果:", { "params": ctx.body })
  507. }
  508. async checkUserToken(ctx) {
  509. // const result = await checkUserToken(ctx);
  510. // let data = { "status": false, "sign": "" }
  511. // if (result) {
  512. // data.status = true
  513. // data.sign = result
  514. // }
  515. // ctx.body = data
  516. }
  517. async callPay(ctx) {
  518. let data = ctx.request.body
  519. let platform = data.platform || '360'
  520. switch (platform) {
  521. case 'google':
  522. var result = await googleCallPay(ctx)
  523. console.log('发货结果', result)
  524. ctx.body = result
  525. break;
  526. case 'apple':
  527. var result = await appleCallPay(ctx)
  528. console.log('发货结果', result)
  529. ctx.body = result
  530. break;
  531. case '360':
  532. var result = await CallPay360(ctx)
  533. console.log('发货结果', result)
  534. ctx.body = result
  535. break;
  536. // case 'testGoogle':
  537. // var result = await testGoogleCallPay(ctx)
  538. // console.log('发货结果', result)
  539. // ctx.body = result
  540. // break;
  541. default:
  542. ctx.body = {
  543. code: 0,
  544. msg: '渠道错误'
  545. }
  546. }
  547. }
  548. async checkVersion(ctx) {
  549. var result = await checkVersion(ctx)
  550. console.log('校验版本', result)
  551. ctx.body = result
  552. }
  553. async getServerList(ctx) {
  554. let tag = ctx.query.tag || 'default'
  555. const servers = (await Server.getServerList(tag))
  556. let data = []
  557. let ip = ctx.request.ip
  558. if (ip.startsWith('::ffff:')) {
  559. ip = ip.substring('::ffff:'.length);
  560. }
  561. logger.info("区服接口", { "ip": ctx.request.ip })
  562. if (servers.length > 0) {
  563. servers.forEach(function (element) {
  564. let status = element.status
  565. if ((status == 0 || status == 3) && element.white_list) {
  566. const list = element.white_list.split(",");
  567. if (list.length > 0) {
  568. if (list.includes(ip)) {
  569. status = 1
  570. }
  571. }
  572. }
  573. data.push({
  574. "id": element.id,
  575. "name": element.name,
  576. "ip": element.ip,
  577. "port": element.port,
  578. "tips": element.tips,
  579. "status": status,
  580. })
  581. });
  582. }
  583. ctx.body = data
  584. }
  585. async getAllServerList(ctx) {
  586. let tag = ctx.query.tag || 'default'
  587. let ip = ctx.request.ip
  588. if (ip.startsWith('::ffff:')) {
  589. ip = ip.substring('::ffff:'.length);
  590. }
  591. logger.info("getAllServerList 区服接口", { "ip": ctx.request.ip })
  592. const servers = (await Server.getAllServerList(tag, ip))
  593. ctx.body = servers
  594. }
  595. async enterServer(ctx) {
  596. let ret = {
  597. code: 0,
  598. msg: '请求失败'
  599. }
  600. let {
  601. uid,
  602. server_id
  603. } = ctx.request.body
  604. let url = await getServerList(server_id, 'default')
  605. if (!url) {
  606. ctx.body = { code: -1, message: `区服id错误: serverId ${server_id}`, data: '' }
  607. return
  608. }
  609. logger.info("create params:", { "params": ctx.request.body })
  610. if (!server_id || !uid) {
  611. ctx.body = { code: -1, message: '参数错误!!', data: '' }
  612. return
  613. }
  614. const create_time = formatDate(new Date())
  615. const serverInfo = (await Server.checkEnterServerByUid(uid, server_id))[0]
  616. let res = null
  617. if (serverInfo) {
  618. res = await Server.updateEnterServer(
  619. serverInfo.id,
  620. create_time
  621. );
  622. } else {
  623. res = await Server.enterServer(
  624. uid,
  625. server_id,
  626. create_time
  627. );
  628. }
  629. if (res.affectedRows > 0) {
  630. ctx.body = { code: 0, message: '请求成功', data: '' }
  631. } else {
  632. ctx.body = { code: -1, message: '请求失败', data: '' }
  633. }
  634. }
  635. async getLastServerList(ctx) {
  636. let {
  637. uid,
  638. } = ctx.request.body
  639. let tag = 'default'
  640. let data = [];
  641. let isNewAccount = 1
  642. let enterServerList = (await Server.getEnterServerListByUid(uid))
  643. if (enterServerList.length > 0) {
  644. isNewAccount = 0
  645. enterServerList.forEach(function (element) {
  646. data.push({
  647. "channel": "Thailand", //渠道固定
  648. "minSid": 1, //最小服务器
  649. "maxSid": 10, //最大服务器 这里会控制 服务器列表显示的数量
  650. "isNewAccount": isNewAccount, //1为新号 会弹出用户协议
  651. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  652. "sid": element.server_id || 1,
  653. "id": element.server_id || 1,
  654. "name": element.name || "1区",
  655. "tips": element.tips || "",
  656. "server": element.ip ? `ws://${element.ip}:${element.port}` : "",
  657. "status": element.status || 0,
  658. })
  659. });
  660. } else {
  661. const servers = (await Server.getServerList(tag, 1))
  662. if(servers.length > 0){
  663. const serverInfo = servers[servers.length - 1]
  664. data.push({
  665. "channel": "Thailand", //渠道固定
  666. "minSid": 1, //最小服务器
  667. "maxSid": 10, //最大服务器 这里会控制 服务器列表显示的数量
  668. "isNewAccount": isNewAccount, //1为新号 会弹出用户协议
  669. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  670. "sid": serverInfo.id || 1,
  671. "id": serverInfo.id || 1,
  672. "name": serverInfo.name || "1区",
  673. "tips": serverInfo.tips || "",
  674. "server": serverInfo.ip ? `ws://${serverInfo.ip}:${serverInfo.port}` : "",
  675. "status": serverInfo.status || 0,
  676. })
  677. }else{
  678. data.push({
  679. "channel": "Thailand", //渠道固定
  680. "minSid": 1, //最小服务器
  681. "maxSid": 10, //最大服务器 这里会控制 服务器列表显示的数量
  682. "isNewAccount": isNewAccount, //1为新号 会弹出用户协议
  683. //以下是最近登陆的服务器 (不可为空 如果没有参数可以填最后一个区)
  684. "sid": 1,
  685. "id": 1,
  686. "name": "1区",
  687. "tips": "",
  688. "server": "",
  689. "status": 0,
  690. })
  691. }
  692. }
  693. ctx.body = data
  694. }
  695. async getNotice(ctx) {
  696. let data = ctx.request.body
  697. let platform = data.platform || 'th'
  698. switch (platform) {
  699. case 'th':
  700. ctx.body = th_notice
  701. break;
  702. case '360':
  703. ctx.body = notice
  704. break;
  705. default:
  706. ctx.body = notice
  707. }
  708. }
  709. async genCDK(ctx) {
  710. /*
  711. data = {
  712. cnt : number -- 生成数量
  713. useCnt : number -- 当前批次最大使用数量
  714. serverList : string -- 区服列表Json字符串
  715. itemList : string -- CDK对应物品列表Json字符串
  716. }
  717. */
  718. let data = ctx.request.body
  719. await CDK.genCDK(ctx, data.cnt, data.useCnt, data.serverList, data.itemList)
  720. ctx.body = {
  721. code: 0,
  722. msg: 'success'
  723. }
  724. return
  725. }
  726. async getCDK(ctx) {
  727. let data = ctx.request.body
  728. let ret = await CDK.getCDK(ctx, data.batch)
  729. if (ret.length <= 0) {
  730. ctx.body = {
  731. code: 1,
  732. msg: "batch invalid"
  733. }
  734. return
  735. }
  736. ctx.body = {
  737. code: 0,
  738. msg: ret
  739. }
  740. }
  741. async useCDK(ctx) {
  742. let data = ctx.request.body
  743. let url = await getServerList(data.serverId, 'default')
  744. let err = ""
  745. if (!url) {
  746. ctx.body = {
  747. code: 1,
  748. msg: `区服id错误: serverId ${data.serverId}`
  749. }
  750. err = "server id invalid"
  751. }
  752. let param: string = ""
  753. // 验证CDK
  754. if (err.length == 0) {
  755. let batchInfo = await CDK.getCDKItemList(ctx, data.code)
  756. if (batchInfo.length <= 0) {
  757. err = "cdk not found"
  758. } else {
  759. err = await CDK.checkCDK(ctx, data.code, data.serverId)
  760. param = JSON.stringify({
  761. type: "UseCDK",
  762. err: err,
  763. batchInfo: batchInfo
  764. })
  765. }
  766. }
  767. // 固定码
  768. if (err == "cdk not found" || err == "server id invalid") {
  769. param = JSON.stringify({
  770. code: data.code,
  771. type: "UseFixCDK"
  772. })
  773. }
  774. // 测试是否可以调用过去
  775. // 通知给服务器,发放道具
  776. // "ws://43.143.193.23:18192"
  777. // Msg.connect(url, Account);
  778. try {
  779. let sendMsg = new Msg()
  780. sendMsg.connect(url, Account);
  781. logger.info(`code ${data.code} id ${data.serverId} ${url}`)
  782. new Promise((resolve) => {
  783. setTimeout(async () => {
  784. sendMsg.CG_TEST_PROTO(data.account, param)
  785. }, 1000);
  786. });
  787. } catch (error) {
  788. console.log(error)
  789. }
  790. ctx.body = {
  791. code: 0,
  792. msg: "success"
  793. }
  794. }
  795. async validCDK(ctx) {
  796. let data = ctx.request.body
  797. if (data.code.length == 10) {
  798. let ret = await CDK.useCDK(ctx, data.code)
  799. if (ret != "success") {
  800. ctx.body = {
  801. code: 1,
  802. msg: ret
  803. }
  804. return
  805. }
  806. }
  807. ctx.body = {
  808. code: 0,
  809. msg: "success"
  810. }
  811. }
  812. // 维护服务器,踢掉所有玩家
  813. async maintenance(ctx) {
  814. let data = ctx.request.body
  815. let url = await getServerList(data.serverId, 'default')
  816. if (!url) {
  817. ctx.body = {
  818. code: 1,
  819. msg: `区服id错误: serverId ${data.serverId}`
  820. }
  821. return
  822. }
  823. let param = JSON.stringify({
  824. type: "kickAllUser"
  825. })
  826. // Msg.connect(url, Account);
  827. let sendMsg = new Msg()
  828. sendMsg.connect(url, Account);
  829. new Promise((resolve) => {
  830. setTimeout(async () => {
  831. sendMsg.CG_TEST_PROTO("test", param)
  832. }, 1000);
  833. });
  834. ctx.body = {
  835. code: 0,
  836. msg: "success"
  837. }
  838. }
  839. async sendMail(ctx) {
  840. let data = ctx.request.body
  841. let url = await getServerList(data.serverId, 'default')
  842. if (!url) {
  843. ctx.body = {
  844. code: 1,
  845. msg: `区服id错误: serverId ${data.serverId}`
  846. }
  847. return
  848. }
  849. let param = JSON.stringify({
  850. type: "sendMail",
  851. mail: JSON.stringify({
  852. uuid: data.uuid,
  853. title: data.title,
  854. content: data.content,
  855. items: JSON.parse(data.items),
  856. expire: data.expire
  857. })
  858. })
  859. // Msg.connect(url, Account);
  860. let sendMsg = new Msg()
  861. sendMsg.connect(url, Account);
  862. new Promise((resolve) => {
  863. setTimeout(async () => {
  864. sendMsg.CG_TEST_PROTO("test", param)
  865. }, 1000);
  866. });
  867. ctx.body = {
  868. code: 0,
  869. msg: "success"
  870. }
  871. }
  872. }
  873. module.exports = new ApiController()