Browse Source

Merge branch 'master' of https://git.cthc.top/Pchen0/ic-ctbu-backend

Pchen. 9 months ago
parent
commit
df8026d548
3 changed files with 115 additions and 32 deletions
  1. 21 21
      apis/Lepao/AddAccount.js
  2. 86 3
      apis/Order/CreateOrder.js
  3. 8 8
      config.json

+ 21 - 21
apis/Lepao/AddAccount.js

@@ -41,27 +41,27 @@ class AddAccount extends API {
         }
 
         // 判断用户是否用了会员权益
-        let userSql = 'SELECT vip FROM users WHERE uuid = ?'
-        let userData = await db.query(userSql, [uuid])
-        if (!userData || userData.length !== 1)
-            return res.json({ ...BaseStdResponse.ERR, msg: '添加乐跑账号失败!数据库错误' })
-
-        if (userData[0].vip !== 1) {
-            // 限制账号个数
-            let numSql = 'SELECT COUNT(*) AS num FROM lepao_account WHERE create_user = ?'
-            let numRows = await db.query(numSql, [uuid])
-            if(!numRows)
-                return res.json({ ...BaseStdResponse.ERR, msg: '添加乐跑账号失败!数据库错误' })
-            if(numRows[0].num >= 6)
-                return res.json({...BaseStdResponse.NOTVIP, msg: '非VIP用户最多只能添加6个乐跑账号,请先开通VIP'})
-
-            // if(min_distance != 2.00 || max_distance != 4.00)
-            //     return res.json({ ...BaseStdResponse.NOTVIP,  msg: '仅VIP用户可设置跑步距离区间' })
-
-            // 限制跑区
-            // if (area != '')
-            //     return res.json({ ...BaseStdResponse.NOTVIP, msg: '仅VIP用户可指定跑区' })
-        }
+        // let userSql = 'SELECT vip FROM users WHERE uuid = ?'
+        // let userData = await db.query(userSql, [uuid])
+        // if (!userData || userData.length !== 1)
+        //     return res.json({ ...BaseStdResponse.ERR, msg: '添加乐跑账号失败!数据库错误' })
+
+        // if (userData[0].vip !== 1) {
+        //     限制账号个数
+        //     let numSql = 'SELECT COUNT(*) AS num FROM lepao_account WHERE create_user = ?'
+        //     let numRows = await db.query(numSql, [uuid])
+        //     if(!numRows)
+        //         return res.json({ ...BaseStdResponse.ERR, msg: '添加乐跑账号失败!数据库错误' })
+        //     if(numRows[0].num >= 6)
+        //         return res.json({...BaseStdResponse.NOTVIP, msg: '非VIP用户最多只能添加6个乐跑账号,请先开通VIP'})
+
+        //     if(min_distance != 2.00 || max_distance != 4.00)
+        //         return res.json({ ...BaseStdResponse.NOTVIP,  msg: '仅VIP用户可设置跑步距离区间' })
+
+        //     限制跑区
+        //     if (area != '')
+        //         return res.json({ ...BaseStdResponse.NOTVIP, msg: '仅VIP用户可指定跑区' })
+        // }
 
         const time = new Date().getTime()
 

+ 86 - 3
apis/Order/CreateOrder.js

@@ -18,7 +18,7 @@ function generateOrderId() {
 function generatePaymentSign(params, key) {
     const sorted = Object.keys(params).sort()
     const query = sorted.map(k => `${k}=${params[k]}`).join('&') + key
-    
+
     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})
 
 //     } catch (error) {
-        
+
 //     }
 // }
 
@@ -119,7 +119,7 @@ class CreateOrder extends API {
                     EX: 300
                 })
 
-                return res.json({
+                res.json({
                     ...BaseStdResponse.OK,
                     id: orderId,
                     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 {
                 return res.json({

+ 8 - 8
config.json

@@ -13,21 +13,21 @@
         "password": ""
     },
     "email": {
-        "host": "smtp.exmail.qq.com",
+        "host": "smtp.zoho.com",
         "port": 465,
         "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",
     "url3": "http://127.0.0.1:30001",
     "runpy": "http://127.0.0.1:58000/api",
     "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/"
     },
     "unilogin": {
         "url": "https://open.losfer.cn",