Files
2026-09-09 15:47:48 +08:00

2.7 KiB

IM 漫游消息分页交付

官方契约

已核对腾讯云拉取单聊历史消息文档(文档更新时间 2026-05-22):续页必须把响应 LastMsgTime 作为下一次请求的 MaxTime,同时传递 LastMsgKeyLastMsgTime 不是请求字段。单页返回 Complete = 0 时仍需续拉。

实现和调用约定

  • server/app/common/service/TencentImService.php 保留 adminGetRoamMsg 原七参签名;第七参非空时覆盖请求 MaxTime,不再发送 LastMsgTime。漫游单页 timeout 为 15 秒,其他请求的 timeout 默认值和行为未改。
  • 服务失败返回 success = falsecomplete = 0,并保留 errorrawErrorCode。即使 ActionStatus = OK,非零错误码也按失败处理;非法列表、分页字段和消息计数不会回退成空列表并成功完成。
  • 新增 app\common\service\ImRoamMessagePager::nextPage(TencentImService $svc, string $operator, string $peer, array $cursor = []): array。每次最多请求一页,不 sleep、不内部重试。
  • 成功返回 msgList(未经转换的消息数组)、completed(布尔值)及 cursor。游标字段为 max_timelast_keymin_timeseen_keys。首次 min_time = 0max_time = 4294967295;不使用本地归档最大时间作为扫描下界。
  • seen_keys 保存当前 max_time 这一秒已经使用的游标键,下一页时间降低后重置。因此同秒多页可以继续,同秒 A→B→A 循环和直接重复会明确失败。上层应保存完整游标,并且仅在本页消息持久化成功后提交新游标。
  • 请求账号、消息双方账号、消息键/时间/内容类型、响应游标均校验;跨患者消息立即抛错。Complete = 0 却缺失有效时间/键、游标倒退到更新时刻或游标重复均不返回完成。
  • Pager 失败抛出 RuntimeException,云端 error 保留为异常消息,rawErrorCode 保留为异常 getCode()。上层保留本轮游标,并在后续步骤或下一轮重试。

验证

  • php server/tests/ImRoamMessagePagerTest.php:通过,覆盖同秒多页、参数兼容、请求字段、15 秒 timeout、云端错误/错误码、网络错误、非法响应、缺失/重复/循环游标、跨患者消息、非法消息、请求游标和空会话完成。
  • 三个改动/新增 PHP 文件均通过 php -l
  • 本子任务文件通过 git diff --check
  • 测试不初始化应用环境,采用虚构配置、NullLogger 和覆盖 httpPost 的替身。未读取业务数据库、未真实请求腾讯云或其他外部服务。

本子任务没有修改 DiagnosisLogic.php、没有提交;接口集成由主代理负责。