hyapp-server/docs/flutter对接/语音房火箭Flutter对接.md
2026-06-08 19:39:22 +08:00

296 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 语音房火箭接口对接
## 规则
- 火箭最高 5 级。
- 房间送礼成功后,按礼物 `heat_value` 增加当前等级火箭燃料。
- 当前等级满后立刻点火,并把该等级火箭放入 `pending_launches` 等待发射。
- 点火后下一等级马上开始累计燃料。
- 单次送礼超过当前等级阈值时,超过部分直接作废,不顺延到下一等级。
- 发射延迟由后台 `launch_delay_ms` 配置。
- 发射结算三类奖励:点火人、贡献第一、在房用户。在房用户按发射瞬间房间 presence 抽奖。
## 获取火箭
地址:`GET /api/v1/rooms/{room_id}/rocket`
参数:
| 参数 | 位置 | 必填 | 说明 |
| --- | --- | --- | --- |
| `room_id` | path | 是 | 房间 ID |
返回值:
| 字段 | 说明 |
| --- | --- |
| `enabled` | 火箭是否开启 |
| `levels` | 1 到 5 级配置 |
| `levels[].fuel_threshold` | 等级燃料阈值 |
| `levels[].cover_url` | 火箭小封面图 |
| `levels[].animation_url` | 常态动效 |
| `levels[].launch_animation_url` | 发射动效 |
| `levels[].launched_image_url` | 发射后图 |
| `levels[].in_room_rewards` | 在房奖励候选 |
| `levels[].top1_rewards` | 贡献第一奖励候选 |
| `levels[].igniter_rewards` | 点火人奖励候选 |
| `levels[].*_rewards[].resource_group_id` | 奖励资源组 ID |
| `levels[].*_rewards[].resource_group` | 奖励资源组详情 |
| `levels[].*_rewards[].resource_group.items` | 资源组明细 |
| `levels[].*_rewards[].resource_group.items[].item_type` | `wallet_asset``resource` |
| `levels[].*_rewards[].resource_group.items[].wallet_asset_type` | 金币等奖励资产类型,例如 `COIN` |
| `levels[].*_rewards[].resource_group.items[].wallet_asset_amount` | 金币等奖励数量 |
| `levels[].*_rewards[].resource_group.items[].resource` | 聊天气泡、麦位特效等资源素材 |
| `levels[].*_rewards[].resource_group.items[].resource.resource_type` | 资源类型,例如 `chat_bubble``mic_effect` |
| `levels[].*_rewards[].resource_group.items[].resource.asset_url` | 资源主素材 |
| `levels[].*_rewards[].resource_group.items[].resource.preview_url` | 资源预览图 |
| `levels[].*_rewards[].resource_group.items[].resource.animation_url` | 资源动效 |
| `levels[].*_rewards[].resource_group.items[].duration_ms` | 资源有效期毫秒,`0` 表示永久 |
| `state.current_level` | 当前正在累计的等级 |
| `state.current_fuel` | 当前等级已累计燃料 |
| `state.fuel_threshold` | 当前等级阈值 |
| `state.status` | `charging``completed` |
| `state.rocket_id` | 当前正在累计火箭 ID |
| `state.pending_launches` | 已点火待发射火箭列表 |
| `state.pending_launches[].rocket_id` | 待发射火箭 ID |
| `state.pending_launches[].level` | 待发射等级 |
| `state.pending_launches[].ignited_at_ms` | 点火 UTC 毫秒 |
| `state.pending_launches[].launch_at_ms` | 预计发射 UTC 毫秒 |
| `state.pending_launches[].top1_user_id` | 点火时锁定贡献第一 |
| `state.pending_launches[].igniter_user_id` | 点火人 |
| `state.pending_launches[].cover_url` | 小封面图 |
| `state.last_rewards` | 最近一次发射奖励结果 |
| `state.last_rewards[].resource_group_id` | 本次中奖资源组 ID |
| `state.last_rewards[].resource_group` | 本次中奖资源组详情,字段同上 |
| `server_time_ms` | 服务端 UTC 毫秒 |
`levels[].*_rewards` 表示 `in_room_rewards``top1_rewards``igniter_rewards` 三个奖励池。客户端展示金币数量、奖励天数、聊天气泡、麦位特效时,直接读 `resource_group.items`
## 送礼
地址:`POST /api/v1/rooms/gift/send`
参数:
| 参数 | 必填 | 说明 |
| --- | --- | --- |
| `room_id` | 是 | 房间 ID |
| `command_id` | 是 | 客户端本次送礼幂等 ID |
| `target_type` | 否 | 默认 `user` |
| `target_user_id` | 否 | 单收礼用户 ID |
| `target_user_ids` | 否 | 多收礼用户 ID |
| `gift_id` | 是 | 礼物 ID |
| `gift_count` | 是 | 礼物数量 |
| `pool_id` | 否 | 幸运礼物奖池 ID |
返回值:
| 字段 | 说明 |
| --- | --- |
| `result` | 命令提交结果 |
| `billing_receipt_id` | 钱包扣费回执 |
| `room_heat` | 最新房间热度 |
| `gift_rank` | 最新房间礼物榜 |
| `rocket` | 送礼后的火箭状态,字段同 `state` |
| `lucky_gift` | 本次送礼聚合幸运礼物结果 |
| `lucky_gifts` | 多目标送礼时每个目标的幸运礼物结果 |
## 后台配置
地址:`GET /v1/admin/activity/room-rocket/config`
参数:无
返回值:
| 字段 | 说明 |
| --- | --- |
| `enabled` | 是否开启 |
| `fuelSource` | 固定为 `heat_value` |
| `launchDelayMs` | 点火后延迟发射毫秒 |
| `broadcastEnabled` | 是否发区域或全局飘屏 |
| `broadcastScope` | `region``global``none` |
| `rewardStackPolicy` | `allow_stack``priority_only` |
| `levels` | 5 级配置 |
| `giftFuelRules` | 礼物燃料规则 |
地址:`PUT /v1/admin/activity/room-rocket/config`
参数:
| 参数 | 必填 | 说明 |
| --- | --- | --- |
| `enabled` | 是 | 是否开启 |
| `fuelSource` | 是 | 固定传 `heat_value` |
| `launchDelayMs` | 是 | 点火后延迟发射毫秒 |
| `broadcastEnabled` | 是 | 是否发飘屏 |
| `broadcastScope` | 是 | `region``global``none` |
| `broadcastDelayMs` | 是 | 保留字段,当前点火后立即入 outbox |
| `rewardStackPolicy` | 是 | `allow_stack``priority_only` |
| `levels` | 是 | 必须 5 级 |
| `levels[].fuelThreshold` | 是 | 等级阈值 |
| `levels[].coverUrl` | 否 | 小封面图 |
| `levels[].animationUrl` | 否 | 常态动效 |
| `levels[].launchAnimationUrl` | 否 | 发射动效 |
| `levels[].launchedImageUrl` | 否 | 发射后图 |
| `levels[].inRoomRewards` | 否 | 在房奖励池 |
| `levels[].top1Rewards` | 否 | 贡献第一奖励池 |
| `levels[].igniterRewards` | 否 | 点火人奖励池 |
| `giftFuelRules[].giftId` | 否 | 指定礼物 ID |
| `giftFuelRules[].giftTypeCode` | 否 | 指定礼物类型 |
| `giftFuelRules[].multiplierPpm` | 否 | 燃料倍率1 倍为 `1000000` |
| `giftFuelRules[].fixedFuel` | 否 | 固定燃料 |
| `giftFuelRules[].excluded` | 否 | 是否排除该礼物 |
返回值:同获取后台配置。
## 房间 IM
来源:腾讯云 IM 房间群。
基础字段:
| 字段 | 说明 |
| --- | --- |
| `TIMCustomElem.Ext` | `room_system_message` |
| `event_type` | 事件类型 |
| `room_id` | 房间 ID |
| `event_id` | 消息 ID |
| `occurred_at_ms` | 服务端 UTC 毫秒 |
### room_rocket_fuel_changed
用途:刷新当前等级进度。
字段:
| 字段 | 说明 |
| --- | --- |
| `rocket_id` | 当前累计火箭 ID |
| `level` | 当前累计等级 |
| `added_fuel` | 本次理论燃料 |
| `effective_added_fuel` | 本次实际计入燃料 |
| `overflow_fuel` | 本次作废燃料 |
| `current_fuel` | 当前等级燃料 |
| `fuel_threshold` | 当前等级阈值 |
| `status` | `charging` 或本次满阈值时的 `ignited` |
| `gift_id` | 礼物 ID |
| `gift_count` | 礼物数量 |
### room_rocket_ignited
用途:当前等级满阈值,加入待发射队列;客户端立即把下一等级作为当前进度。
字段:
| 字段 | 说明 |
| --- | --- |
| `rocket_id` | 待发射火箭 ID |
| `level` | 待发射等级 |
| `rocket_level` | 同 `level` |
| `room_short_id` | 房间短号 |
| `rocket_cover_url` | 小封面图 |
| `current_fuel` | 满阈值燃料 |
| `fuel_threshold` | 满阈值 |
| `ignited_at_ms` | 点火时间 |
| `launch_at_ms` | 预计发射时间 |
| `reset_at_ms` | UTC 日重置时间 |
| `top1_user_id` | 点火时贡献第一 |
| `igniter_user_id` | 点火人 |
### room_rocket_launched
用途:火箭已到点发射,客户端播放发射表现。
字段:
| 字段 | 说明 |
| --- | --- |
| `rocket_id` | 已发射火箭 ID |
| `level` | 已发射等级 |
| `next_level` | 当前正在累计等级 |
| `launched_at_ms` | 发射时间 |
| `top1_user_id` | 贡献第一 |
| `igniter_user_id` | 点火人 |
| `rewards_json` | 奖励摘要 |
## 区域或全局飘屏 IM
来源:腾讯云 IM 区域群或全局群。
基础字段:
| 字段 | 说明 |
| --- | --- |
| `TIMCustomElem.Ext` | `im_broadcast` |
| `TIMCustomElem.Desc` | `room_rocket` |
消息体:
| 字段 | 说明 |
| --- | --- |
| `broadcast_type` | `room_rocket` |
| `scope` | `region``global` |
| `room_id` | 房间 ID |
| `room_short_id` | 房间短号 |
| `rocket_id` | 待发射火箭 ID |
| `rocket_level` | 火箭等级 |
| `rocket_cover_url` | 小封面图 |
| `launch_at_ms` | 预计发射时间 |
| `igniter.user_id` | 点火人用户 ID |
| `igniter.short_id` | 点火人短 ID |
| `igniter.nickname` | 点火人昵称 |
| `igniter.avatar` | 点火人头像 |
## 奖励房间 IM
来源:腾讯云 IM 房间群。
基础字段:
| 字段 | 说明 |
| --- | --- |
| `TIMCustomElem.Ext` | `im_broadcast` |
| `TIMCustomElem.Desc` | `room_rocket_reward_granted` |
消息体:
| 字段 | 说明 |
| --- | --- |
| `broadcast_type` | `room_rocket_reward_granted` |
| `scope` | `room` |
| `room_id` | 房间 ID |
| `rocket_id` | 已发射火箭 ID |
| `rocket_level` | 已发射等级 |
| `rewards` | 本次所有获得奖励的人 |
| `rewards[].reward_role` | `in_room``top1``igniter` |
| `rewards[].user.user_id` | 用户 ID |
| `rewards[].user.short_id` | 用户短 ID |
| `rewards[].user.nickname` | 用户昵称 |
| `rewards[].user.avatar` | 用户头像 |
| `rewards[].resource_group_id` | 资源组 ID |
| `rewards[].display_name` | 奖励展示名 |
| `rewards[].icon_url` | 奖励图标 |
| `rewards[].grant_id` | 发奖回执 |
| `rewards[].status` | 发奖状态 |
奖励 IM 用于通知本次哪些人中奖。需要渲染金币数量、奖励天数、聊天气泡或麦位特效素材时,收到 IM 后调用 `GET /api/v1/rooms/{room_id}/rocket`,读取 `state.last_rewards[].resource_group`
## 客户端处理
- 进房先调 `GET /api/v1/rooms/{room_id}/rocket`
- 送礼成功优先用返回的 `rocket` 刷新状态。
- 收到 `room_rocket_fuel_changed` 刷新进度。
- 收到 `room_rocket_ignited` 把该火箭加入待发射队列,并显示下一等级当前进度。
- 收到 `room_rocket_launched` 播放发射表现。
- 收到 `room_rocket_reward_granted` 展示本次所有中奖人和奖励。
- 如果 IM 丢失或乱序,用 GET 接口兜底。
- 不要用普通 `room_gift_sent` 自行推算火箭燃料。
## 高频和延迟处理
- 送礼只同步写 Room Cell 状态和 room outbox不同步请求腾讯 IM。
- 房间进度 IM 走 room outbox 补偿投递,失败会重试。
- 点火后延迟发射通过 RocketMQ delayed wakeup 唤醒;到点后 room-service 重新校验 `rocket_id``level``launch_at_ms`、UTC 重置边界。
- 奖励 IM 一次性包含所有中奖人,避免按用户逐条发 IM。