spec.md 4.7 KB

040 用户注销翻悔期

用户确认的规则

  • 仅用户端普通用户(user_type=0):注销时设置 del_flag=1,记录截止时间,默认申请时刻起 7 天。
  • 只有截止时间严格大于服务端当前时间,且该账号未被平台停用,身份认证成功且用户明确确认恢复后才恢复 del_flag=0 并清空截止时间。历史删除账号无截止时间,不能恢复。
  • 期限到达或超过后保持删除状态;刷新 token、旧会话和静默请求不能恢复账号。
  • 其他商家和骑手账号不进入此流程,保留原有行为。

必须覆盖的边界

  • 注销沿用未完成订单检查;注销须校验有效会话并使现有用户端会话失效。用户确认旧 token 已淘汰,所有 @Auth 接口一律要求有效 Redis 会话;不再兼容旧 JWT 放行。
  • 手机号登录、已绑定第三方登录、第三方绑定手机号和设备信任确认各入口需在身份验证成功后统一返回确认提示,仅确认接口可恢复;恢复条件通过数据库原子更新再次验证,避免截止时间竞争、禁用账号被恢复和历史删除账号误恢复。
  • 手机号和第三方身份的查询仅将有未来截止时间的用户纳入候选,不能影响同手机号商家、骑手;多条候选须安全拒绝,避免误恢复或误创建账号。
  • 删除状态与截止时间同时写入同一事务;原会话撤销和新会话签发不得使注销并发登录时绕过注销状态。
  • 现有第三方绑定唯一索引保留;过期后的旧绑定如何解除和重新注册是独立问题,本期不能擅自删除身份绑定或历史业务资料。
  • 数据库调整写入 updatesql/sql.md,由开发者手动执行;补充用户 App 接入文档及相关代码注释。

实现边界

  • 新字段为 info_user.cancellation_deadline_at,仅由注销/恢复专用 SQL 写入;通用实体写入不接收此字段。
  • 每次注销申请读取字典 user_cancellation_grace_days 的首条正常状态数据的 dict_value,支持整数 1–365 天;字典缺失、停用、空值、非整数、越界或读取异常均回退 7 天。移除原 user.cancellation.grace-days 启动配置。
  • 数据库行锁覆盖用户登录签发会话与注销;原子恢复 SQL 再校验角色、停用状态、删除状态及截止时间。
  • 平台直接删除会清空截止时间,不能被当成主动注销恢复。
  • 不物理删除账号、历史订单、钱包或第三方绑定;不新增定时清理任务。
  • 未完成订单检查沿用已有逻辑,本期不扩展订单业务;原有短信及设备信任认证策略保持现状。

2026-10-30 字典管理增量

管理员通过现有字典管理修改天数,保存刷新字典缓存后对下一次注销申请生效,无须重启。配置只决定新申请的截止时间;已有申请的截止时间不重算,恢复登录不读取新配置。App 继续使用接口返回的 graceDays 与 cancellationDeadlineAt,无请求参数变更。

2026-11-05 登录前确认恢复(当前约定)

  • 本节替代身份验证成功即自动恢复的行为。注销前弹窗由前端控制;注销接口仍返回 graceDays 和 cancellationDeadlineAt,保留字典及默认7天规则。
  • 所有普通用户认证入口验证身份后,若处于冷静期,只返回 status=cancellationConfirm、remainingDays、cancellationDeadlineAt、confirmationKey、expiresInSeconds,不恢复账号、不签发登录token、不记录设备信任或写入第三方绑定/推送资料。
  • 剩余天数按服务端距截止时间的剩余毫秒除以24小时向上取整,未到期至少1天。等于或超过截止时间不能恢复。
  • 用户明确点击“继续登录,恢复账号”后,POST /infouser/user/confirmCancellationLogin,仅提交 confirmationKey。凭证有效期最长5分钟、一次性使用,绑定已验证账号/身份/设备上下文、本次注销截止时间和服务端随机周期标识,不接收客户端指定的userId或恢复标志。
  • 确认时重新校验账号、截止时间、手机号和第三方绑定/设备信任;拒绝过期、重放、停用、平台删除及旧注销周期的凭证。恢复和会话签发在同一数据库事务,失败回滚。重新注销或恢复会使旧周期凭证全部失效,防止数据库秒精度导致截止时间碰撞。
  • “继续注销,不登录”不调用确认接口,前端丢弃凭证并结束登录,保留注销状态;再次登录重新验证身份。
  • 手机号、Apple/Google/LINE、短信绑号、设备确认及LINE网页回调均覆盖;网页回调返回确认参数而非token,App再调同一确认接口。
  • 无新增数据库结构;本轮仅后端、六份国际化提示与前端接入文档,不创建分支,不自动提交/推送。