- 限购商品(精英宝典 buy_limit=1)挂着未支付旧单时,真正先失败的是购买权限 校验 checkUserBuyAuth(真机 703「已超过该商品的购买上限,下单失败~」), createOrderV5 根本不会执行;现在 checkUserBuyAuth 与 createOrderV5 两处失败 都会回退 find_reusable_order,拿同一商品的未支付旧单继续 payOrderSubmitV5。 - 新增支付宝收银台直达地址解析(resolve_pay_entry_url):跟随网关 302 后的 excashier.alipay.com/standard/auth.htm?payOrderId=…(93 字符,原始网关地址 1616 字符)写入结果 pay_cashier_url;解析失败回落本站短链 /api/huya/pay/<task_id>?k=<hmac>,后端跑在 localhost 时客户也扫得开。 - 前端 QRCode 显式 color="#000" bgColor="#fff":antd v6 暗色主题默认 color=token.colorText、bgColor=transparent,白码落在白底容器里根本看不见。 - 支付成功后列表「二维码」列不再展示二维码(qrDoneLabel → 已支付/已开通)。 测试:pytest 767 passed / 6 skipped;typecheck、eslint、ruff 通过。
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""虎牙支付短链:把「开通支付码」的二维码内容换成可扫的短链。
|
|
|
|
手机扫码时没有登录态(不是当前浏览器),所以这条路由**不带鉴权依赖**,
|
|
只校验 `huya_pay_link.pay_qr_path` 里那个 HMAC 签名;签名不对或任务里没有
|
|
支付地址就 404。除了跳到支付宝/微信的支付地址,这里不返回任何数据。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from fastapi.responses import RedirectResponse
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ...database import get_db
|
|
from ...models import HuyaTask
|
|
from ...services.huya_pay_link import verify_pay_token
|
|
|
|
|
|
router = APIRouter(tags=["虎牙"])
|
|
|
|
|
|
@router.get("/pay/{task_id}")
|
|
def redirect_huya_pay(task_id: int, k: str = "", db: Session = Depends(get_db)):
|
|
"""302 到该任务真实的下单支付地址(供手机扫码后打开)。"""
|
|
if not verify_pay_token(task_id, k):
|
|
raise HTTPException(status_code=404, detail="支付链接无效")
|
|
|
|
task = db.query(HuyaTask).filter(HuyaTask.id == int(task_id)).first()
|
|
pay_url = str(
|
|
((task.result or {}) if task is not None else {}).get("pay_url") or ""
|
|
)
|
|
if not pay_url.startswith(("http://", "https://")):
|
|
raise HTTPException(status_code=404, detail="支付链接不存在")
|
|
|
|
return RedirectResponse(pay_url, status_code=302)
|