CreateOrder.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const API = require("../../lib/API.js")
  2. const db = require("../../plugin/DataBase/db.js")
  3. const { BaseStdResponse } = require("../../BaseStdResponse.js")
  4. const AccessControl = require("../../lib/AccessControl.js")
  5. const crypto = require('crypto')
  6. const config = require('../../config.json')
  7. function generateOrderId() {
  8. const now = new Date()
  9. const pad = (n, w = 2) => n.toString().padStart(w, '0')
  10. return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}`
  11. + `${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`
  12. + `${pad(now.getMilliseconds(), 3)}`
  13. }
  14. function generatePaymentSign(params, key) {
  15. const sorted = Object.keys(params).sort();
  16. const query = sorted.map(k => `${k}=${params[k]}`).join('&') + `&key=${key}`;
  17. return crypto.createHash('md5').update(query, 'utf8').digest('hex');
  18. }
  19. class CreateOrder extends API {
  20. constructor() {
  21. super()
  22. this.setPath('/Order/CreateOrder')
  23. this.setMethod('POST')
  24. }
  25. async onRequest(req, res) {
  26. const { uuid, session, goods_id, pay_type } = req.body
  27. if ([uuid, session, goods_id, pay_type].some(v => v === '' || v === null || v === undefined)) {
  28. return res.json({
  29. ...BaseStdResponse.MISSING_PARAMETER,
  30. endpoint: 1513126
  31. })
  32. }
  33. const sessionValid = await AccessControl.checkSession(uuid, session)
  34. if (!sessionValid) {
  35. return res.status(401).json({
  36. ...BaseStdResponse.ACCESS_DENIED
  37. })
  38. }
  39. try {
  40. // 查询商品信息
  41. const goodsSql = 'SELECT name, price, num, state FROM goods WHERE id = ?'
  42. const goodsRows = await db.query(goodsSql, [goods_id])
  43. if (!goodsRows || goodsRows.length !== 1) {
  44. return res.json({
  45. ...BaseStdResponse.ERR,
  46. msg: '商品不存在',
  47. endpoint: 1513126
  48. })
  49. }
  50. const goods = goodsRows[0]
  51. if (goods.num < 1 || goods.state !== 1) {
  52. return res.json({
  53. ...BaseStdResponse.ERR,
  54. msg: '商品已下架或库存不足',
  55. endpoint: 1513126
  56. })
  57. }
  58. const createTime = new Date().getTime()
  59. const orderId = generateOrderId()
  60. const insertSql = `
  61. INSERT INTO orders (orderId, create_user, create_time, goods_id, price, pay_type)
  62. VALUES (?, ?, ?, ?, ?, ?)
  63. `
  64. const insertParams = [orderId, uuid, createTime, goods_id, goods.price, pay_type]
  65. const result = await db.query(insertSql, insertParams)
  66. const updateSql = 'UPDATE goods SET num = num - 1 WHERE id = ?'
  67. await db.query(updateSql, [goods_id])
  68. if (result && result.affectedRows > 0) {
  69. const paymentConfig = config.pay
  70. const payParams = {
  71. pid: paymentConfig.pid,
  72. type: pay_type,
  73. out_trade_no: orderId,
  74. notify_url: config.url + '/Order/CallBack',
  75. return_url: paymentConfig.return_url,
  76. name: goods.name,
  77. money: goods.price.toFixed(2),
  78. sitename: paymentConfig.sitename
  79. }
  80. const sign = generatePaymentSign(payParams, paymentConfig.key);
  81. payParams.sign = sign
  82. payParams.sign_type = 'MD5'
  83. // 构造支付URL
  84. const queryString = new URLSearchParams(payParams).toString();
  85. const payUrl = `${paymentConfig.url}?${queryString}`;
  86. return res.json({
  87. ...BaseStdResponse.OK,
  88. id: orderId,
  89. payUrl
  90. })
  91. } else {
  92. return res.json({
  93. ...BaseStdResponse.ERR,
  94. msg: '创建订单失败!请联系客服',
  95. endpoint: 7894378
  96. })
  97. }
  98. } catch (err) {
  99. this.logger.error(`创建订单失败!${err.stack}`)
  100. return res.json({
  101. ...BaseStdResponse.ERR,
  102. msg: "创建订单失败!请联系客服",
  103. })
  104. }
  105. }
  106. }
  107. module.exports.CreateOrder = CreateOrder