CallBack.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. const rawParams = {
  25. money, name, out_trade_no, pid, trade_no, trade_status, type
  26. }
  27. const sortedKeys = Object.keys(rawParams).sort()
  28. const preSignStr = sortedKeys.map(key => `${key}=${rawParams[key]}`).join('&') + `&key=${PAYMENT_KEY}`
  29. const localSign = crypto.createHash('md5').update(preSignStr, 'utf8').digest('hex')
  30. if (localSign !== sign)
  31. return res.json({
  32. ...BaseStdResponse.ERR,
  33. msg: '签名验证失败'
  34. })
  35. // 判断支付状态
  36. if (trade_status !== 'TRADE_SUCCESS') {
  37. const sql = 'UPDATE orders SET \`state\` = 2, pay_id = ? WHERE orderId = ?'
  38. await db.query(sql, [trade_no, out_trade_no])
  39. }
  40. try {
  41. // 更新订单状态
  42. const sql = 'UPDATE orders SET \`state\` = 1, pay_type = ?, pay_id = ? WHERE orderId = ? AND \`state\` = 0'
  43. const result = await db.query(sql, [type, trade_no, out_trade_no])
  44. if (result.affectedRows > 0) {
  45. return res.send('success')
  46. } else {
  47. return res.send('订单不存在或已处理')
  48. }
  49. } catch (err) {
  50. this.logger.error(`支付回调异常:${err.stack}`)
  51. return res.send('服务器错误')
  52. }
  53. }
  54. }
  55. module.exports.CallBack = CallBack