超级群私有频道操作指南
私有频道用于“只让指定成员看到/参与”的分区:创建时 type=private(默认),通过频道成员或用户组绑定授权。rev23 起服务端按频道消息路由强制鉴权:私有频道发送者必须是频道成员(否则 1003),收件人仅频道成员;非成员在群历史中也看不到该频道消息。
概念
| 动作 | 接口 | 语义 |
|---|---|---|
| 创建私有频道 | channel/create,type 省略或 private | 默认私有 |
| 加/移成员 | channel/members/add|remove | 维护频道成员(决定发送权与接收范围) |
| 查成员 | channel/members/list | 返回频道成员 |
| 转公开 | channel/type/set,type=public | 转公开后群成员可发送并自动加入,历史对群成员可读 |
| 用户组授权 | channel/usergroup/bind | 用户组成员计入频道有效成员(需仍是群成员) |
- 频道成员/用户组绑定参与频道消息鉴权(rev23):私有频道发送/读取要求频道成员,非成员 1003。
- 列表可见性(rev24):private 频道只对频道有效成员或群主/管理员出现在频道列表;群内其他人看不到该频道。
- 私有频道没有密码、邀请链接或审批流;授权就是成员列表 + 用户组绑定。
- 频道有效成员 = 显式成员 ∪ 绑定用户组成员,且必须仍是群成员(被移出群后失去接收资格)。
rev23 起服务端强制:私有频道发送要求频道成员(1003),接收/历史按频道成员收窄(群内非成员不会收到该频道消息)。rev24 进一步把 private 频道从非成员的频道列表中隐藏(Open API 需传 userId 才按该用户过滤;匿名只返回 public)。
仍有未覆盖项:客户端 searchMessages 未按频道裁剪(Open API 搜索已过滤)、typing 未按频道收窄;不要把搜索当作私有频道隔离手段。频道成员管理页也需宿主实现。
前置条件
- 服务端已启动,Open API 基址
http://127.0.0.1:8080/im/v2。 - 应用已创建并持有
appkey/appSecret;Open API 需要App-Key+Nonce+Timestamp+Signature。 - 已创建
groupType=super的超级群;未开通supergroup服务时相关接口返回1021。 - 自托管版无购买/计费/套餐流程;频道与用户组不单独收费(不适用项)。
- 已创建 super 群;已规划频道与用户组的授权关系。
步骤
- 创建私有频道
POST /supergroup/channel/create,type省略(默认 private)或显式传private。 - 确认列表可见性
调用
supergroup/channel/list:客户端 REST 按当前用户过滤 private 频道;Open API 传userId按该用户过滤(缺省匿名只返回 public)。详见「私有频道列表可见性」。 - 添加频道成员
POST /supergroup/channel/members/add,传userIds数组;成员必须是已注册用户。 - 查询与校验成员
channel/members/list返回成员;业务在发送前用它判断当前用户是否有权。 - 按用户组批量授权(可选)
创建用户组并绑定频道:
channel/usergroup/bind。适合“部门/角色”批量授权,见「用户组操作指南」。 - 切换公开/私有
channel/type/set在 private/public 间切换;切换不会清空成员列表,但公开后成员限制不再有意义。 - 配额校验与错误码
单群频道数 ≤50、单频道绑定用户组 ≤10(产品口径);服务端未强制,业务侧在创建/绑定前统计。
错误码:
1001参数非法、1004用户或群不存在(supergroup 实现)、1003无权限、1021服务未开通。
参数表
| 操作 | 方法与路径 | 请求体 |
|---|---|---|
| 创建私有频道 | POST /im/v2/supergroup/channel/create | {groupId,channelId,name?,type:"private"} |
| 添加成员 | POST /im/v2/supergroup/channel/members/add | {groupId,channelId,userIds[]} |
| 移除成员 | POST /im/v2/supergroup/channel/members/remove | {groupId,channelId,userIds[]} |
| 成员列表 | POST /im/v2/supergroup/channel/members/list | {groupId,channelId} |
| 切换类型 | POST /im/v2/supergroup/channel/type/set | {groupId,channelId,type} |
| 绑定用户组 | POST /im/v2/supergroup/channel/usergroup/bind | {groupId,channelId,userGroupId} |
| 查绑定 | POST /im/v2/supergroup/channel/usergroup/list | {groupId,channelId?} 或 {groupId,userGroupId?} |
示例
准备签名变量(所有示例共用)
# 生成签名(Open API:hex(sha1(appSecret + nonce + timestamp)))
export APP_SECRET='<appSecret>'
export NONCE="$(node -e "console.log(Math.random().toString(36).slice(2,10))")"
export TS="$(node -e "console.log(Date.now())")"
export SIG="$(node -e "const c=require('crypto');console.log(c.createHash('sha1').update(process.env.APP_SECRET+process.env.NONCE+process.env.TS).digest('hex'))")"创建私有频道 → 加成员 → 查成员
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/channel/create" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","channelId":"vip","name":"VIP 频道","type":"private"}'
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/channel/members/add" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","channelId":"vip","userIds":["alice","bob"]}'
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/channel/members/list" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","channelId":"vip"}'绑定用户组(批量授权)
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/usergroup/create" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","userGroupId":"ug_vip","name":"VIP 用户"}'
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/usergroup/members/add" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","userGroupId":"ug_vip","userIds":["carol"]}'
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/channel/usergroup/bind" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","channelId":"vip","userGroupId":"ug_vip"}'
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/channel/usergroup/list" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","channelId":"vip"}'转公开
curl -sS -X POST "http://127.0.0.1:8080/im/v2/supergroup/channel/type/set" \
-H 'App-Key: demo' \
-H "Nonce: $NONCE" \
-H "Timestamp: $TS" \
-H "Signature: $SIG" \ \
-H 'content-type: application/json' \
-d '{"groupId":"sg_demo","channelId":"vip","type":"public"}'常见问题
私有频道能阻止群成员看到消息吗?
当前不能。消息不带 channelId,成员关系不参与投递鉴权;必须业务侧校验或改用独立群。
私有频道支持邀请链接/密码吗?
不支持。授权只有成员列表与用户组绑定。
切换为公开后成员列表还在吗?
在,但公开后不再按成员限制;业务侧不要再用它做权限判断。
单频道能绑多少用户组?
融云口径 10 个;本项目未强制,需业务侧校验。
频道成员必须是群成员吗?
服务端只校验用户存在;业务上应先确保其已在超级群中。
相关链接
- 超级群场景指南:模型、配额与边界总览
- 超级群会话类型:rev22 的
SUPER_GROUP(10)与存量 2+super 兼容 - 超级群类型迁移与兼容 FAQ
- 频道 Open API 参考
- 用户组 Open API 参考
- 创建群组 Open API
- 频道操作指南
- 用户组操作指南