本文主要介绍企业版/商业版账号如何为一场会议生成多个专属参会链接,让外部用户通过链接直接入会,并获取参会者身份信息。
普通预约会议与网络研讨会(Webinar)都支持专属参会链接,但使用的是两套独立的接口:会议走 /v1/meetings/customer-short-url,研讨会走 /v1/webinars/customer-short-url,两者不可混用。
整体流程如下:

appId、 sdkId、secretId 和 secretKey。专属参会链接相关接口(会议与研讨会均是)暂不支持 OAuth 2.0 鉴权,必须使用 AK/SK 签名验证方式;操作者需为会议创建者本人。meeting_id:会议唯一 ID;meeting_code:9 位会议号。/v1/meetings/customer-short-url 不支持个人会议号会议和网络研讨会,仅支持普通预约会议;网络研讨会请改用 /v1/webinars/customer-short-url,两套接口的差异见第二节。两者均支持企业品牌化链接。对比项 | 普通预约会议 | 网络研讨会(Webinar) |
|---|---|---|
创建链接 |
|
|
获取链接 |
|
|
| 创建在请求体,获取在路径中 | 创建在请求体,获取在 query 中 |
响应中的链接字段名 |
|
|
获取链接是否分页 | 否,一次返回全部 | 是,须传 |
指定参会者身份 | 不支持 | 支持, |
控制打开链接的行为 | 不支持,打开即入会 | 支持, |
链接数量上限 | 一场会议最多 300 条 | 官方未标注上限 |
鉴权方式 | AK/SK 签名验证(不支持 OAuth 2.0) | AK/SK 签名验证(不支持 OAuth 2.0) |
不支持的会议类型 | 个人会议号会议、网络研讨会 | — |
两套接口的
customer_data结构、编码方式完全一致,回读customer_data的方式也基本一致(见第五节),因此业务侧只需按会议类型切换调用的接口,customer_data的生成与解析逻辑可以复用。
为指定会议创建一个专属参会链接,一次调用生成一个链接。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | POST |
鉴权方式 | AK/SK 签名验证 |
操作者权限 | 会议创建者 |
请求参数
参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
meeting_id | 是 | String | 会议 ID |
customer_data | 是 | String | 用户专属字段,长度不超过 256 字节,需对下方固定结构做 Base64 编码 |
operator_id | 是 | String | 操作者 ID,与 operator_id_type 配合使用 |
operator_id_type | 是 | Integer | 操作者 ID 类型,1 表示 userid |
customer_data 需按以下结构组织整体做 Base64 编码:
{
"ver": "1.0",
"userData": "自定义字段"
}注意:
userData的内容可以用来标识参会者身份,也可以用来标识参会者来源。另外,Base64 编码仅用于传入customer_data;通过 RestAPI / WebHook 回读到的customer_data为明文,无需再次解码,详见第五节。
请求示例
POST https://api.meeting.qq.com/v1/meetings/customer-short-url
Content-Type: application/json
{
"operator_id": "KM4Ss4T******1JiK",
"operator_id_type": 1,
"customer_data": "eyJ2ZXIiOiAiMS4wIiwgInVzZXJEYXRhIjoiY2h1eGlhb2h1b2RvbmcxMDAxIn0=",
"meeting_id": "7567173273889276131"
}响应示例
{
"meeting_short_url_customer_data": {
"customer_data": "eyJ2ZXIiOiAiMS4wIiwgInVzZXJEYXRhIjoiY2h1eGlhb2h1b2RvbmcxMDAxIn0=",
"meeting_short_url": "https://meeting.tencent.com/dm/jCTxxxxxxx8C"
}
}响应中的 meeting_short_url 即为该参会者(或该来源)的专属入会链接。
用于拉取指定会议已生成的全部专属参会链接及其 customer_data。适用于链接丢失后的找回,以及业务侧与腾讯会议侧的数据对账。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | GET |
鉴权方式 | AK/SK 签名验证 |
操作者权限 | 会议创建者 |
请求参数
参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
meeting_id | 是 | String | 会议 ID,路径参数 |
operator_id | 是 | String | 操作者 ID,与 operator_id_type 配合使用 |
operator_id_type | 是 | Integer | 操作者 ID 类型,1 表示 userid |
请求示例
GET https://api.meeting.qq.com/v1/meetings/7567173xxxxxxxx6131/customer-short-url?operator_id=14411xxxxxxxxxx002&operator_id_type=1响应示例
{
"meeting_short_url_customer_data": [
{
"customer_data": "test",
"meeting_short_url": "https://meeting.tencent.com/dm/OkyxxxxiT5j7"
}
]
}网络研讨会的专属链接不仅能标识参会者,还能直接决定该参会者进来后是嘉宾还是观众。这意味着业务侧无需再单独调用嘉宾列表接口,把「谁是嘉宾」这件事在生成链接时就固定下来了——嘉宾链接与观众链接分开下发即可。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | POST |
鉴权方式 | AK/SK 签名验证 |
操作者权限 | 会议创建者 |
请求参数
参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
meeting_id | 是 | String | 会议的唯一 ID |
customer_data | 是 | String | 用户专属字段,长度不超过 256 字节,编码结构与 3.1 完全一致 |
is_webinar_guest | 是 | Uint32 | 通过该链接入会的用户身份。 |
is_join_meeting | 是 | Integer | 打开链接后的行为。 |
operator_id | 是 | String | 操作者 ID,与 operator_id_type 配合使用 |
operator_id_type | 是 | Integer | 操作者 ID 类型,1 表示 userid |
instanceid | 是 | Integer | 用户的终端设备类型,如 1:PC,2:Mac,3:Android,4:iOS,5:Web,8:小程序。该参数官方标为必填 |
请求示例
POST https://api.meeting.qq.com/v1/webinars/customer-short-url
Content-Type: application/json
{
"operator_id": "KM4Ss4T******1JiK",
"operator_id_type": 1,
"customer_data": "eyJ2ZXIiOiAiMS4wIiwgInVzZXJEYXRhIjoiY2h1eGlhb2h1b2RvbmcxMDAxIn0=",
"meeting_id": "7567xxxxxxxx9276131",
"is_webinar_guest": "1",
"is_join_meeting": "1",
"instanceid": 1
}响应示例
{
"webinar_short_url_customer_data": {
"customer_data": "eyJ2ZXIiOiAiMS4wIiwgInVzZXJEYXRhIjoiY2h1eGlhb2h1b2RvbmcxMDAxIn0=",
"webinar_short_url": "https://meeting.tencent.com/dm/jCTxxxxxxx8C",
"is_webinar_guest": "1",
"is_join_meeting": 1
}
}注意响应字段名是
webinar_short_url,不是普通会议的meeting_short_url;同时响应会回显is_webinar_guest与is_join_meeting,业务侧落库时建议连同这两个字段一起存,避免后续分不清哪条链接是嘉宾链接。
拉取指定研讨会已生成的专属参会链接。与普通会议不同,该接口必须分页查询,且 meeting_id 在 query 中传递。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | GET |
鉴权方式 | AK/SK 签名验证 |
操作者权限 | 会议创建者 |
请求参数
参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
meeting_id | 是 | String | 会议的唯一 ID,query 参数 |
page_size | 是 | Int | 分页大小,默认 10,最大 50 |
page | 是 | Int | 页码,从 1 开始 |
operator_id | 是 | String | 操作者 ID,与 operator_id_type 配合使用 |
operator_id_type | 是 | Integer | 操作者 ID 类型,1 表示 userid |
请求示例
GET https://api.meeting.qq.com/v1/webinars/customer-short-url?meeting_id=7567173xxxxxxxx6131&page_size=10&page=1&operator_id=14411xxxxxxxxxx002&operator_id_type=1响应示例
{
"webinar_short_url_customer_data": [
{
"customer_data": "test",
"webinar_short_url": "https://meeting.tencent.com/dm/jCTxxxxxxx8C",
"is_webinar_guest": 1,
"is_join_meeting": 1
},
{
"customer_data": "test2",
"webinar_short_url": "https://meeting.tencent.com/dm/jCTxxxxxxx8D",
"is_webinar_guest": 1,
"is_join_meeting": 1
}
],
"current_page": 1,
"current_size": 2,
"total_count": 2,
"total_page": 1
}响应中的 total_count 与 total_page 可用于与业务侧的链接下发记录做数量对账;对账时需按 total_page 逐页拉取,不要只取第一页。
无论链接是通过会议接口还是研讨会接口生成的,回读 customer_data 的方式都一致,拿到后即可根据链接用途分别完成身份识别或来源归因。
注意传入与回读的编码差异:生成链接时
customer_data需按 3.1 的规则做 Base64 编码;而通过腾讯会议 RestAPI 或 WebHook 回调回读到的customer_data是明文,无需再次进行 Base64 解码(见官方说明)。
共有五个获取途径,按场景选择:
途径 | 适用会议类型 | 适用场景 |
|---|---|---|
「用户入会」事件回调 | 会议、研讨会 | 被动接收,实时性最好,推荐作为主路径 |
「用户进入等候室」事件回调 | 会议(开启等候室) | 被动接收;参会者进入等候室时即可拿到 |
「获取实时等候室成员列表」接口 | 会议 | 主持人放行前主动核对等候室名单 |
「查询实时会中成员列表」接口 | 会议、研讨会 | 主动拉取会中名单,研讨会场景下的主要查询路径 |
「获取参会成员明细」接口 | 会议、研讨会 | 会后离线拉取完整参会名单(含已离会者),补齐实时途径的缺口 |
官方接口描述与上述途径一致:
customer_data可通过「用户入会、用户进入等候室等事件」或「获取等候室成员列表 / 获取参会成员列表的 API」回读。
参会者入会时,腾讯会议会向配置的 Webhook 推送 meeting.participant-joined 事件,customer_data 位于 payload[].extend_info 中。
项目 | 内容 |
|---|---|
官方文档 | |
事件名 |
|
字段路径 |
|
回调示例(节选):
{
"event": "meeting.participant-joined",
"trace_id": "e7aa65dd-f7e6-4b62-912c-2035173b34a9",
"payload": [{
"operate_time": 1609313201465,
"operator": {
"userid": "tester",
"ms_open_id": "WMfgHRYj6m36mcDGtK",
"user_name": "tester_name",
"instance_id": "2"
},
"meeting_info": {
"meeting_id": "13339451618278424869",
"meeting_code": "445999969",
"subject": "tester-2的快速会议"
},
"extend_info": {
"customer_data": "test customer data"
}
}]
}会议开启等候室后,与会者加入会议时会先进入等候室等待主持人放行;与会者每次进入等候室都会触发该事件,customer_data 位于 payload[].extend_info 中。相比「用户入会」事件,该事件的价值在于放行前就能拿到身份:可据此核对进入者是否为预期参会者,再决定是否放行。
项目 | 内容 |
|---|---|
官方文档 | |
事件名 |
|
字段路径 |
|
触发时机 | 会议开启等候室时,与会者每次进入等候室都会触发 |
回调示例(节选):
{
"event": "meeting.participant-joined-waiting-room",
"trace_id": "e7aa65dd-f7e6-4b62-912c-2035173b34a9",
"payload": [{
"operate_time": 1609313201465,
"operator": {
"userid": "tester",
"ms_open_id": "WMfgHRYj6m36mcDGtK",
"user_name": "tester_name",
"nick_name": "saaaa",
"instance_id": "2"
},
"meeting_info": {
"meeting_id": "13339451618278424869",
"meeting_code": "445999969",
"subject": "tester-2的快速会议"
},
"extend_info": {
"customer_data": "test customer data"
}
}]
}该事件先于「用户入会」事件触发;若参会者一直未被放行或被移出等候室,「用户入会」事件不会触发,此时等候室事件是拿到
customer_data的唯一回调途径。如需感知离开等候室的动作,可另行订阅用户离开等候室(meeting.participant-left-waiting-room)等事件。
适用于需要主动拉取(而非被动接收回调)的场景,例如主持人在放行前核对等候室中的人员名单。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | GET |
操作者权限 | 会议创建者、主持人、联席主持人,或具备会控权限的用户 |
请求示例:
GET https://api.meeting.qq.com/v1/meetings/144115214488302892/waiting-room-participants?userid=owner1&page_size=20响应示例:
{
"total_count": 2,
"current_size": 1,
"current_page": 1,
"total_page": 1,
"meeting_id": "144115214488302892",
"meeting_code": "746950080",
"subject": "asfagaqga=",
"schedule_start_time": 1572085800,
"schedule_end_time": 1572089400,
"participants": [
{
"userid": "test1",
"user_name": "dBVzdDE=",
"app_version": "1.12.321",
"instanceid": 1,
"open_id": "xxxxxxx123xxxxxx",
"ms_open_id": "enim proident v"
},
{
"userid": "test2",
"user_name": "dGvzdDI=",
"app_version": "1.12.321",
"instanceid": 1,
"customer_data": "test",
"open_id": "xxxxxxx123xxxxxx",
"ms_open_id": "enim proident k"
}
]
}等候室机制主要面向普通会议,网络研讨会的观众通常不经过等候室。因此研讨会场景下建议改用该接口主动拉取会中名单,普通会议在会议已开始后同样适用。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | GET |
鉴权方式 | AK/SK 鉴权、OAuth 2.0 鉴权 |
操作者权限 | 企业超级管理员、会议创建者、主持人、同企业的联席主持人 |
分页参数 |
|
请求示例:
GET https://api.meeting.qq.com/v1/meetings/17970399xxxxxxxx37836/real-time-participants?operator_id=test_restapi_user_496&operator_id_type=1&page=1&page_size=20响应中 participants[] 的每一项在参会者通过专属链接入会时会带上 customer_data,同时可拿到 user_role(判断嘉宾/观众/主持人)与 join_time:
{
"meeting_id": "179xxxxxxxxxxxx37836",
"meeting_code": "xxxxxxxx",
"status": "4",
"participants": [{
"userid": "test_restapi_user_497",
"ms_open_id": "68+lhnxxxxxxxxxxxxxxxxhqQC7o4kFb3",
"user_name": "dGVzxxxxxxxxxxxxxxJfNDk3",
"join_time": "16xxxxxxx11",
"instanceid": 2,
"user_role": 0,
"join_type": 1,
"customer_data": "test"
}],
"current_page": 1,
"current_size": 1,
"total_count": 1,
"total_page": 1
}该接口只返回当前仍在会中的成员,用户离会后不再返回。需要统计完整的到会名单(含已离会者)时,请在会议结束后改用 5.5 的「获取参会成员明细」接口,或以「用户入会」事件回调的落库数据为准。
会议结束后,可通过该接口离线拉取完整参会名单——包含会中已离会的成员,这是实时接口做不到的。参会者通过专属链接入会时,participants[] 中会返回 customer_data,可用于会后统计、来源归因与对账。
项目 | 内容 |
|---|---|
官方文档 | |
接口地址 |
|
请求方式 | GET |
鉴权方式 | AK/SK 鉴权、OAuth 2.0 鉴权 |
操作者权限 | 会议创建者、主持人、联席主持人,或具备会议管理权限的角色 |
分页方式 |
|
时间筛选 |
|
请求示例:
GET https://api.meeting.qq.com/v1/meetings/144115214488302892/participants?userid=owner1&size=20响应示例(节选):
{
"meeting_id": "144115214488302892",
"meeting_code": "746950080",
"subject": "Test Meeting",
"schedule_start_time": "1572085800",
"schedule_end_time": "1572089400",
"has_remaining": false,
"participants": [
{
"userid": "test1",
"user_name": "dBVzdDE=",
"join_time": "1572085800",
"left_time": "1572089400",
"instanceid": 1
}
]
}使用要点:
participants[] 中支持返回 customer_data(官方字段表已列出该字段):仅当参会成员通过专属链接入会时返回,官方响应示例中未展示该字段;left_time 为 0 表示该参会者仍在会中,非 0 则为离会时间戳(秒);start_time / end_time 分时间段拉取;sub_meeting_id(可通过「查询会议」返回的 current_sub_meeting_id 获取);webinar_member_role 区分嘉宾 / 观众。字段 | 位置 | 说明 |
|---|---|---|
customer_data | 回调 | 用户专属字段。仅当参会成员通过专属链接进会时才返回,通过会议号或其他方式入会时该字段缺失;标识身份时为业务侧用户标识,标注来源时为来源标识 |
ms_open_id |
| 用户会中唯一 ID,可作为同一次入会的关联标识 |
user_role | 会中成员列表与参会成员明细 | 用户角色,0:普通成员,1:创建者,2:主持人,3:创建者+主持人,4:游客,5:游客+主持人,6:联席主持人,7:创建者+联席主持人。可用于校验研讨会嘉宾链接是否按预期生效 |
webinar_member_role | 参会成员明细 | 网络研讨会成员角色,0:普通参会角色,1:内部嘉宾,2:外部嘉宾,3:邀请链接入会嘉宾,4:观众。可用于会后核对嘉宾 / 观众链接是否按预期生效 |
join_time / left_time | 参会成员明细 | 参会者入会 / 离会时间戳(秒); |
instanceid |
| 参会者终端设备类型,1:PC,2:Mac,3:Android,4:iOS,5:Web,8:小程序 |
注意:
customer_data除了给每个参会者生成链接,用来标识参会者身份外,也可以用来标注参会者的来源,具体请根据业务需求处理。
第五节解决的是「进来的人是谁」,但只要参会者在会中还能看到会议号,专属链接的约束就可能被绕开——截图转发、口头告知,别人输入会议号就能直接入会。disable_invitation 正是为此提供的开关:置为 1 后,会中用户无法点击「邀请」,也无法从会议信息中拿到会议号,从源头切断「会中拿到会议号再传播」的路径。
因此在需要的场景中,建议将 disable_invitation=1 与专属参会链接成对使用。该参数在会议与研讨会两套接口中都已支持,与专属链接的双轨结构正好对齐。
disable_invitation 在会议与网络研讨会两组接口中均已支持,请求方式与路径沿用各接口原有定义:
接口 | 请求方式 | 接口地址 | 参数位置 |
|---|---|---|---|
创建会议 | POST |
| 新增入参 |
修改会议 | PUT |
| 新增入参 |
查询会议(通过会议 ID) | GET |
| 新增出参(会议对象) |
查询会议(通过会议 Code) | GET |
| 新增出参(会议对象) |
创建网络研讨会 | POST |
| 新增入参 |
修改网络研讨会 | PUT |
| 新增入参 |
查询网络研讨会 | GET |
| 新增出参 |
作为入参(创建会议、修改会议、创建网络研讨会、修改网络研讨会):
参数 | 必选 | 类型 | 说明 |
|---|---|---|---|
disable_invitation | 否 | Integer | 是否禁用邀请。禁用后会中用户将无法点击邀请,且无法查看会议号。 |
作为出参(查询会议、查询网络研讨会):
参数 | 类型 | 说明 |
|---|---|---|
disable_invitation | Integer | 是否禁用邀请。 |
创建会议时直接关闭邀请与会议号:
POST https://api.meeting.qq.com/v1/meetings
Content-Type: application/json
{
"userid": "KM4Ss4T******1JiK",
"instanceid": 1,
"subject": "外部培训 - 第一期",
"type": 1,
"start_time": "1757480400",
"end_time": "1757487600",
"disable_invitation": 1
}会议创建后需要临时放开邀请(例如改为内部公开场次):
PUT https://api.meeting.qq.com/v1/meetings/7567173273889276131
Content-Type: application/json
{
"userid": "KM4Ss4T******1JiK",
"instanceid": 1,
"disable_invitation": 0
}查询会议时回显当前状态(响应节选):
{
"meeting_number": 1,
"meeting_info_list": [
{
"meeting_id": "7567173273889276131",
"meeting_code": "123456789",
"subject": "外部培训 - 第一期",
"disable_invitation": 1
}
]
}网络研讨会用法一致,只需把接口地址换成 /v1/webinars:
POST https://api.meeting.qq.com/v1/webinars
Content-Type: application/json
{
"userid": "KM4Ss4T******1JiK",
"instanceid": 1,
"subject": "产品发布会",
"type": 1,
"start_time": "1757480400",
"end_time": "1757487600",
"disable_invitation": 1
}disable_invitation=1(而非等会议开始后再改),避免已入会的参会者提前看到并转发会议号;customer_data 完成身份识别或来源归因;disable_invitation 是否为 1,与专属链接的获取接口一并纳入发起前的检查项。meeting_code)下发给参会者,也不要让参会者通过客户端「加入会议」输入会议号入会。通过会议号入会不会携带 customer_data,该参会者的身份与来源都无法被识别,本次身份识别与来源归因即告失效。会议号仅限内部管理员/主持人在排查问题时使用。
需要注意,仅仅做到「不下发会议号」还不够:参会者入会后,在腾讯会议客户端的「会议信息」中仍可以看到会议号、入会密码与会议主题,截图或口头转发后,其他人即可绕开专属链接、直接输入会议号入会。因此在对会议信息保密有要求的场景下(外部培训、金融路演、付费活动、内部敏感会议等),还必须配合隐藏邀请与会议号能力,即在创建/修改会议时设置 disable_invitation=1,从源头切断「从会中拿到会议号再传播」的路径,具体做法见第六节,背景说明可参考这篇文章。meeting_id 传给 /v1/webinars/customer-short-url(或反之)不会得到可用链接。业务侧在生成链接前应先确认会议类型(查询会议返回的 meeting_type 为 6 即网络研讨会),再路由到对应接口;两套接口的响应字段名也不同(meeting_short_url 与 webinar_short_url),解析逻辑需分开处理。disable_invitation 只约束会中入口,不追溯已扩散的会议号。 会议开始后再置为 1,无法收回此前已被参会者看到或转发出去的会议号;同时该能力依赖客户端 3.16 及以后版本,低版本客户端可能不生效。对保密要求高的会议,建议「创建时即禁用邀请 + 开启等候室人工放行」双重兜底。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。