Files
live-hub-py/web/backend/routers/huya/pay.py
T
yml2213 0b9a01ab3f feat(huya): 开通支付码复用未支付旧单 + 二维码改用支付宝收银台直达地址
- 限购商品(精英宝典 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 通过。
2026-10-15 19:28:26 +08:00

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)