fix(huya): 支付二维码改用收银台页面里的扫码内容 qr.alipay.com

真机复现(2026-10-15):上一版把二维码内容放成了**收银台页面地址**
(excashier.alipay.com/standard/auth.htm?payOrderId=…),那是 PC 版页面
(页面里写死 qrcodeWidth=150)。有些安卓机是用系统相机/浏览器打开的,就停在
这张 PC 页上——只显示左上角一个很小的二维码,不触发付款。

收银台页面里真正的扫码内容是隐藏字段 `J_qrCode`:

    <input name="qrCode" value="https://qr.alipay.com/upx03110ghym9vm37sx7255c" id="J_qrCode"/>

- huya_pay_link 新增 PayTargets / resolve_pay_targets() / extract_pay_qr_code():
  跟随网关 302 取收银台页面并解析出 qr.alipay.com 扫码码(约 40 字符)。
- 出码时写入 pay_qr_code,保留 pay_cashier_url 兜底;拿不到扫码码会打 warning。
- 前端二维码优先级:pay_qr_code → pay_cashier_url → 本站短链 → 原始地址。

验证:全量 pytest 772 passed / 6 skipped;用真机那张收银台页面跑解析得到
https://qr.alipay.com/upx03110ghym9vm37sx7255c;typecheck / eslint / ruff 通过。
This commit is contained in:
yml2213
2026-10-15 19:51:51 +08:00
parent 0b9a01ab3f
commit bf1e2e9361
5 changed files with 170 additions and 45 deletions
+9 -6
View File
@@ -79,14 +79,17 @@ function qrDoneLabel(task: HuyaTaskItem): string | null {
}
/**
* 二维码里放**短地址**:支付宝网关地址 1600+ 字符,直接编成二维码有 140+ 个模块,
* 手机根本扫不上(生产实测)。优先级:
* 1. `pay_cashier_url` —— 支付宝收银台直达地址(约 74 字符、公网域名,任意手机可扫码支付);
* 2. `pay_qr_path` —— 本站短链 `/api/huya/pay/<id>?k=<签名>`,手机打开后 302 跳到真实支付地址,
* 但要求当前页面域名手机能访问到(localhost 不行);
* 3. `pay_url` —— 原始网关地址,兜底。
* 二维码里放什么(优先级,见后端 huya_pay_link 模块头):
* 1. `pay_qr_code` —— 收银台页面里真正的扫码内容 `https://qr.alipay.com/xxx`(约 40 字符),
* 支付宝 App 扫它直接进付款,手机相机扫它也会拉起支付宝;
* 2. `pay_cashier_url` —— 收银台直达地址,但那是 **PC 版**页面(真机反馈:有的安卓机
* 扫开只看到左上角一个小二维码,不触发付款),只在拿不到 ① 时兜底;
* 3. `pay_qr_path` —— 本站短链 `/api/huya/pay/<id>?k=<签名>`,要求本页域名手机能访问(localhost 不行);
* 4. `pay_url` —— 原始网关地址 1600+ 字符,二维码太密扫不动,最后兜底。
*/
function payQrValue(task: HuyaTaskItem): string {
const qrCode = resultText(task, 'pay_qr_code');
if (qrCode) return qrCode;
const cashier = resultText(task, 'pay_cashier_url');
if (cashier) return cashier;
const path = resultText(task, 'pay_qr_path');