2.7 KiB
2.7 KiB
IM 漫游消息分页交付
官方契约
已核对腾讯云拉取单聊历史消息文档(文档更新时间 2026-05-22):续页必须把响应 LastMsgTime 作为下一次请求的 MaxTime,同时传递 LastMsgKey。LastMsgTime 不是请求字段。单页返回 Complete = 0 时仍需续拉。
实现和调用约定
server/app/common/service/TencentImService.php保留adminGetRoamMsg原七参签名;第七参非空时覆盖请求MaxTime,不再发送LastMsgTime。漫游单页 timeout 为 15 秒,其他请求的 timeout 默认值和行为未改。- 服务失败返回
success = false、complete = 0,并保留error和rawErrorCode。即使ActionStatus = OK,非零错误码也按失败处理;非法列表、分页字段和消息计数不会回退成空列表并成功完成。 - 新增
app\common\service\ImRoamMessagePager::nextPage(TencentImService $svc, string $operator, string $peer, array $cursor = []): array。每次最多请求一页,不 sleep、不内部重试。 - 成功返回
msgList(未经转换的消息数组)、completed(布尔值)及cursor。游标字段为max_time、last_key、min_time、seen_keys。首次min_time = 0、max_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、没有提交;接口集成由主代理负责。