mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-21 05:18:08 +00:00
enrichTokenInfo 里 plan_type 与 subscription_expires_at 的取值口径不一致: - plan_type 有 shouldApplyChatGPTAccountInfoPlanType 护着(#3641), id_token 里的个人套餐优先,accounts/check 只在个人值为空时补位; - subscription_expires_at 却是无条件覆盖。 accounts/check 是多账号/工作区端点,命中的记录由 access_token JWT 的 poid 决定。 当 poid 指向默认 Personal workspace、而 chatgpt_account_id 指向个人 ChatGPT 账号时 (两者是不同标识),拿到的 entitlement.expires_at 描述的是 workspace 权益。 配上被保护下来的个人 plan_type,账号页就显示成「个人 Pro + workspace 到期时间」。 代码里本来已经有正确的来源——用个人 chatgpt_account_id 查 /backend-api/subscriptions 的 active_until——但它被 `if TrimSpace(SubscriptionExpiresAt) == ""` 挡着,workspace 值一旦写进去就永远不触发。 改为让两个字段始终描述同一份订阅: - 套餐取自 accounts/check 时(id_token 没带 chatgpt_plan_type),到期时间跟着取 同一条记录,行为不变; - 套餐保留了 id_token 的个人值时,只有该记录确实属于个人账号才用它的 entitlement.expires_at;不属于就跳过,并强制回落到个人订阅端点。 为此给 ChatGPTAccountInfo 补 AccountID:优先读 account.account_id,缺失时退回 accounts 的 map key(key 可能是 "default" 这类别名)。两侧任一缺 ID 时判定为 无法区分并沿用旧行为,poid == chatgpt_account_id 的单人账号完全不受影响。 Fixes #5459