PayOrder.js 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const API = require('../../lib/API')
  2. const db = require('../../plugin/DataBase/db')
  3. const Redis = require('../../plugin/DataBase/Redis')
  4. const { BaseStdResponse } = require('../../BaseStdResponse')
  5. const AccessControl = require('../../lib/AccessControl')
  6. const { buildPaymentSession } = require('../../lib/OrderPayment')
  7. const { createPaymentAttempt, generateGatewayOrderNo } = require('../../lib/OrderPaymentAttempt')
  8. const { enqueueOrderPaymentCheck } = require('../../plugin/mq/orderPaymentWorker')
  9. class PayOrder extends API {
  10. constructor() {
  11. super()
  12. this.setPath('/Order/Pay')
  13. this.setMethod('POST')
  14. }
  15. async onRequest(req, res) {
  16. const { uuid, session, orderId, pay_type } = req.body
  17. if ([uuid, session, orderId, pay_type].some(v => v === '' || v === null || v === undefined)) {
  18. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  19. }
  20. if (!await AccessControl.checkSession(uuid, session)) {
  21. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
  22. }
  23. try {
  24. const normalizedPayType = String(pay_type).trim()
  25. const rows = await db.query(`
  26. SELECT o.orderId, o.price, o.state, g.name
  27. FROM orders o
  28. LEFT JOIN goods g ON o.goods_id = g.id
  29. WHERE o.orderId = ? AND o.create_user = ?
  30. LIMIT 1
  31. `, [orderId, uuid])
  32. const order = rows?.[0]
  33. if (!order) {
  34. return res.json({ ...BaseStdResponse.ERR, msg: '订单不存在' })
  35. }
  36. if (Number(order.state) !== 0) {
  37. return res.json({ ...BaseStdResponse.ERR, msg: '仅待付款订单可更换支付方式' })
  38. }
  39. const gatewayOrderNo = generateGatewayOrderNo(order.orderId)
  40. const payment = await buildPaymentSession({
  41. orderId: order.orderId,
  42. gatewayOrderNo,
  43. payType: normalizedPayType,
  44. goodsName: order.name,
  45. price: order.price,
  46. deviceType: req.headers['device-type']
  47. })
  48. const updateRes = await db.query(
  49. 'UPDATE orders SET pay_type = ? WHERE orderId = ? AND create_user = ? AND state = 0',
  50. [normalizedPayType, orderId, uuid]
  51. )
  52. if (!updateRes?.affectedRows) {
  53. return res.json({ ...BaseStdResponse.ERR, msg: '订单状态已变更,请刷新后重试' })
  54. }
  55. await createPaymentAttempt({
  56. orderId: order.orderId,
  57. payType: normalizedPayType,
  58. gatewayOrderNo
  59. })
  60. await Redis.set(`payData:${orderId}`, JSON.stringify(payment.payData), { EX: 300 })
  61. try {
  62. await enqueueOrderPaymentCheck(orderId)
  63. } catch (error) {
  64. this.logger.error(`投递订单支付检查消息失败,订单号:${orderId},错误:${error.stack || error}`)
  65. }
  66. return res.json({ ...BaseStdResponse.OK, id: orderId, pay: payment })
  67. } catch (error) {
  68. this.logger.error(`发起订单支付失败,订单号:${orderId},错误:${error.stack || error}`)
  69. return res.json({ ...BaseStdResponse.ERR, msg: error.message || '发起支付失败,请稍后重试' })
  70. }
  71. }
  72. }
  73. module.exports.PayOrder = PayOrder