15 KiB
15 KiB
IM 测试环境接口审核报告(2026-08-20)
1. 审核范围
- 对照文档:
docs/IM-前后端对接文档.md - 测试环境:
https://api.118im.com - WebSocket:
wss://api.118im.com/v0/channels - API Key:已使用测试环境普通 Key,报告中不展开。
- 租户:
default - 测试账号:本轮通过短信验证码固定码
123456和 WebSocket{acc}临时注册,用户 IDusrIPhpZJeJDMI。 - 本轮只新增本报告,不修改原前后端对接文档。
2. 总体结论
测试环境已能跑通基础启动、注册、登录、bootstrap、通讯录空列表、建群、工作台、日报/月报草稿、个人资料、隐私、反馈、设备推送 Token 等主链路。整体方向和产品需求基本匹配:Tinode WebSocket 承担消息与 Topic,/v1/im/* 承担产品化业务接口。
但当前仍不建议直接按整份对接文档全量联调。主要风险是:部分文档接口没有路由或路由兜底错误,部分配置类接口在测试库空数据时返回 500/502,部分通用响应约定没有统一落到所有列表接口,办公协同和转发/群文件相关接口还存在明显缺口。
3. P0/P1 问题
处理备注(2026-08-20):
- 已在提交
6c6d2f6 fix: stabilize im audit endpoints中处理本节前 6 项,以及bootstrap.limits缺失问题。 - 已用本地 Docker 启动服务并调用本地 API 验证通过;测试环境需发布该提交后再复测公网结果。
- 当前短信供应商未接入时,注册、找回密码和敏感操作验证码均按测试码
123456验证;生产接入短信供应商后应切回真实短信策略。
| 优先级 | 问题 | 测试结果 | 影响 | 建议 |
|---|---|---|---|---|
| P0 | 密码重置发码 scene=reset_password 返回 502 |
POST /v1/im/auth/verification-codes,Body {"scene":"reset_password","phone":"15509271990"},带 Idempotency-Key,返回 Cloudflare 502 |
忘记密码无法联调,且不是统一 JSON 错误 | 已处理:短信未接入时保留 challenge,并用测试码 123456 验证;本地 API 验证返回 200 |
| P0 | 登录后二次身份验证挑战返回 502 | POST /v1/im/security/challenges,Body {"scene":"close_youth_mode","channel":"sms"},带 Idempotency-Key,返回 Cloudflare 502 |
关闭青少年模式、敏感操作二次验证不可用 | 已处理:短信发送失败不再使 challenge 失败;带 Idempotency-Key 创建和 123456 verify 本地均返回 200 |
| P0 | 总经理信箱配置和提交返回 500 | GET /v1/im/executive-mailbox/config 返回 INTERNAL_ERROR;按文档提交也返回 500 |
工作台入口开启但页面不可用 | 已处理:修复 im_mailbox_config、im_mailbox_submissions 的 SELECT * 映射问题;本地 config/submit 均返回 200 |
| P1 | 举报原因返回 500 | GET /v1/im/reports/abuse/reasons?target_type=user 返回 INTERNAL_ERROR |
举报页无法打开 | 已处理:补齐 AbuseReason 数据库字段映射;本地返回 200 和 items |
| P1 | 转发目标接口不存在 | GET /v1/im/forward-targets?query= 返回 404 |
4.17~4.20 转发目标页无法联调 | 已处理:新增 /v1/im/forward-targets,返回文件助手和可转发的 P2P/群会话;本地返回 200 |
| P1 | 群文件接口被群详情兜底吞掉 | GET /v1/im/groups/{topic}/files 返回群详情 JSON,而不是文件列表或 404 |
前端会误判接口成功,群文件页数据结构错误 | 已处理:未知一级 tail 不再落到群详情;/files 未实现时本地返回 404 |
4. 章节审核
0. 公共对接约定
通过项:
POST /v1/im/tenants/resolve可未登录调用,返回统一code/data/request_id/server_time。endpoints已返回正确公网地址:https://api.118im.com/v1/im、wss://api.118im.com/v0/channels、https://api.118im.com/v0/file。- 缺 token 访问
GET /v1/im/bootstrap返回统一 JSON:401 AUTH_REQUIRED。
问题:
- 公共约定写分页统一返回
items,next_cursor,has_more,但很多接口只返回items,next_cursor,例如friends、friend-requests、system-notifications、favorites、calls。 - 写请求确实依赖
Idempotency-Key,但部分章节没有重复强调;前端实现时必须按公共约定统一加。
1. 账号注册、登录与身份安全
通过项:
- 企业解析通过,且不泄漏
tenant_id。 - 注册短信发码通过:返回
challenge_id/expires_in_seconds/resend_after_seconds/phone_mask。 - 固定验证码
123456验证通过:返回verification_token。 - WebSocket
hi(tenant=default)返回201,acc user:new login:true注册成功,返回user/token/expires/username。 GET /v1/im/security/realname返回status=unverified, can_submit=true。
问题:
- 已处理待发版复测:
reset_password发码不再因短信供应商未接入返回 502,本地返回 200。 - 已处理待发版复测:
POST /v1/im/security/challenges不再因短信供应商未接入返回 502,本地创建和校验均返回 200。 - 文档目标错误 reason 很完整,但 WS 登录/注册仍主要是 Tinode
ctrl.text/code;稳定params.reason是否全链路返回还需要继续核。
2. 消息首页、全局导航与系统通知
通过项:
GET /v1/im/bootstrap已返回features/permissions/message_policy/security/modules/system_topic。- 最新测试环境已补
entries和entry_badges,包括new_friends/groups/file_assistant/system_messages入口与未读数字段,能支撑通讯录和首页入口显示。 GET /v1/im/system-notifications?limit=5返回items,next_cursor。GET /v1/im/search/conversations?q=a可返回已创建群会话,包含seq/read/unread/public/private。
问题:
- 已处理待发版复测:
bootstrap已补limits.max_file_size/max_text_length/max_forward_targets,本地返回 200。 - 系统通知没有聚合未读接口,当前依赖
bootstrap.entry_badges.system_unread_count,需要确认其真实计算来源和实时更新事件。
3. 单聊会话、会话建立与消息状态
通过项:
- 路由存在
GET /v1/im/conversations/{topic}/context。 - 好友申请接口存在:
POST/GET /v1/im/friend-requests,列表空数据返回正常。 - 好友列表
GET /v1/im/friends返回正常空列表。
问题:
- 文档出现
POST /v1/im/conversations/p2p、GET /v1/im/conversations/{topic}/messages、PATCH /v1/im/conversations/{topic}/settings,路由清单未看到对应明确 handler,需要进一步实测或补实现。 - 单聊发送约束最终仍要靠 WebSocket
pub校验,HTTP 文档里的关系状态和 WS 发布路径需要做端到端用例。
4. 消息输入、媒体内容与消息操作
通过项:
- 收藏基础接口存在,
GET /v1/im/favorites?limit=5正常返回空列表。 - 消息撤回/编辑/回执类路由挂在
/v1/im/topics/下,代码有统一 handler。
问题:
- 已处理待发版复测:
GET /v1/im/forward-targets?query=已新增,本地返回 200。 - 文档里的
POST /v1/im/messages/forward、GET /v1/im/forward-bundles/{bundle_id}未在路由表看到。 - 文件上传仍主要使用
/v0/file,但业务purpose、附件 ACL、群文件登记接口还没有从测试结果证明可用。 - 已处理待发版复测:
bootstrap.limits.max_forward_targets/max_file_size/max_text_length本地已返回。
5. 通讯录、好友关系与黑名单
通过项:
GET /v1/im/friends、GET /v1/im/friend-requests、GET /v1/im/blocks均返回统一成功空列表。GET /v1/im/users/search可调用,空结果返回items:[]。bootstrap.entries.new_friends和entry_badges.new_friends_pending_count已能控制入口和未处理数。
问题:
- 本轮新注册用户搜索自己的 username 返回空列表,可能是“排除自己”的合理策略,也可能是搜索索引/隐私导致,需要用第二个用户互搜确认。
- 新朋友未处理数现在在
bootstrap.entry_badges返回,但需要确认好友申请创建/处理后是否实时准确更新。
6. 群聊创建、资料维护与成员治理
通过项:
POST /v1/im/groups已支持截图里的name + description创建群聊,返回topic/name/description/owner/member_count/version/permissions。GET /v1/im/groups、GET /v1/im/groups/{topic}、GET /summary、GET /members、POST /qrcodes、GET /governance、GET /role-limits、GET /mutes均可用。- 群二维码返回
qr_token/qr_payload/expires_at/group_snapshot,符合需求。
问题:
GET /v1/im/groups/{topic}/members返回的 owner 成员user_id为空字符串,这不适合前端成员列表和后续管理员/转让操作,应返回usr...。- 已处理待发版复测:
GET /v1/im/groups/{topic}/files不再返回群详情,本地返回 404。 - 已处理待发版复测:
GET /v1/im/groups/{topic}/announcements不再返回群详情,未知一级 tail 统一返回 404。 - 文档里的
POST /v1/im/group-invitations/{invitation_id}/accept未在路由表看到;当前更像是走群内/invitations和扫码 join-request。
7. 文件下载、收藏管理与聊天记录检索
通过项:
GET /v1/im/favorites可用。- 收藏批量、删除、转发相关 handler 在
/favorites和/favorites/下存在。
问题:
- 群文件接口不可用,且被错误兜底。
- 文档中的聊天记录搜索、媒体筛选、上下文接口挂在
/v1/im/topics/{topic}/...,需要有真实消息后再端到端验证;本轮未创建聊天消息。 - 文件下载鉴权复用
/v0/file,本轮未上传真实附件,ACL 未验证。
8. 实时语音与视频通话
通过项:
GET /v1/im/calls?limit=5返回正常空列表。- 文档对通话主体设计合理:WebSocket 信令为主,HTTP 只做记录查询。
问题:
- 需要真机或至少两个 WS 用户做 call
started/ringing/accept/hang-up端到端;本轮只验证 HTTP 通话记录列表。 - Push、好友关系、拉黑、并发通话校验没有通过测试环境验证。
9. 企业工作台与办公协同
通过项:
GET /v1/im/workbench返回模块列表和layout_version。GET /v1/im/organization/departments返回正常空列表。- 日报列表、日报统计、日报草稿创建通过。
- 月报列表、月报统计、月报草稿创建通过。
- 会议创建按文档 Body 通过。
问题:
GET /v1/im/meetings?limit=5返回 405;文档没明确会议列表接口,但会议通知页面通常需要列表,设计上应补GET /v1/im/meetings。GET /v1/im/organization/search?q=空关键词返回 400;文档示例写q=,需明确前端空关键词应不请求还是后端返回空列表。GET /v1/im/executive-mailbox/config和提交均返回 500,总经理信箱不可联调。modules[].unread_count当前全 0,需要确认是否真实 badge,还是静态占位。
10. 个人资料、通用设置、隐私与青少年模式
通过项:
GET /v1/im/me、GET /v1/im/me/profile、GET /v1/im/me/privacy、GET /v1/im/settings/youth-mode均可用。POST /v1/im/me/qrcodes可用,返回qr_token/qr_payload/display_profile/expires_at。PUT /v1/im/devices/{device_id}/push-token可用,能登记 APNs 测试 token。GET /v1/im/app/releases/latest?platform=ios&version=1.0.0可用。
问题:
- 文档写应用更新参数为
current_version,测试使用version也能返回;实现似乎不消费当前版本参数,建议统一字段名,避免客户端多套逻辑。 - 青少年模式关闭依赖二次验证,而二次验证挑战当前 502。
- Android 系统权限说明多为客户端能力,本轮无法通过服务端验证。
11. 反诈安全、举报与意见反馈
通过项:
POST /v1/im/security/urls/check可用,安全 URL 返回decision=allow/risk_level=low。GET /v1/im/feedback/config可用。POST /v1/im/feedback可用,返回feedback_id/status=received。
问题:
GET /v1/im/reports/abuse/reasons?target_type=user返回 500,举报页阻塞。- 风控 challenge confirm 路由存在,但需要先有业务接口返回
RISK_CONFIRMATION_REQUIRED后才能完整验证。 - 举报提交需要真实目标对象和原因数据,本轮因原因接口 500 未继续提交。
12. 联调实施清单
建议把当前验收顺序调整为:
- 已处理待发版复测:密码重置 502、二次验证 502、总经理信箱 500、举报原因 500。
- 部分已处理待发版复测:转发目标已补、群文件路径错误兜底已修;消息转发/Forward Bundle 缺路由、群成员
user_id为空仍待处理。 - 统一公共协议:所有列表是否必须返回
has_more;所有写接口是否都必须Idempotency-Key;bootstrap.limits是否需要补。 - 两用户端到端:好友申请、同意、P2P context、普通消息、已读、拉黑、删除好友。
- 群端到端:邀请成员、入群审批、公告、群文件、管理员、禁言、群主转让。
- 真机端到端:文件上传下载、APNs/FCM 推送、WebRTC 通话。
5. 代表性实测结果
| 接口 | 方法 | 状态 | 结论 |
|---|---|---|---|
/v1/im/tenants/resolve |
POST | 200 | 企业解析正常,endpoint host 正确 |
/v1/im/auth/verification-codes register |
POST | 200 | 注册发码正常 |
/v1/im/auth/verification-codes/{id}/verify |
POST | 200 | 固定验证码 123456 正常 |
WebSocket hi + acc |
WS | 201/200 | 注册并登录成功 |
/v1/im/auth/verification-codes reset_password |
POST | 502 | 已处理待发版复测;本地返回 200 |
/v1/im/security/challenges |
POST | 502 | 已处理待发版复测;本地创建和 123456 校验返回 200 |
/v1/im/bootstrap |
GET | 200 | 已包含 entries/entry_badges;已补 limits 待发版复测 |
/v1/im/groups |
POST | 200 | 创建群聊含 description 正常 |
/v1/im/groups/{topic}/members |
GET | 200 | 可用,但成员 user_id 为空 |
/v1/im/groups/{topic}/files |
GET | 200 | 已处理待发版复测;未实现时本地返回 404,不再误返回群详情 |
/v1/im/forward-targets |
GET | 404 | 已处理待发版复测;本地返回 200 |
/v1/im/executive-mailbox/config |
GET | 500 | 已处理待发版复测;本地 config/submit 返回 200 |
/v1/im/reports/abuse/reasons |
GET | 500 | 已处理待发版复测;本地返回 200 |
/v1/im/feedback |
POST | 200 | 意见反馈提交正常 |
/v1/im/devices/{device_id}/push-token |
PUT | 200 | 推送 token 登记正常 |
6. 本轮测试产生的数据
- 创建临时用户:
usrIPhpZJeJDMI - 创建群:
grpcNdeRoa_VO0 - 创建会议:
mtg_vN4182ncLyi5wp4A - 创建日报草稿:
dr_MdAFCj2fYTkBjiq8 - 创建月报草稿:
mr_eWjm2hpuzSsqcIcH - 创建反馈:
fb_TEJYaStZn9i0JSun - 登记设备:
audit-device
这些数据均在测试租户 default 下,可按需要由测试库清理。