Files
soul-yongping/开发文档/8、部署/宝塔面板配置订单同步定时任务.md
2026-02-09 15:09:29 +08:00

370 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 宝塔面板配置订单同步定时任务
> 适用于:有宝塔面板的服务器
> 难度非常简单3 分钟搞定)
---
## 一、准备工作
### 1. 生成安全密钥
打开终端(本地电脑),执行:
```bash
# Windows PowerShell
-join ((65..90) + (97..122) + (48..57) | Get-Random -Count 32 | % {[char]$_})
# 或手动生成一个 32 位随机字符串,例如:
# 密钥已写死在代码里,见下文 URL
```
**接口使用的固定密钥**`soul_cron_sync_orders_2026`(无需自己生成)
---
## 二、宝塔面板配置步骤
### 步骤 1登录宝塔面板
1. 浏览器打开:`http://你的服务器IP:8888`
2. 输入账号密码登录
### 步骤 2打开计划任务
1. 左侧菜单点击 **"计划任务"**
2. 点击右上角 **"添加任务"**
### 步骤 3配置任务方案 A - 访问 URL推荐
在弹出的对话框中填写:
| 字段 | 填写内容 | 说明 |
|------|---------|------|
| **任务类型** | 选择 `访问URL` | 下拉框选择 |
| **任务名称** | `订单状态同步` | 随便填,方便识别 |
| **执行周期** | 选择 `N分钟` | 下拉框选择 |
| **分钟选择** | 填 `5` | 表示每 5 分钟执行一次 |
| **URL地址** | `https://soul.quwanzhi.com/api/cron/sync-orders?secret=soul_cron_sync_orders_2026` | 密钥已写死在代码里,无需修改 |
**完整 URL 示例**(密钥已写死在代码里,直接用即可):
```
https://soul.quwanzhi.com/api/cron/sync-orders?secret=soul_cron_sync_orders_2026
```
### 步骤 4点击保存
点击底部的 **"提交"** 或 **"确定"** 按钮。
### 步骤 5验证任务已添加
在任务列表中应该能看到:
- ✅ 任务名称:订单状态同步
- ✅ 类型访问URL
- ✅ 周期:每 5 分钟
- ✅ 状态:正常(绿色)
---
## 三、立即测试执行
### 方法 1宝塔面板手动执行
1. 在任务列表中找到刚添加的任务
2. 点击右侧的 **"执行"** 按钮
3. 查看执行结果:
- 成功:显示 JSON 响应 `{"success":true,...}`
- 失败:显示错误信息
### 方法 2浏览器测试
直接在浏览器打开:
```
https://soul.quwanzhi.com/api/cron/sync-orders?secret=YOUR_SECRET
```
**预期响应**(成功):
```json
{
"success": true,
"message": "订单状态同步完成",
"total": 0,
"synced": 0,
"expired": 0,
"error": 0,
"duration": 123
}
```
**如果响应 401 错误**
```json
{
"success": false,
"error": "未授权访问"
}
```
说明密钥不对,检查 URL 中的 `secret` 参数。
---
## 四、查看执行日志
### 宝塔面板查看
1. 计划任务列表
2. 找到"订单状态同步"任务
3. 点击右侧的 **"日志"** 按钮
4. 查看最近的执行记录
**正常日志示例**
```
[2026-02-04 21:00:00] 开始执行
[2026-02-04 21:00:01] 状态码: 200
[2026-02-04 21:00:01] 响应: {"success":true,"synced":0,"expired":0}
[2026-02-04 21:00:01] 执行完成
```
---
## 五、配置环境变量(重要!)
定时任务需要密钥验证,必须在项目中配置:
### 方法 1通过宝塔面板配置
1. 左侧菜单 → **网站**
2. 找到 `soul.quwanzhi.com` 网站
3. 点击 **设置**
4. 左侧选择 **"伪静态"** 或 **"配置文件"**(取决于宝塔版本)
5. 找到 Node.js 项目的启动配置
### 方法 2在项目根目录创建 `.env.production`
SSH 登录服务器:
```bash
ssh root@你的服务器IP
cd /www/wwwroot/soul
# 编辑 .env.production
nano .env.production
```
添加以下内容:
```bash
# 定时任务密钥(与宝塔任务中的 secret 保持一致)
# CRON_SECRET 已写死在代码,无需配置
# 微信支付 API 密钥(从微信商户平台获取)
WECHAT_API_KEY=你的32位API密钥
```
保存后重启项目:
```bash
pm2 restart soul
```
---
## 六、方案 BShell 脚本(备选)
如果不想用 URL 方式,也可以用 Shell 脚本:
### 步骤 1添加任务
任务类型选择:`Shell 脚本`
### 步骤 2填写脚本
```bash
#!/bin/bash
curl -X GET "https://soul.quwanzhi.com/api/cron/sync-orders?secret=YOUR_SECRET" >> /www/wwwlogs/cron_sync_orders.log 2>&1
```
### 步骤 3设置执行周期
- 类型N分钟
- 周期5
---
## 七、方案 CPython 脚本(高级)
如果你想用 Python 脚本直接执行:
### 步骤 1确保 Python 环境
```bash
# SSH 登录服务器
ssh root@你的服务器IP
# 安装依赖
pip3 install pymysql requests
```
### 步骤 2上传脚本
确保脚本已上传到服务器:
```
/www/wwwroot/soul/scripts/sync_order_status.py
```
### 步骤 3宝塔添加任务
- 任务类型:`Shell 脚本`
- 脚本内容:
```bash
cd /www/wwwroot/soul && python3 scripts/sync_order_status.py >> /www/wwwlogs/sync_orders.log 2>&1
```
- 执行周期:每 5 分钟
---
## 八、验证是否生效
### 1. 创建测试订单
```sql
-- 通过宝塔面板 → 数据库 → soul_miniprogram → SQL窗口
INSERT INTO orders (id, order_sn, user_id, open_id, product_type, product_id, amount, status, created_at, updated_at)
VALUES ('TEST_SYNC', 'TEST_SYNC_001', 'test_user', 'test_openid', 'section', '1.2', 1.00, 'created', DATE_SUB(NOW(), INTERVAL 35 MINUTE), DATE_SUB(NOW(), INTERVAL 35 MINUTE));
```
### 2. 等待定时任务执行(最多 5 分钟)
或手动执行:宝塔面板 → 计划任务 → 点击"执行"
### 3. 查询订单状态
```sql
SELECT order_sn, status, created_at, updated_at
FROM orders
WHERE order_sn = 'TEST_SYNC_001';
```
**预期结果**
- 状态应该变为 `expired`(因为超过 30 分钟)
### 4. 清理测试数据
```sql
DELETE FROM orders WHERE order_sn = 'TEST_SYNC_001';
```
---
## 九、常见问题排查
### Q1: 任务显示"执行失败"
**可能原因**
1. URL 地址错误
2. 密钥不对401 错误)
3. 服务器网络问题
**解决方案**
1. 检查 URL 是否完整
2. 检查 `secret` 参数是否与 `.env.production` 中一致
3. 在浏览器中手动访问该 URL 测试
### Q2: 返回 401 未授权
**原因**:密钥不匹配
**解决方案**
1. 密钥已写死,无需配置 `CRON_SECRET`
2. 确认宝塔任务 URL 中的 `secret` 参数
3. 确保两者完全一致
4. 重启项目:`pm2 restart soul`
### Q3: 返回 500 错误
**可能原因**
1. 数据库连接失败
2. 代码有 bug
**解决方案**
1. 查看应用日志:`pm2 logs soul`
2. 检查数据库是否正常
3. 检查环境变量是否配置
### Q4: 看不到执行日志
**解决方案**
1. 宝塔面板 → 计划任务 → 点击任务右侧的"日志"
2. 或查看自定义日志文件:
```bash
tail -f /www/wwwlogs/cron_sync_orders.log
```
---
## 十、监控与优化
### 设置告警(可选)
宝塔面板 → 监控 → 进程守护,添加监控项:
- 监控类型URL 监控
- URL`https://soul.quwanzhi.com/api/cron/sync-orders?secret=YOUR_SECRET`
- 监控周期5 分钟
- 告警方式:邮件/企业微信
### 调整执行频率
根据实际情况调整:
- **订单少**10 分钟 / 15 分钟
- **订单多**3 分钟 / 5 分钟
- **高峰期**1 分钟(不推荐,增加服务器负载)
---
## 十一、配置清单Checklist
完成以下步骤,确保定时任务正常运行:
- [ ] 宝塔面板添加计划任务(访问 URL密钥已写死soul_cron_sync_orders_2026
- [ ] 配置 `.env.production` 中的 `WECHAT_API_KEY`(可选,用于查询微信订单状态)
- [ ] 重启项目:`pm2 restart soul`
- [ ] 手动执行测试(宝塔面板点击"执行"
- [ ] 验证响应正常(`{"success":true}`
- [ ] 查看日志确认任务执行
- [ ] 创建测试订单验证(可选)
- [ ] 清理测试数据(可选)
---
## 十二、最终配置示例
### 宝塔计划任务配置
```
任务名称: 订单状态同步
任务类型: 访问URL
执行周期: N分钟 -> 5
URL地址: https://soul.quwanzhi.com/api/cron/sync-orders?secret=soul_cron_sync_orders_2026
```
### 项目环境变量 `.env.production`(可选)
密钥已写死,无需配置 `CRON_SECRET`。若需微信支付查询订单状态,可配置:
```bash
# 微信支付 API 密钥(从商户平台获取,用于同步时查询订单真实状态)
WECHAT_API_KEY=YOUR_32_CHAR_API_KEY_HERE
# 其他环境变量...
DATABASE_URL=mysql://...
```
---
## 完成!
配置完成后,系统会:
- ✅ 每 5 分钟自动检查未支付订单
- ✅ 查询微信支付状态并同步
- ✅ 超时订单自动标记为 expired
- ✅ 支付成功订单自动解锁内容
再也不用担心支付回调丢失导致用户无法解锁内容了!🎉