# 站内消息接口 ## 消息撤回 `POST /conversations/{conversationId}/messages/{messageId}/recall` 当前登录用户从 JWT subject 解析。请求无 body,只有会话成员中的原发送者可在消息创建后两分钟内撤回;截止瞬间仍允许撤回。会话不存在返回 404/8305,跨会话、非成员或非发送者返回 403/2002,窗口结束返回 409/8307,并发状态冲突返回 409/8308。 成功响应为白名单 `MessageResponse`: ```json { "code": 200, "data": { "id": 81, "conversationId": 12, "senderUserId": 7, "content": "消息已撤回", "status": "RECALLED", "recalledAt": "2026-09-10T10:02:00", "createdAt": "2026-09-10T10:00:00", "isRead": false } } ``` 撤回会在同一事务中将数据库正文覆盖为固定占位文本 `消息已撤回`,并将状态从 `SENT` 更新为 `RECALLED`。重复请求幂等返回当前撤回结果,不重复写成功审计。原正文不写入审计、异常、缓存、消息队列或历史表。 `TALENT_INVITATION` 会话继续使用 `senderScope=CURRENT_USER` 或 `OTHER_PARTICIPANT`,不返回对方的 `senderUserId`;`DIRECT` 会话保留既有 `senderUserId` 兼容字段。撤回消息仍保留在时间线中,但不计入未读数,也不会因标记已读新增 `message_reads`。 ## 既有消息接口兼容 原有会话列表、会话详情、发送消息、消息列表和标记已读接口路径不变。消息列表和发送响应增加 `status`,撤回消息的 `content` 统一为占位文本,其他既有字段语义保持不变。