ApiController.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import Msg from '../msg'; // 确保路径是正确的
  2. const servers = require('../serverList.json')
  3. const CryptoJS = require("crypto-js");
  4. const crypto = require('crypto');
  5. const AppSecret = "67db708fdc1b3f61341db6e8551143c0"
  6. const AppKey = "57afbdc608db9aa423e1b15b321d7de0"
  7. const Account = "H1EqhbpA80jt0Jw6Q3T2"//ws请求密钥
  8. const Order = require('../model/OrderModel')
  9. const logger = require('../log')
  10. var orderList = []
  11. //根据区服id获取地址
  12. const getServerList = (serverId) => {
  13. for (let i = 0; i < servers.length; i++) {
  14. if (servers[i].id == serverId) {
  15. return 'ws://' + servers[i].ip + ':' + servers[i].port
  16. }
  17. }
  18. }
  19. const callPay = async (ctx) => {
  20. let ret = {
  21. code: 0,
  22. msg: '发货失败'
  23. }
  24. let data = ctx.request.body
  25. let sign = data.sign
  26. let serverId = data.serverID
  27. let orderId = data.cpOrderID
  28. logger.info("pay callback params:", { "url": ctx.href, "params": data })
  29. const orderInfo = (await Order.getOrder(orderId))[0]
  30. if (!orderInfo) {
  31. logger.info(`订单${orderId}不存在`)
  32. ret.msg = `订单${orderId}不存在`
  33. return ret
  34. }
  35. if (orderInfo.status == 2) {
  36. logger.info(`订单${orderId}已经重复发货`)
  37. ret.msg = `订单${orderId}已经重复发货`
  38. return ret
  39. }
  40. //签名参数
  41. let signData = Object.keys(data).filter(key => key !== 'sign');
  42. let signStr = signData.map(key => `${data[key]}`).join('');
  43. signStr += AppSecret
  44. let newSign = CryptoJS.MD5(signStr).toString();
  45. console.log("signStr:", signStr)
  46. console.log("newSign:", newSign)
  47. if (sign != newSign) {
  48. logger.info(`签名错误: 签名串 ${signStr} newSign ${newSign} sign ${sign}`)
  49. ret.msg = `签名错误`
  50. return ret
  51. }
  52. let url = getServerList(serverId)
  53. if (!url) {
  54. logger.info(`区服id错误: serverId ${serverId}`)
  55. ret.msg = `区服id错误: serverId ${serverId}`
  56. return ret
  57. }
  58. //发货
  59. // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
  60. Msg.connect(url, Account);
  61. let orgMemId = data.uid
  62. let orgOderId = data.cpOrder
  63. let orgProductId = data.orderId
  64. let orgExt = data.cText
  65. let orgProductPrice = data.skuPrice
  66. // 在适当的时机,调用 CG_ASK_LOGIN 方法
  67. let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
  68. return new Promise((resolve) => {
  69. setTimeout(async () => {
  70. console.log("这个消息将在3秒后打印出来");
  71. Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN', ctx.request.ip, params);
  72. const update_time = formatDate(new Date())
  73. const res = await Order.updateOrderStats(
  74. orderId,
  75. 2,
  76. update_time
  77. );
  78. if (res.affectedRows <= 0) {
  79. logger.info(`订单${orderId} 发货失败`)
  80. ret.msg = '发货失败'
  81. resolve(ret);
  82. }
  83. ret.code = 1
  84. ret.msg = '发货成功'
  85. resolve(ret);
  86. }, 1000);
  87. });
  88. }
  89. //验证账号
  90. const checkUserToken = async (ctx) => {
  91. let data = ctx.request.body
  92. //签名参数
  93. let signData = Object.keys(data).filter(key => key !== 'sign');
  94. let signStr = signData.map(key => `${data[key]}`).join('');
  95. signStr += AppKey
  96. let newSign = CryptoJS.MD5(signStr).toString();
  97. console.log("signStr:", signStr)
  98. console.log("newSign:", newSign)
  99. if (data.sign != newSign) {
  100. console.log("签名错误:", signStr, newSign, data.sign)
  101. return false
  102. }
  103. return data.sign
  104. }
  105. const generateOrderNumber = () => {
  106. const date = new Date();
  107. const year = date.getFullYear();
  108. const month = (date.getMonth() + 1).toString().padStart(2, '0');
  109. const day = date.getDate().toString().padStart(2, '0');
  110. const hours = date.getHours().toString().padStart(2, '0');
  111. const minutes = date.getMinutes().toString().padStart(2, '0');
  112. const seconds = date.getSeconds().toString().padStart(2, '0');
  113. const dateString = `${year}${month}${day}${hours}${minutes}${seconds}`;
  114. const randomString1 = Math.floor(Math.random() * 1090000000800)
  115. .toString()
  116. .slice(0, 4);
  117. const randomString2 = Math.floor(Math.random() * 1090000000800)
  118. .toString()
  119. .slice(0, 4);
  120. return "CP" + dateString + randomString1 + randomString2;
  121. }
  122. const formatDate = (date: Date) => {
  123. const year = date.getFullYear();
  124. const month = (date.getMonth() + 1).toString().padStart(2, '0');
  125. const day = date.getDate().toString().padStart(2, '0');
  126. return `${year}-${month}-${day}`;
  127. }
  128. class ApiController {
  129. async createOrder(ctx) {
  130. let {
  131. uid,
  132. level,
  133. amount,
  134. role_id,
  135. role_name,
  136. product_id
  137. } = ctx.request.body
  138. logger.info("create params:", { "params": ctx.request.body })
  139. const orderId = generateOrderNumber(); // 生成一个长度为8的订单号
  140. const create_time = formatDate(new Date())
  141. const res = await Order.createOrder(
  142. orderId,
  143. uid,
  144. level,
  145. amount,
  146. role_id,
  147. role_name,
  148. product_id,
  149. create_time
  150. );
  151. if (res.affectedRows > 0) {
  152. ctx.body = { code: 0, message: '创建订单成功', data: orderId }
  153. } else {
  154. ctx.body = { code: -1, message: '创建订单失败', data: '' }
  155. }
  156. }
  157. async checkUserToken(ctx) {
  158. const result = await checkUserToken(ctx);
  159. let data = { "status": false, "sign": "" }
  160. if (result) {
  161. data.status = true
  162. data.sign = result
  163. }
  164. ctx.body = data
  165. }
  166. async callPay(ctx) {
  167. var result = await callPay(ctx)
  168. console.log('发货结果', result)
  169. ctx.body = result
  170. }
  171. async getServerList(ctx) {
  172. let id = ctx.query.id
  173. console.log(getServerList(id))
  174. ctx.body = servers
  175. }
  176. }
  177. module.exports = new ApiController()