li
358e4a89a1
fix(openai-oauth): 个人订阅到期时间不再被 POID workspace 的 entitlement 覆盖
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
2026-08-10 09:29:14 +08:00
..
2026-08-08 14:39:22 +08:00
2026-08-05 22:35:01 +08:00
2026-08-09 20:58:07 +08:00
2026-07-27 15:12:51 +08:00
2026-08-06 14:10:41 +08:00
2026-08-08 14:39:22 +08:00
2026-07-25 12:51:20 +08:00
2026-08-09 20:58:07 +08:00
2026-08-03 17:38:04 +08:00
2026-08-09 15:53:40 +08:00
2026-08-10 09:29:14 +08:00
2026-07-27 17:08:41 +08:00
2026-08-08 10:26:16 +08:00
2026-07-18 00:24:06 +08:00