Browse Source

更新订单处理逻辑

Pchen0 11 months ago
parent
commit
a7218e62e4
2 changed files with 96 additions and 13 deletions
  1. 86 3
      apis/Order/CreateOrder.js
  2. 10 10
      config.json

+ 86 - 3
apis/Order/CreateOrder.js

@@ -18,7 +18,7 @@ function generateOrderId() {
 function generatePaymentSign(params, key) {
 function generatePaymentSign(params, key) {
     const sorted = Object.keys(params).sort()
     const sorted = Object.keys(params).sort()
     const query = sorted.map(k => `${k}=${params[k]}`).join('&') + key
     const query = sorted.map(k => `${k}=${params[k]}`).join('&') + key
-    
+
     return crypto.createHash('md5').update(query, 'utf8').digest('hex')
     return crypto.createHash('md5').update(query, 'utf8').digest('hex')
 }
 }
 
 
@@ -28,7 +28,7 @@ function generatePaymentSign(params, key) {
 //         const res = await axios.post(endpoint, {order_no, type: 1})
 //         const res = await axios.post(endpoint, {order_no, type: 1})
 
 
 //     } catch (error) {
 //     } catch (error) {
-        
+
 //     }
 //     }
 // }
 // }
 
 
@@ -119,7 +119,7 @@ class CreateOrder extends API {
                     EX: 300
                     EX: 300
                 })
                 })
 
 
-                return res.json({
+                res.json({
                     ...BaseStdResponse.OK,
                     ...BaseStdResponse.OK,
                     id: orderId,
                     id: orderId,
                     pay: {
                     pay: {
@@ -129,6 +129,89 @@ class CreateOrder extends API {
                 })
                 })
 
 
                 // 定时器轮询订单状态
                 // 定时器轮询订单状态
+                try {
+                    // 定时轮询订单状态,最多持续5分钟(300秒),每次间隔5秒
+                    const MAX_RETRIES = 60 // 5分钟 / 5秒
+                    const DELAY = 5000 // 5秒
+
+                    const queryUrl = `${paymentConfig.url}/api.php?act=order&pid=${paymentConfig.pid}&key=${paymentConfig.key}&out_trade_no=${orderId}`
+
+                    const pollOrderStatus = async (retry = 0) => {
+                        if (retry >= MAX_RETRIES) {
+                            this.logger.info(`订单超时未支付,订单号:${orderId}`)
+                            await db.query('UPDATE orders SET state = 3 WHERE orderId = ?', [orderId]);
+                            return
+                        }
+
+                        try {
+                            const queryRes = await axios.get(queryUrl)
+                            const queryData = queryRes.data
+
+                            if (queryData.code === 1 && queryData.status === 1) {
+                                const { trade_no, out_trade_no, type } = queryData
+                                const time = Date.now()
+
+                                let sql = 'UPDATE orders SET state = 1, pay_type = ?, pay_id = ?, pay_time = ? WHERE orderId = ? AND state = 0'
+                                const result = await db.query(sql, [type, trade_no, time, out_trade_no])
+
+                                if (result.affectedRows > 0) {
+                                    // 查询订单与商品信息
+                                    sql = `
+                                    SELECT 
+                                        g.lepao_count,
+                                        g.ic_count,
+                                        g.vip,
+                                        a.create_user
+                                    FROM 
+                                        orders a
+                                    LEFT JOIN 
+                                        goods g 
+                                    ON 
+                                        a.goods_id = g.id
+                                    WHERE 
+                                        a.orderId = ?
+                                `
+                                    const rows = await db.query(sql, [out_trade_no])
+                                    if (!rows || rows.length !== 1) {
+                                        this.logger.error(`订单商品信息异常,订单号:${out_trade_no}`)
+                                        await db.query('UPDATE orders SET state = 4 WHERE orderId = ?', [out_trade_no])
+                                        return
+                                    }
+
+                                    const { lepao_count, ic_count, vip, create_user } = rows[0]
+                                    sql = 'UPDATE users SET lepao_count = lepao_count + ?, ic_count = ic_count + ?, vip = ? WHERE uuid = ?'
+                                    const updateUser = await db.query(sql, [lepao_count, ic_count, vip, create_user])
+
+                                    if (!updateUser || updateUser.affectedRows !== 1) {
+                                        this.logger.error(`更新用户失败,UUID: ${create_user}`)
+                                        await db.query('UPDATE orders SET state = 4 WHERE orderId = ?', [out_trade_no])
+                                    }
+
+                                    sql = 'UPDATE orders SET state = 2 WHERE orderId = ?'
+                                    await db.query(sql, [out_trade_no])
+
+                                    this.logger.info(`订单处理成功:${out_trade_no}`)
+                                    return // 成功处理后终止轮询
+                                } else {
+                                    this.logger.warn(`订单不存在或已处理:${out_trade_no}`)
+                                }
+                            }
+
+                            // 未支付,继续轮询
+                            setTimeout(() => pollOrderStatus(retry + 1), DELAY)
+
+                        } catch (error) {
+                            this.logger.warn(`轮询支付状态失败:${error.stack}`)
+                            setTimeout(() => pollOrderStatus(retry + 1), DELAY)
+                        }
+                    }
+
+                    // 启动轮询
+                    pollOrderStatus()
+
+                } catch {
+                    this.logger.info(`获取订单支付状态失败!${error.stack}`)
+                }
 
 
             } else {
             } else {
                 return res.json({
                 return res.json({

+ 10 - 10
config.json

@@ -1,9 +1,9 @@
 {
 {
     "port": 30003,
     "port": 30003,
     "database": {
     "database": {
-        "host": "8.137.37.202",
+        "host": "127.0.0.1",
         "database": "ic_ctbu",
         "database": "ic_ctbu",
-        "port": 13306,
+        "port": 3306,
         "user": "root",
         "user": "root",
         "password": "yx3ud937"
         "password": "yx3ud937"
     },
     },
@@ -13,21 +13,21 @@
         "password": ""
         "password": ""
     },
     },
     "email": {
     "email": {
-        "host": "smtp.exmail.qq.com",
+        "host": "smtp.zoho.com",
         "port": 465,
         "port": 465,
         "secure": true,
         "secure": true,
-        "user": "mail@ctbu.top",
-        "password": "FPhxUVrt5J9WxgiP"
+        "user": "mail@xxoo365.top",
+        "password": "yx3ud937"
     },
     },
-    "url": "https://lepao-api.ctbu.top",
+    "url": "https://lepao-api.xxoo365.top",
     "url2": "http://127.0.0.1:30004",
     "url2": "http://127.0.0.1:30004",
     "url3": "http://127.0.0.1:30001",
     "url3": "http://127.0.0.1:30001",
     "runpy": "http://127.0.0.1:58000/api",
     "runpy": "http://127.0.0.1:58000/api",
     "pay": {
     "pay": {
-        "url":"https://pay.ctbu.top",
-        "pid": 1,
-        "key": "WfRF4t9wcepCjLs18lUoxRS2HiSF5mHI",
-        "return_url": "https://lepao.vite.net.cn/#/store/orderDetail/"
+        "url":"https://pay.gggua.com",
+        "pid": 1296,
+        "key": "MW222B33ytTv23tf2Z2tFV2k23iHVQ3q",
+        "return_url": "https://xxoo365.top/#/store/orderDetail/"
     },
     },
     "server": "CTBU_CLUB 重庆1号服务器"
     "server": "CTBU_CLUB 重庆1号服务器"
 }
 }