From 49d740e27c53b859b496cc4a032b1fee27e210c2 Mon Sep 17 00:00:00 2001 From: milky0217 Date: Mon, 10 Aug 2026 15:34:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E7=A1=AE=E8=AE=A4=EF=BC=8C=E4=BB=85=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E6=94=AF=E4=BB=98=E5=AE=9D=E5=9B=9E=E8=B0=83=E9=AA=8C?= =?UTF-8?q?=E7=AD=BE=EF=BC=9Brsa2=5Fverify=20=E6=94=AF=E6=8C=81=E8=A3=B8?= =?UTF-8?q?=20base64=20DER=20=E5=85=AC=E9=92=A5=EF=BC=9B.env=20=E5=8F=96?= =?UTF-8?q?=E6=B6=88=20git=20=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 19 ------------------- src/db.rs | 39 --------------------------------------- src/handlers/payment.rs | 12 +++++++++--- src/main.rs | 11 +---------- 4 files changed, 10 insertions(+), 71 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index cbc83e4..0000000 --- a/.env +++ /dev/null @@ -1,19 +0,0 @@ -# .env -DATABASE_URL=postgres://milkydata:44n6FdB8CdDAk5rk@154.37.213.24:5432/milkydata -WECHAT_APPID="wx5b00eb90621802f7" -WECHAT_SECRET="494efc513faa310bfba588bda2849bfd" -JWT_SECRET="your_super_secret_key" -SSL_KEY_PATH=/etc/ssl/private/private.key -SSL_CERT_PATH=/etc/ssl/certs/full_chain.pem -RUST_LOG=info -APP_VERSION="0.2.0" -FREE_USER_DATA_LIMIT=20 -SSH_SERVER=root@1panel-server - -# 支付宝生产环境配置 -# 支付宝生产环境配置 -ALIPAY_APP_ID=2021006148681106 -ALIPAY_PRIVATE_KEY="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCImX4Zj18whXYi6l29caq+ShjqT7JwWDbOoz/hEqZqPxQNu6KF59OswcUIv3It4CxJ0/kXsiC/pc6mrN9GedOAPIaz6YydgII/nwHl4OdPPxW8jeomBuiSmcbPcZ4AJTi1YTxrj//8YDIQInVc5/I4HPg+osN4qkqy+xrJ4vGrmyy+ClwHh3OxglGDLhbprH4WCgxKjwTDfR1A84w+pbrST1YaWI7sqqPhVxuYQQPjaLOpXMgrJu5ctnlFVTC27mY2wSIrxajB/6w1SQ+Z+Z149frk47PBOwL+xfKT4gwy3yj/t7WZStzH0gEhG7mXjc6qIjZ8uH5OxUZ+f6gMDpKBAgMBAAECggEAYnI87y7k65NEEOXXqTDCXWIJktTdRRpOZZ5B63QFe4z6ZutTti3d4CPGXQecwnNNd+fNHcbC01wsEvOD9sbWJxV3/zHSpbB4LmHqfEIacoKEp9+fYMiZ1Q3+uoKn3HL268GoSdz+IGUzr20mKE8Bwm8eegXT2qLgMx3FsLpecc3WXmwgMDI/alknO81+xZenLH1Y6+XdsoPVWsS3OY3gnzfYz40n1LaLCQiklBu6AUjSQupSUJ53rGtYpZnp+ImYwBVcYeFL0mZZVId/lzDI2K8eaM/RGVZYsU1vkP6CeSJzWhpr6ftSRRl3VJQou0ytLLX/YeUoXIhsfZ+x3cPKAQKBgQC9ub1z+T/+0lHZwm360otNHQNeEq3FYjnx1x7WOWTXCsAqVZizfmpUYSHoNZeNlyLpbXVsYp22xJmLBArB9LBMvjY1z2iOQJW7F46O6cY38AcgWC41YalLcrk2y4jny6rJZRMjvmDOM67SH01pzZQ6eGJpzSZpTj2Jm/tBsH7gGwKBgQC4UPK5a32ov9YuyzfQXcW341JFlTK2k2D1ewilYSZifpTDqdVpH1gSzGpfoXI7K6Z26xkx1n5rOIe+SxOKaNBj/5PJuEzmMVvUWkFU0IutoqVc2R6h4Rb+9q7llzAavFZ5Ssj1u9Q5Pjhc5Jr8zM6xXk55/4CuqYuBMCcte4fZkwKBgF/kVSEcxX+iBcSuRLAVYlrjYyRVBIdTEj5toCRedd1Kjb3X7YorRsrHHUAkdikWTor0y/iwD06lJ4Xf0SAe8EyZhwTDg/ECK6uYSHFrLshvBOsQJqrMZajAn2RWkye1BOktsPLL8lnGPYHuWE41ncm/tt4K1nM7HFdFA0U8U6QpAoGAe0gRgboG+6cMoJHmjCUciUmwDsCjggEDuk4H024umXSnFlRzXPPNGg3GHJ7E5BTnK+VGHdKlDhxqlvpqYIqI0EnzVNpD/TgIfvm7dvpiYspGJttGpOoEUpc3FnPQhiFxCYHe9pYidgNK+b8id3KZ0YMNpIYkUS8wE0HdAov8qqcCgYEAtRjXzj4JZ5we6aOqv4bcr7xLw4a7wzS99K5EcrbYRxvibUhelooQdgdY40FmdtfuY/4rpHC3R9/13aqcD/WSTFOdOsZAcfTi738y13h3dCy3FZisLYM7rgjUSnQnEGlyR0TYE4Yda490rpYJBjyQIE3EcIlWPerm8vh1wx1Rh90=" -ALIPAY_ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkhLqABUN1E2PCmOznQp+53T3x4j27I96hdatl6lWbCBPwyXnZVW4uYZ4kV+34+i2wCzEtMpUiNQaIsQXx2qD8x0d8szsj7pEZuY+xUUJTzm95fYO2nq4aaQ38T/kxdYrW12is8vwY83rlghdlkvVP2XZCuYoFq9UVieTu6LTDk6v91Mt2xr1Zw1Oj+yg8VpBFXkcS7ORJjiufWzCEoxzlb2KK2AGOLhdc8BJsBfrQ0JAqFB6b0uteUF21DDdPN/sblD8GoRAGuSpDhyQLG+0fDNdcIMyHpsq7bIDNjgYGS8RbKAtb6WyV6vriIemZ0fMvzN5Mpqv2jwCe/31ar//PwIDAQAB" -ALIPAY_GATEWAY="https://openapi.alipay.com/gateway.do" -APP_BASE_URL="https://dev.xmclassmate.top" diff --git a/src/db.rs b/src/db.rs index 8dadeba..a3d03f8 100644 --- a/src/db.rs +++ b/src/db.rs @@ -371,45 +371,6 @@ pub async fn get_user_orders( } /// 扫描超过 10 分钟的待支付订单,尝试自动确认(用于回调重试) -/// 返回成功确认的订单数量 -pub async fn check_and_retry_pending_orders(pool: &PgPool) -> Result { - // 查找超过 10 分钟仍为 pending 的订单 - let stuck_orders: Vec<(String,)> = sqlx::query_as( - r#" - SELECT order_no FROM payment_orders - WHERE status = 'pending' - AND created_at < NOW() - INTERVAL '10 minutes' - AND created_at > NOW() - INTERVAL '24 hours' - ORDER BY created_at ASC - "#, - ) - .fetch_all(pool) - .await - .map_err(|e| AppError::Database(format!("查询待处理订单失败: {}", e)))?; - - if stuck_orders.is_empty() { - return Ok(0); - } - - tracing::info!( - "发现 {} 个待处理订单,尝试自动确认...", - stuck_orders.len() - ); - - let mut confirmed: u64 = 0; - for (order_no,) in &stuck_orders { - match confirm_payment_order_by_orderno(pool, order_no).await { - Ok(_) => { - confirmed += 1; - tracing::info!("定时任务自动确认订单: {}", order_no); - } - Err(e) => { - tracing::warn!("定时任务无法确认订单 {}: {}", order_no, e); - } - } - } - Ok(confirmed) -} /// 检查会员到期前 7 天的用户,发送即将到期通知 pub async fn check_member_expiry_soon(pool: &PgPool) -> Result { diff --git a/src/handlers/payment.rs b/src/handlers/payment.rs index f63af6b..1153ddf 100644 --- a/src/handlers/payment.rs +++ b/src/handlers/payment.rs @@ -153,9 +153,15 @@ fn rsa2_verify(content: &str, sign: &str, public_key_pem: &str) -> Result std::io::Result<()> { Err(e) => warn!("启动时清理 web 登录码失败: {}", e), } - // 后台定时扫描待支付订单(每 5 分钟) let pool_clone = pool.clone(); actix_web::rt::spawn(async move { let mut interval = actix_web::rt::time::interval(std::time::Duration::from_secs(300)); interval.tick().await; // 跳过立即执行 loop { interval.tick().await; - tracing::info!("[定时任务] 开始扫描待支付订单..."); - match db::check_and_retry_pending_orders(&pool_clone).await { - Ok(confirmed) => { - if confirmed > 0 { - tracing::info!("[定时任务] 自动确认了 {} 个待支付订单", confirmed); - } - } - Err(e) => tracing::warn!("[定时任务] 扫描待支付订单失败: {}", e), - } + tracing::info!("[定时任务] 开始..."); // 会员到期前 7 天提醒 if let Err(e) = db::check_member_expiry_soon(&pool_clone).await {