CreateOrder.js 4.7 KB

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