CallBack.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. const API = require("../../lib/API.js")
  2. const db = require("../../plugin/DataBase/db.js")
  3. const { BaseStdResponse } = require("../../BaseStdResponse.js")
  4. const config = require('../../config.json')
  5. const crypto = require("crypto")
  6. const PAYMENT_KEY = config.pay.key
  7. class CallBack extends API {
  8. constructor() {
  9. super()
  10. this.setPath('/Order/CallBack')
  11. this.setMethod('GET')
  12. }
  13. async onRequest(req, res) {
  14. const {
  15. pid, trade_no, out_trade_no, type, name, money,
  16. trade_status, sign, sign_type
  17. } = req.query
  18. // 参数校验
  19. if ([pid, trade_no, out_trade_no, type, name, money, trade_status, sign, sign_type].some(v => v === undefined)) {
  20. return res.json({
  21. ...BaseStdResponse.MISSING_PARAMETER
  22. })
  23. }
  24. // 签名校验
  25. const rawParams = {
  26. money, name, out_trade_no, pid, trade_no, trade_status, type
  27. }
  28. const sortedKeys = Object.keys(rawParams).sort()
  29. const preSignStr = sortedKeys.map(key => `${key}=${rawParams[key]}`).join('&') + PAYMENT_KEY
  30. const localSign = crypto.createHash('md5').update(preSignStr, 'utf8').digest('hex')
  31. if (localSign.toLowerCase() !== sign.toLowerCase()) {
  32. this.logger.error(`签名校验失败,订单号:${out_trade_no}`)
  33. return res.send('签名验证失败')
  34. }
  35. // 支付未成功,标记为失败
  36. if (trade_status !== 'TRADE_SUCCESS') {
  37. const sql = 'UPDATE orders SET state = 3, pay_id = ? WHERE orderId = ?'
  38. await db.query(sql, [trade_no, out_trade_no])
  39. return res.send('fail')
  40. }
  41. try {
  42. // 更新订单状态为已支付(state=1)
  43. const time = new Date().getTime()
  44. let sql = 'UPDATE orders SET state = 1, pay_type = ?, pay_id = ?, pay_time = ? WHERE orderId = ? AND state = 0'
  45. const result = await db.query(sql, [type, trade_no, time, out_trade_no])
  46. if (result.affectedRows > 0) {
  47. // 查询订单与商品信息
  48. sql = `
  49. SELECT
  50. g.lepao_count,
  51. g.ic_count,
  52. g.vip,
  53. a.create_user
  54. FROM
  55. orders a
  56. LEFT JOIN
  57. goods g
  58. ON
  59. a.goods_id = g.id
  60. WHERE
  61. a.orderId = ?
  62. `
  63. const rows = await db.query(sql, [out_trade_no])
  64. if (!rows || rows.length !== 1) {
  65. this.logger.error(`订单商品信息异常,订单号:${out_trade_no}`)
  66. await db.query('UPDATE orders SET state = 4 WHERE orderId = ?', [out_trade_no])
  67. return res.send('fail')
  68. }
  69. const { lepao_count, ic_count, vip, create_user } = rows[0]
  70. // 更新用户剩余次数
  71. sql = 'UPDATE users SET lepao_count = lepao_count + ?, ic_count = ic_count + ?, vip = ? WHERE uuid = ?'
  72. const updateUser = await db.query(sql, [lepao_count, ic_count, vip, create_user])
  73. if (!updateUser || updateUser.affectedRows !== 1) {
  74. this.logger.error(`更新用户失败,UUID: ${create_user}`)
  75. await db.query('UPDATE orders SET state = 4 WHERE orderId = ?', [out_trade_no])
  76. return res.send('fail')
  77. }
  78. sql = 'UPDATE orders SET state = 2 WHERE orderId = ?'
  79. await db.query(sql, [out_trade_no])
  80. return res.send('success')
  81. } else {
  82. this.logger.warn(`订单不存在或已处理,订单号:${out_trade_no}`)
  83. return res.send('订单不存在或已处理')
  84. }
  85. } catch (err) {
  86. this.logger.error(`支付回调处理异常:${err.stack}`)
  87. return res.send('服务器错误')
  88. }
  89. }
  90. }
  91. module.exports.CallBack = CallBack