2025-10-27
解决闲鱼订单长期处于 pending 状态导致的问题:
- ❌ 用户创建订单但未回填订单号
- ❌ 占用待支付订单名额
- ❌ 达到限制后无法创建新订单
- ❌ 管理员无法审核没有订单号的订单
- ⏰ 默认 30 分钟后自动将
pending状态的 TRON 订单标记为timeout - 🔄 超时时间可通过
.env配置 - 📊 自动释放用户的待支付订单名额
- 🛡️ 解决 Bot 重启后监控线程丢失的问题
- ⏰ 默认 30 分钟后自动将
pending状态的闲鱼订单标记为expired - 🔄 超时时间可通过
.env配置 - 📊 自动释放用户的待支付订单名额
- 🧹 每 5 分钟自动运行一次清理任务(可配置)
- 📝 详细记录清理日志
- 🛡️ 线程安全的数据库操作
- 💎 同时清理 TRON 和闲鱼订单
- ✅ USDT 订单:30 分钟(数据库级别清理)
- ✅ 闲鱼订单:30 分钟(数据库级别清理)
- ✅ 清理间隔:5 分钟(可调整)
# 订单超时设置
ORDER_TIMEOUT_MINUTES=30 # USDT订单超时时间(分钟)
XIANYU_ORDER_TIMEOUT_MINUTES=30 # 闲鱼订单超时时间(分钟)
ORDER_CLEANUP_INTERVAL_MINUTES=5 # 订单清理任务运行间隔(分钟)
# 防刷配置
MAX_PENDING_ORDERS_PER_USER=3 # 每个用户最多同时待支付订单数
MIN_ORDER_INTERVAL_SECONDS=60 # 下单最小间隔(秒)| 配置项 | 默认值 | 说明 |
|---|---|---|
ORDER_TIMEOUT_MINUTES |
30 | USDT订单超时时间 |
XIANYU_ORDER_TIMEOUT_MINUTES |
30 | 闲鱼订单超时时间 |
ORDER_CLEANUP_INTERVAL_MINUTES |
5 | 清理任务运行间隔 |
MAX_PENDING_ORDERS_PER_USER |
3 | 每个用户最多待支付订单数 |
MIN_ORDER_INTERVAL_SECONDS |
60 | 下单最小间隔 |
- ✅ 订单创建时启动后台监控线程
- ✅ 线程每 15 秒检查一次支付状态
- ✅ 超时后自动更新数据库
- ❌ 但是:Bot 重启后监控线程丢失!
- ✅ 定时任务(每 5 分钟)扫描数据库
- ✅ 查找超时的 pending 订单
- ✅ 批量更新为 timeout 状态
- ✅ Bot 重启不影响清理功能
| 机制 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 监控线程 | 实时性好(秒级) | Bot 重启丢失 | 正常运行时 |
| 数据库清理 | 可靠性高,不受重启影响 | 延迟 5 分钟 | Bot 重启后恢复 |
结论:两个机制互补,确保订单一定会超时! ✅
# 新增配置项
XIANYU_ORDER_TIMEOUT_MINUTES = int(os.getenv('XIANYU_ORDER_TIMEOUT_MINUTES', '30'))
ORDER_CLEANUP_INTERVAL_MINUTES = int(os.getenv('ORDER_CLEANUP_INTERVAL_MINUTES', '5'))def cleanup_expired_tron_orders(self, timeout_minutes: int) -> int:
"""
清理过期的 TRON (USDT) 待支付订单
Args:
timeout_minutes: 超时时间(分钟)
Returns:
清理的订单数量
"""
# 查找并更新过期订单为 timeout 状态
# 返回清理数量def cleanup_expired_xianyu_orders(self, timeout_minutes: int) -> int:
"""
清理过期的闲鱼待支付订单
Args:
timeout_minutes: 超时时间(分钟)
Returns:
清理的订单数量
"""
# 查找并更新过期订单为 expired 状态
# 返回清理数量注意: TRON 订单状态变为 timeout,闲鱼订单状态变为 expired
async def cleanup_expired_orders(context: ContextTypes.DEFAULT_TYPE):
"""定期清理过期的订单(TRON + 闲鱼)"""
# 清理 TRON 订单
tron_cleaned = db.cleanup_expired_tron_orders(ORDER_TIMEOUT_MINUTES)
if tron_cleaned > 0:
logger.info(f"🧹 Auto-cleanup: {tron_cleaned} TRON order(s) timed out")
# 清理闲鱼订单
xianyu_cleaned = db.cleanup_expired_xianyu_orders(XIANYU_ORDER_TIMEOUT_MINUTES)
if xianyu_cleaned > 0:
logger.info(f"🧹 Auto-cleanup: {xianyu_cleaned} xianyu order(s) expired")
# 汇总日志
total = tron_cleaned + xianyu_cleaned
if total > 0:
logger.info(f"🧹 Total cleaned: {total} order(s)")
# 注册定时任务
application.job_queue.run_repeating(
cleanup_expired_orders,
interval=ORDER_CLEANUP_INTERVAL_MINUTES * 60,
first=30 # 启动后30秒开始
)用户创建 TRON 订单
↓
状态: pending
↓
┌─────────────────────────────┐
│ 双重超时机制 │
└─────────────────────────────┘
↓ ↓
监控线程(实时) 定时任务(每5分钟)
↓ ↓
检查支付状态 扫描数据库
↓ ↓
超时 → timeout 超时 → timeout
↓ ↓
释放订单名额 释放订单名额
用户创建闲鱼订单
↓
状态: pending
↓
后台定时任务 (每5分钟)
↓
检查: created_at < (now - 30分钟)
↓
是 → 更新状态为 expired
↓
释放待支付订单名额
↓
用户可以创建新订单
- ✅ 不再因旧订单堆积而无法创建新订单
- ✅ 更清晰的订单状态提示
- ✅ 自动清理过期订单,无需手动干预
- ✅ 减少无效的待审核订单
- ✅ 更准确的订单统计数据
- ✅ 系统自动维护,降低管理成本
- ✅ 防止订单表无限增长
- ✅ 有效的防刷单机制
- ✅ 自动化的订单生命周期管理
2025-10-28 10:05:30 - database - INFO - Cleaned up 2 expired TRON orders (timeout: 30 min)
2025-10-28 10:05:30 - database - DEBUG - - Order TG_8068014765_1730023456789 (user 8068014765) timed out
2025-10-28 10:05:30 - database - DEBUG - - Order TG_8068014765_1730023567890 (user 8068014765) timed out
2025-10-28 10:05:30 - __main__ - INFO - 🧹 Auto-cleanup: 2 TRON order(s) timed out and cleaned up
2025-10-28 10:05:30 - database - INFO - Cleaned up 1 expired xianyu orders (timeout: 30 min)
2025-10-28 10:05:30 - database - DEBUG - - Order XY_8068014765_1730023678901 (user 8068014765) expired
2025-10-28 10:05:30 - __main__ - INFO - 🧹 Auto-cleanup: 1 xianyu order(s) expired and cleaned up
2025-10-28 10:05:30 - __main__ - INFO - 🧹 Total cleaned: 3 order(s) (TRON: 2, Xianyu: 1)
2025-10-28 10:10:30 - database - INFO - Cleaned up 0 expired TRON orders (timeout: 30 min)
2025-10-28 10:10:30 - database - INFO - Cleaned up 0 expired xianyu orders (timeout: 30 min)
- 创建闲鱼订单但不回填订单号
- 等待超时时间(默认30分钟)
- 观察日志,确认订单被自动清理
- 验证可以创建新订单
在 .env 中设置:
XIANYU_ORDER_TIMEOUT_MINUTES=1 # 1分钟超时
ORDER_CLEANUP_INTERVAL_MINUTES=1 # 1分钟运行一次测试完成后改回生产环境配置。
-
订单超时时间建议
- 测试环境:1-5 分钟(快速验证)
- 生产环境:30-60 分钟(给用户充足时间)
-
清理间隔建议
- 测试环境:1 分钟
- 生产环境:5-10 分钟
-
防刷配置建议
MAX_PENDING_ORDERS_PER_USER: 3-5 个MIN_ORDER_INTERVAL_SECONDS: 60-120 秒
git pull添加上述配置项(如果没有则使用默认值)
# 使用 PM2
pm2 restart payment-bot
# 或直接运行
python3 bot.py查看日志确认清理任务已启动:
pm2 logs payment-bot应该看到:
Order cleanup task started (running every 5 minutes)
README.md- 完整功能说明QUICKSTART.md- 快速开始指南CONFIG_GUIDE.md- 配置指南
- 添加闲鱼订单超时配置
- 实现数据库清理方法
- 添加定时清理任务
- 更新文档和配置说明
- 添加详细日志记录
- 修复导入错误
-
用户通知
- 订单即将过期时发送提醒(例如剩余5分钟)
- 订单过期后发送通知
-
管理员统计
- 每日过期订单统计
- 订单转化率分析
-
灵活的超时策略
- 根据套餐类型设置不同超时时间
- VIP用户延长超时时间
-
订单恢复机制
- 允许用户申请恢复过期订单
- 管理员可手动恢复订单
💡 提示: 如有任何问题,请查看日志文件 bot.log 或使用 pm2 logs payment-bot 查看实时日志。