feat: 添加 POST /api/payment/sync-order 接口,用于强制同步订单会员状态
This commit is contained in:
@@ -41,6 +41,7 @@ pub use payment::create_order;
|
|||||||
pub use payment::generate_code;
|
pub use payment::generate_code;
|
||||||
pub use payment::get_user_quota;
|
pub use payment::get_user_quota;
|
||||||
pub use payment::mock_confirm;
|
pub use payment::mock_confirm;
|
||||||
|
pub use payment::sync_order;
|
||||||
pub use payment::payment_index;
|
pub use payment::payment_index;
|
||||||
pub use payment::payment_login_status;
|
pub use payment::payment_login_status;
|
||||||
pub use payment::payment_page;
|
pub use payment::payment_page;
|
||||||
|
|||||||
@@ -936,6 +936,43 @@ pub async fn mock_confirm(
|
|||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// POST /api/payment/sync-order — 根据订单号强制同步会员状态
|
||||||
|
///
|
||||||
|
/// 用户支付完成后,若前端会员状态未刷新,可调用此接口同步确认订单并获取最新状态。
|
||||||
|
#[post("/api/payment/sync-order")]
|
||||||
|
pub async fn sync_order(
|
||||||
|
pool: web::Data<PgPool>,
|
||||||
|
claims: web::ReqData<Claims>,
|
||||||
|
body: web::Json<MockConfirmRequest>,
|
||||||
|
) -> Result<HttpResponse, AppError> {
|
||||||
|
let user_id = claims.user_id;
|
||||||
|
|
||||||
|
// 尝试确认订单(幂等)
|
||||||
|
let _ = db::confirm_payment_order(pool.get_ref(), &body.order_id, user_id).await;
|
||||||
|
|
||||||
|
// 查询最新状态
|
||||||
|
let user = sqlx::query_as::<_, (bool, Option<chrono::DateTime<chrono::Utc>>)>(
|
||||||
|
r#"SELECT is_paid, paid_expires_at FROM users WHERE id = $1"#,
|
||||||
|
)
|
||||||
|
.bind(user_id)
|
||||||
|
.fetch_optional(pool.get_ref())
|
||||||
|
.await
|
||||||
|
.map_err(|e| AppError::Database(format!("查询用户失败: {}", e)))?
|
||||||
|
.ok_or_else(|| AppError::NotFound("用户不存在".to_string()))?;
|
||||||
|
|
||||||
|
let (is_paid, paid_expires_at) = user;
|
||||||
|
let is_paid_active = is_paid && (paid_expires_at.is_none() || paid_expires_at.unwrap() > Utc::now());
|
||||||
|
|
||||||
|
Ok(HttpResponse::Ok().json(serde_json::json!({
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"is_paid": is_paid,
|
||||||
|
"is_paid_active": is_paid_active,
|
||||||
|
"paid_expires_at": paid_expires_at,
|
||||||
|
}
|
||||||
|
})))
|
||||||
|
}
|
||||||
|
|
||||||
/// GET /api/user/quota
|
/// GET /api/user/quota
|
||||||
#[get("/api/user/quota")]
|
#[get("/api/user/quota")]
|
||||||
pub async fn get_user_quota(
|
pub async fn get_user_quota(
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ use handlers::{
|
|||||||
admin_get_user, admin_update_user_payment, add_favorite, alipay_notify, alipay_pay_page,
|
admin_get_user, admin_update_user_payment, add_favorite, alipay_notify, alipay_pay_page,
|
||||||
create_order, delete_weather, generate_code, generate_temp_token_handler, get_current_user_profile,
|
create_order, delete_weather, generate_code, generate_temp_token_handler, get_current_user_profile,
|
||||||
get_favorites, get_user_quota, get_weather_brief, get_weather_details,
|
get_favorites, get_user_quota, get_weather_brief, get_weather_details,
|
||||||
health_check, login, mock_login, mock_confirm, payment_index, payment_login_status, payment_page, payment_success,
|
health_check, login, mock_login, mock_confirm, sync_order, payment_index, payment_login_status, payment_page, payment_success,
|
||||||
post_weather_data,
|
post_weather_data,
|
||||||
refresh_token, remove_favorite, root, save_user_profile, serve_static_files,
|
refresh_token, remove_favorite, root, save_user_profile, serve_static_files,
|
||||||
web_generate_login_code, web_login_confirm, web_login_auto_confirm,
|
web_generate_login_code, web_login_confirm, web_login_auto_confirm,
|
||||||
@@ -96,6 +96,7 @@ fn create_server_config(
|
|||||||
.service(admin_update_user_payment)
|
.service(admin_update_user_payment)
|
||||||
.service(create_order)
|
.service(create_order)
|
||||||
.service(mock_confirm)
|
.service(mock_confirm)
|
||||||
|
.service(sync_order)
|
||||||
.service(get_user_quota)
|
.service(get_user_quota)
|
||||||
.service(get_favorites)
|
.service(get_favorites)
|
||||||
.service(add_favorite)
|
.service(add_favorite)
|
||||||
|
|||||||
Reference in New Issue
Block a user