fix(huya): 开通商品只保留真正可购买的 spu,并清理历史死商品行
真机 2026-10-15(HAR 10.15-精英徽章两个-1 + 逐个 spu 探测):面板里的「精英徽章 hy-5872824」是积分中心「赠送指定礼物得积分」那排的礼物 spu —— getGoodsInfoV5 仍返回 200+价格,但 listPayChannelV5 返回 401「您的设备环境暂不支持购买该商品」,所以下单必报「当前支付渠道不可用」(与数量无关)。真能买的是 hy-8343549 精英徽章 ¥1 / hy-8343551 精英令 ¥10。 - 内置候选换成可购买的 4 个:hy-8328015 宝典 / hy-8327356 币 / hy-8343549 徽章 / hy-8343551 令 - 刷新商品增加「能买到」闸门:详情 200 后再校验 listPayChannelV5,非 200 或渠道为空即剔除并记录服务端原话 - 下单流程渠道失败时透出服务端消息,只有渠道真不在可用列表才说「当前支付渠道不可用(可用:…)」 - 商品列表只认「最近一次刷新」那一套:原先按账号并集返回,别的账号旧刷新留下的礼物 spu 会和最新一套叠成 7 个选项 - 刷新时清理历史死行:本账号旧行 + 全局默认行(account_id 为空)+ 其它账号里已不在候选中的 spu 行 - 测试:401 商品被剔除、渠道失败透传、列表只认最近一套、刷新清理别处死行
This commit is contained in:
@@ -134,19 +134,29 @@ def list_recharge_goods(
|
||||
):
|
||||
"""查看已缓存的虎牙充值商品快照。
|
||||
|
||||
只返回账号级快照(account_id 非空):库里还有一批 2026-07-04 写入的全局默认行
|
||||
(account_id 为空、sid=0,含旧版精英宝典/精英令/精英徽章),它们已不是当前在售
|
||||
商品,未刷新过的账号显示空列表、点一次「刷新开通商品」即可。同一 spu_id 只保留
|
||||
最新一行,避免下拉框出现同名重复项。
|
||||
商品目录是**全局同一套**(每个账号刷出来的是同样的商品),但表里是按账号存的行,
|
||||
所以这里只返回「最近一次刷新」那一整套:
|
||||
- 账号级旧刷新留下的行(真机 2026-10-15:账号 65/66 的旧礼物 spu)会和最新一套
|
||||
并集成 7 个选项,面板里就能选到「能看不能买」的商品;
|
||||
- 2026-07-04 写入的全局默认行(account_id 为空、sid=0)已不是当前在售商品,一并忽略。
|
||||
同一 spu_id 只保留最新一行,避免下拉框出现同名重复项。
|
||||
"""
|
||||
rows = (
|
||||
db.query(HuyaRechargeGoodsSnapshot)
|
||||
.filter(HuyaRechargeGoodsSnapshot.account_id.is_not(None))
|
||||
.order_by(HuyaRechargeGoodsSnapshot.id.desc())
|
||||
.order_by(
|
||||
HuyaRechargeGoodsSnapshot.updated_at.desc(),
|
||||
HuyaRechargeGoodsSnapshot.id.desc(),
|
||||
)
|
||||
.all()
|
||||
)
|
||||
if not rows:
|
||||
return []
|
||||
newest = rows[0].updated_at
|
||||
latest: dict[str, HuyaRechargeGoodsSnapshot] = {}
|
||||
for row in rows:
|
||||
if row.updated_at != newest:
|
||||
continue
|
||||
latest.setdefault(row.spu_id, row)
|
||||
return list(latest.values())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user