knowledge-work-plugins:Zoom Meeting SDK Web 错误码全解——从 join 失败到 2026 年 OBF/ZAK 令牌治理
2026/9/13 4:53:45 网站建设 项目流程

knowledge-work-plugins:Zoom Meeting SDK Web 错误码全解——从 join 失败到 2026 年 OBF/ZAK 令牌治理

【免费下载链接】knowledge-work-pluginsOpen source repository of plugins primarily intended for knowledge workers to use in Claude Cowork项目地址: https://gitcode.com/GitHub_Trending/kn/knowledge-work-plugins

本篇基于 Zoom Meeting SDK 插件中的错误码参考文档 error-codes.md,系统讲解 Meeting SDK for Web 返回的全部错误码分区、含义与修复方案。读完你将能够:按错误码区间快速定位问题类别(认证、会议校验、连接、令牌、版本),为 Client View 与 Component View 两种 API 风格编写健壮的 join 错误处理逻辑,并在 2026 年 OBF/ZAK 令牌强制策略下正确完成外部会议的授权入会。

1. 错误码体系总览:先按区间定位类别

Meeting SDK 的错误码按数值区间划分类别,拿到错误码后第一步是判断它属于哪个区间,再进入具体修复流程:

Code RangeCategory
0-2General/Success
3000-3999Meeting Validation
4000-4999Connection Status
6000+System/Service
10000+SDK Version
13000+Simulive

理解这套错误码的前提是先分清 Web 端两种集成形态,因为错误处理写法在两者间不同:

维度Client ViewComponent View
对象ZoomMtg(全局单例)ZoomMtgEmbedded.createClient()(实例)
API 风格Callbacks(success/error 回调)Promises(await/try-catch)
错误载体err.errorCode(数字码)error.reason(名称)+error.message(描述)
密码参数passWord(大写 W)password(小写)
事件监听inMeetingServiceListener()on()/off()

这一对照关系与仓库中 web/SKILL.md 的 "Client View vs Component View" 表格完全一致。错误码文档本身也印证了这一点:Component View 捕获到的错误对象使用error.reason === 'WRONG_MEETING_PASSWORD'这样的名称匹配,而非数字码匹配。

2. 通用错误(0-2)

CodeNameDescriptionSolution
0SUCCESSFunction invoked successfullyN/A
1FAILGeneral function errorCheck parameters and SDK state
2MEETING_NOT_INITMeeting not initializedCallinit()beforejoin()

2 (MEETING_NOT_INIT)是最典型的生命周期顺序错误。仓库配套文档 common-issues.md 给出了精确的成因与修复:join()init()完成回调之前被调用。错误写法是ZoomMtg.init({...}); ZoomMtg.join({...})连续执行;正确写法是把join()放进init()success回调里等待初始化完成。

3. 会议校验错误(3000-3999)

3xxx 区间是 join 流程中最高频的错误类别,细分为认证、会议本体、注册登录、主持人、平台限制五组。

3.1 认证类错误

CodeNameDescriptionSolution
3704API_KEY_INVALIDSDK Key/Client ID is invalidVerify SDK credentials in Marketplace
3705SIGNATURE_EXPIREDJWT signature has expiredGenerate new signature with validexp
3708ROLE_ERRORIncorrect role in signatureUse role 0 (participant) or 1 (host)
3710API_KEY_DISABLEDSDK Key is deactivatedRe-enable in Marketplace or create new app
3712SIGNATURE_INVALIDSignature verification failedCheck SDK secret, verify signature generation
3265TOKEN_ERRORToken validation failedCheck ZAK/OBF token format and expiry
3623TOKEN_ERROR_ALTToken error (alternate)Same as 3265
3713NO_PERMISSIONInsufficient permissionsVerify account permissions and scopes

这组错误的根源几乎全部落在签名生成令牌管理上,仓库内两份文档提供了纵深佐证:

  • signature-playbook.md 列出了签名失效的四种常见模式:secret 错误、mn(会议号)格式错误(必须为纯数字串)、exp/tokenExp过期、以 role=1(主持人)生成签名却执行 participant 入会(或反之)。其中 role 不匹配正好对应错误码表中的3708 ROLE_ERROR
  • common-issues.md 补充了一个版本相关的细节:v5.0.0+ 起签名需要appKey前缀(格式为appKey:sdkKey.eyJhbGc...),使用旧格式会导致 3712;此外算法必须为 HS256。

关于 ZAK/OBF 令牌类的3265/3623,bot-authentication.md 明确了令牌属性:ZAK 是短时效凭证(TTL 可配,通常 1-2 小时),到期时间在 join 时校验;若机器人已在会中,即使令牌过期也不会被断开。因此 3265 优先排查方向是"令牌过期"或"令牌格式错误",而不是"令牌与参会人身份不匹配"——任何 Zoom 账号的 ZAK 都满足"仅认证用户可加入"的要求。

3.2 会议本体错误

CodeNameDescriptionSolution
3001ERROR_NOT_EXISTMeeting does not existVerify meeting number
3003ERROR_NOT_HOSTNot meeting hostUse host's ZAK token to start
3004WRONG_MEETING_PASSWORDIncorrect passwordVerifypassWord(Client View) orpassword(Component View)
3005ANOTHER_MEETING_RUNNINGAlready in another meetingLeave current meeting first
3008MEETING_NOT_STARTMeeting hasn't startedWait for host or use "join before host"
3009BE_REMOVEDUser was removed from meetingCannot rejoin; contact host
3610MEETING_NOT_EXIST_ALTMeeting does not exist (alt)Same as 3001

其中三个码值得结合仓库文档展开:

3004 WRONG_MEETING_PASSWORD与字段名陷阱。错误码表给出的 Solution 直接指向 Web SDK 最著名的坑:Client View 用passWord(大写 W),Component View 用password(小写)。signature-playbook.md 特别强调:当会议有密码但字段缺失/写错时,join 会以"看似认证问题"的方式失败。common-issues.md 补充了另外两个高频诱因:密码中含空格/编码问题、直接使用了 URL 编码后的密码;正确做法是从邀请链接用url.searchParams.get('pwd')提取原始密码。

3005 ANOTHER_MEETING_RUNNING的处理。修复方式是先调用ZoomMtg.leaveMeeting({})离开当前会议,再 join 新会议。这与仓库 references/multiple-meetings.md 所讨论的"多会议/多实例"场景直接相关:单例ZoomMtg同一时刻只能承载一个会议。

3001/3610 ERROR_NOT_EXIST的会议号 vs 会议 ID。错误码文档给出一个关键事实:Meeting ID(来自 API)和 Meeting Number(客户端显示)是同一个号码,问题通常是拼写、会议被删除,或把 API 返回的完整会议对象里的其他字段误当成号码。配合 web/SKILL.md 中的"Helper Utilities"一节,可以从用户粘贴的完整邀请链接中正则提取 9-11 位纯数字作为meetingNumber

3.3 注册与登录错误

CodeNameDescriptionSolution
3000EMAIL_REQUIREDEmail required for webinarProvideuserEmailin join params
3099REGISTRATION_REQUIREDMeeting requires registrationGettktoken from registration API
3100LOGIN_REQUIREDZoom login requiredProvide ZAK token for authenticated join
3624HOST_EMAIL_REQUIREDHost/alt host needed for webinarUse host credentials to start

这组错误对应 join 参数中的三个认证字段:userEmail(webinar 必需)、tk(注册令牌)、zak(ZAK 令牌)。web/SKILL.md 的ZoomMtg.join()参数表中列出了这些字段:tk: string(Registration token, if required)、zak: string(Host's ZAK token, required to start)、userEmail: string(Required for webinars)。3100 LOGIN_REQUIRED常见于开启了"仅认证用户可加入"的会议,修复方式是用 OAuth 流程获取 ZAK 后传入 join 参数,完整流程见 bot-authentication.md(user:read:zakscope,GET /v2/users/me/token?type=zak)。

3.4 主持人错误

CodeNameDescriptionSolution
3625HOST_INACTIVEMeeting host is inactiveContact host to activate account
3702HOST_NOT_FOUNDHost does not existVerify host account
3709HOST_NOT_FOUNDHost not found (alt)Same as 3702
3711CANT_HOST_CONCURRENTCan't host multiple meetingsEnd other meeting first

注意37023709名称相同(HOST_NOT_FOUND)但码值不同,属于别名关系,排查时可按同一问题处理。3003 ERROR_NOT_HOST3711都指向"主持人身份/并发"问题:以主持人身份启动会议需要主持人账号的 ZAK 令牌,且一个主持人账号不能同时主持多个会议。signature-playbook.md 还提到一个关联失败模式:Web "start" 流程中 role 不匹配或缺少主持人要求时常表现为4003 INVALID_PARAMETER,主持人启动流通常还需要 ZAK 配合。

3.5 平台限制错误

CodeNameDescriptionSolution
3603NOT_SUPPORT_WEBCLIENTWeb join not allowedAdmin must enable web client
3608TSP_NOT_SUPPORTTSP audio not supported on webUse computer audio or phone
3611USE_DESKTOP_OR_MOBILEBrowser join disabledUse Zoom desktop/mobile app
3620EMAIL_BLOCKEDEmail blocked by adminContact account administrator
3621NO_RESPONSE_FROM_WEBServer timeoutRetry request

这组错误的特点是根因在管理端策略而非客户端代码:3603/3611/3620 都需要联系会议所在账号的管理员调整 Web 客户端开关或邮件域策略,客户端代码无论怎么改都无法绕过。3608则是音频模式限制(TSP 电话音频在 Web 端不支持),改走电脑音频或电话入会即可。

3.6 深度解析:3712 签名失败的完整排查链

3712 是认证类错误中信息量最大的一个。综合错误码文档与仓库内 common-issues.md、signature-playbook.md,"Signature is invalid" 的完整原因清单如下:

  1. SDK Secret 与 SDK Key 不匹配(来自不同应用或拼写错误);
  2. 签名算法错误(必须 HS256);
  3. 服务器与 Zoom 之间的时钟偏移(需 NTP 同步;signature-playbook.md 将其列为 "works locally but not in prod" 的典型根因之一);
  4. 签名中缺少或错误的appKey字段(v5.0.0+ 格式要求appKey:sdkKey.eyJhbGc...前缀);
  5. mn字段非纯数字(签名 payload 中会议号必须归一化为数字字符串);
  6. role 与实际行为不一致(生成 role=1 却执行 participant join)。

调试步骤:在 Marketplace 中核对 SDK Key/Secret → 复查签名生成代码的 payload 字段(sdkKeymnroleiatexptokenExp)→ 确认服务器时间准确 → 使用官方 auth-endpoint 样例工程交叉验证。注意区分两个易混概念(见 bot-authentication.md 的 "Common Confusion" 一节):被弃用的是 REST API 的JWT App Type,而 Meeting SDK 用的JWT 签名从未弃用,仍为每次 join 的必需凭证。

4. 连接状态错误(4000-4999)

CodeNameDescriptionSolution
4000RE_CONNECTINGReconnecting to meetingWait for reconnection
4001DISCONNECTDisconnected from meetingCheck network, try rejoining
4003INVALID_PARAMETERInvalid join parameterCheck all required fields
4004MEETING_ENDEDMeeting has endedCannot join ended meeting
4005MEETING_CAPACITY_REACHEDMeeting is fullHost needs to increase capacity
4006MEETING_LOCKEDMeeting is lockedHost must unlock to allow joins
4007REJECT_BARRIERSInformation barriers rejectionContact admin about policies
4008PARTICIPANT_EXISTAlready a participantAlready in meeting or leave first
4009SERVER_ERRORInternal server errorRetry request
4011NOT_ALLOW_CROSS_JOINCross-account join blockedPublish app on Marketplace

与 3xxx 区间不同,4xxx 更多是"入会时的状态性拒绝":会议已结束(4004)、已满员(4005)、已锁定(4006)、参会人已存在(4008)等,其中 4004/4005/4006 的解决方都在主持人或管理端。

两个值得注意的码:

  • 4003 INVALID_PARAMETER:signature-playbook.md 指出这是 Web "start"(主持人启动)流程的高发错误,常见根因是 role 不匹配或缺少主持人要求(通常需要 ZAK)。排查方向应从"参数合法性"和"角色一致性"两个维度并行切入。
  • 4011 NOT_ALLOW_CROSS_JOIN:跨账号入会被拦截。错误码文档给出的解决路径有三条:将应用发布到 Zoom Marketplace、仅入会本账号内的会议、或使用 OBF 令牌授权。bot-authentication.md 补充了一个关键前提:开发(dev)凭据只能入会本账号的会议,跨账号场景需要生产(production)凭据。

5. OBF/匿名入会错误(2026 年 3 月起)与令牌治理

5.1 4012 / 4013 错误码与响应结构

错误码文档标注:自 2026 年 3 月 2 日起,匿名加入外部会议被禁止,必须提供有效的 OBF 或 ZAK 令牌。

CodeNameDescriptionSolution
4012NOT_ALLOW_ANONYMOUS_JOINAnonymous join not allowedProvide valid OBF or ZAK token
4013USER_LEVEL_TOKEN_NOT_HAVE_HOST_ZAK_OBFOBF/ZAK token invalid or missingVerify token is not expired or malformed

两个码的实际错误响应体(meetingStatus: 3表示 disconnected/失败态):

4012 Error Response

{ "meetingStatus": 3, "errorCode": 4012, "errorMessage": "Anonymous joins are not allowed for this SDK app. Authenticate the Zoom user and provide a ZAK or OBF token." }

4012 的解决方案:

  1. 通过 Zoom API 生成 OBF 令牌;
  2. 或为用户获取 ZAK 令牌(/users/me/zak);
  3. 将令牌传入 join 参数的obfTokenzak字段。

4013 Error Response

{ "meetingStatus": 3, "errorCode": 4013, "errorMessage": "The OBF or ZAK token is not provided or invalid. Make sure it's not expired or malformed." }

4013 的解决方案:

  1. 检查令牌是否过期(OBF 令牌有有效期);
  2. 验证令牌格式正确;
  3. 过期则重新生成。

4012 与 4013 的区分语义:4012 是"根本没提供令牌"(匿名 join 被策略拒绝),4013 是"提供了但无效"(过期或格式错误)。

5.2 OBF 与 ZAK 令牌模型:选哪个、怎么传

bot-authentication.md 给出了两者最关键的行为差异,直接影响 join 失败时的重试设计:

维度ZAK TokenOBF Token
需要授权用户在场——用户必须在会中
用户离场后机器人连接保持(令牌持有者离场不断连)立即断开
会议范围任意会议仅绑定的特定会议 ID
归因方式通用认证绑定到具体参会用户

实现层面的要点:

  • 互斥zakobfToken不能同时传,只能二选一;
  • OBF 生成GET https://api.zoom.us/v2/users/me/token?type=onbehalf&meeting_id={meeting_id},需要 OAuth scopeuser:read:token;ZAK 对应type=zak,scopeuser:read:zak
  • OBF 的典型失败:机器人在授权用户入会前就发起 join,会返回特定错误码MEETING_FAIL_AUTHORIZED_USER_NOT_INMEETING(SDK v6.6.10+),文档给出的修复是带退避的重试循环(例如最多 5 次、每次间隔 3 秒),而不是把它当作永久性失败。

web/SKILL.md 的 "Authorization Requirements (2026 Update)" 一节同样确认了这条策略线,并展示了两种传参方式:机器人场景传obfToken: 'your-app-privilege-token',主持人操作场景传zak: 'host-zak-token'

5.3 OBF 强制时间表

DateEnforcement
2026 年 2 月 7 日若提供了 OBF,则必须有效(未过期/格式正确)
2026 年 3 月 2 日无有效 OBF/ZAK 令牌不得加入外部会议

需要提示读者一个仓库内的日期差异:bot-authentication.md 的 Timeline 一节将外部会议强制时间点写作 2026 年 2 月 23 日。从两份文档的措辞看,2 月节点约束的是"提供的 OBF 必须有效",3 月 2 日节点约束的是"必须提供",而 bot-authentication 文档可能记录的是策略分阶段执行中的某个中间节点。以错误码文档的时间表为准排查 4012/4013 即可,实际项目中建议在发布前向 Zoom 官方渠道复核当前生效日期。

6. 系统、SDK 版本与 Simulive 错误

CodeNameDescriptionSolution
6603BLOCKED_BY_HOST_ADMINSDK Key blocked by host's adminContact host's admin to whitelist
10000SDK_VERSION_UNSUPPORTEDSDK version no longer supportedUpgrade to latest SDK version
13208UNABLE_JOIN_ENDED_SIMULIVESimulive webinar has endedCannot join ended simulive
  • 6603管理端封禁:会议主持人的管理员把你的 SDK Key 加入了屏蔽列表,客户端无法自救,需联系对方管理员加白。
  • 10000版本强制淘汰机制,说明 Zoom 对旧 SDK 版本设有支持窗口;web/RUNBOOK.md 也建议"在发布更新前每季度重新核对版本强制窗口"。
  • 13208仅出现在 Simulive(同步直播网络研讨会)场景,会议/网络研讨会结束后不可再加入。

7. 错误处理模式:Client View 与 Component View 的完整写法

7.1 Client View:基于回调的数字码分支

ZoomMtg.join({ // ... options success: (res) => { console.log('Joined successfully'); }, error: (err) => { console.error('Join failed:', err); switch (err.errorCode) { case 3004: alert('Incorrect meeting password'); break; case 3712: console.error('Signature invalid - check SDK secret'); break; case 4012: console.error('OBF token required for external meetings'); break; default: console.error(`Error ${err.errorCode}: ${err.errorMessage}`); } } });

7.2 Component View:基于 Promise 的名称匹配

try { await client.join({ // ... options }); } catch (error) { console.error('Join failed:', error); // error.reason contains error code // error.message contains description if (error.reason === 'WRONG_MEETING_PASSWORD') { alert('Incorrect password'); } }

注意 Component View 的错误对象中reason携带的是错误名称(与本文表格第二列的 Name 对应,如WRONG_MEETING_PASSWORD即 3004),message携带描述文本。因此同一份错误码表可以支撑两种匹配风格:Client View 按errorCode数字 switch,Component View 按reason字符串判断。

7.3 监听连接状态变化

入会成功后的断连/重连不经过 join 回调,而是通过连接状态事件,两种视图的事件名不同:

// Client View ZoomMtg.inMeetingServiceListener('onMeetingStatus', (data) => { // status: 1=connecting, 2=connected, 3=disconnected, 4=reconnecting if (data.status === 4) { // 对应 4000 RE_CONNECTING } if (data.status === 3) { console.error('Disconnected:', data.errorCode); // 对应 4001 DISCONNECT } }); // Component View client.on('connection-change', (payload) => { // payload.state: 'Connecting', 'Connected', 'Reconnecting', 'Closed' if (payload.state === 'Closed') { console.error('Connection closed:', payload.reason); } });

两个视图的连接状态枚举映射关系(综合错误码文档与 web/SKILL.md 的事件表):

语义Client ViewonMeetingStatus.data.statusComponent Viewconnection-change.payload.state
连接中1 (connecting)'Connecting'
已连接2 (connected)'Connected'
已断开3 (disconnected)'Closed'
重连中4 (reconnecting)'Reconnecting'

实践建议:UI 层应在 status 4 / 'Reconnecting' 时展示重连提示而非判定失败;在 status 3 / 'Closed' 时读取携带的 errorCode/reason 再决定是提示重试还是引导重新 join。common-issues.md 提醒过一类相关陷阱:Component View 的事件名是 kebab-case(connection-changeuser-addeduser-removed),若误用 Client View 的onMeetingStatus/onUserJoin命名,回调将永远不触发。

8. 常见错误场景手册

这一节继承错误码文档的 "Common Error Scenarios",并合并仓库佐证材料。

8.1 "Signature is invalid"(3712)

原因:

  1. SDK Secret 与 SDK Key 不匹配;
  2. 签名算法错误(必须 HS256);
  3. 服务器与 Zoom 之间的时钟偏移;
  4. 签名中缺少或错误的appKey字段。

调试步骤:

  1. 在 Marketplace 核对 SDK Key 和 Secret;
  2. 检查签名生成代码(payload 字段、前缀格式);
  3. 确保服务器时间准确(NTP 同步);
  4. 使用官方 auth-endpoint 样例工程(web/SKILL.md 的 "Authentication Endpoint" 一节给出了该样例的本地部署方式)做对照测试。

8.2 "Meeting does not exist"(3001/3610)

原因:

  1. 会议号拼写错误;
  2. 会议已被删除;
  3. Meeting ID 与 Meeting Number 混淆。

注意:文档明确说明 Meeting ID(来自 API)与 Meeting Number(客户端显示)是同一个值,因此"混淆"通常发生在从 API 响应取错字段,而非二者真的不同。

8.3 "Anonymous join not allowed"(4012)

原因:

  1. 未经授权加入本账号之外的会议;
  2. 未提供 OBF 或 ZAK 令牌。

解决方案:

  1. 机器人场景:使用 App Privilege Token(OBF);
  2. 用户场景:获取该用户的 ZAK 令牌;
  3. 本账号内的会议:无需令牌。

补充自 bot-authentication.md:选择 OBF 还是 ZAK 还要看你对"用户离场后机器人是否保活"的需求——需要保活选 ZAK,需要强归因且绑定特定会议选 OBF,但接受授权用户离场即断连。

8.4 "Cross-account join blocked"(4011)

原因:应用未在 Marketplace 发布,且试图加入本账号之外的会议。

解决方案:

  1. 将应用发布到 Zoom Marketplace;
  2. 或仅加入本账号内的会议;
  3. 或使用 OBF 令牌授权。

9. 排查工作流:把错误码放进 5 分钟预检流程

仓库为 Meeting SDK 提供了两级 runbook:通用级 RUNBOOK.md 与 Web 级 web/RUNBOOK.md,其"Fast Decision Tree"与错误码区间的对应关系是:

  • join 快速失败 + 401/签名类错误(3704/3705/3712)→ 后端签名 claims、时钟偏移、应用凭据不匹配;
  • UI 正常但无法入会(3001/3004/3008 等)→ role/ZAK/密码字段错误或会议数据无效(重点核对passWordvspassword);
  • 连接中断/重连(4000/4001/4013)→ 先走连接状态监听分支,再检查令牌有效期;
  • 跨账号场景(4011/4012)→ 检查 Marketplace 发布状态与 OBF/ZAK 配置。

runbook 还给出两条可直接执行的探测命令(需先设置$MEETING_SDK_BASE_URL):

# 1) Verify signature endpoint responds with JSON curl -sS -i "$MEETING_SDK_BASE_URL/api/signature" # 2) Verify app page is reachable and returns HTML curl -sS -i "$MEETING_SDK_BASE_URL"

预期结果是端点返回有效的 JSON/HTML,而非通用 404/502 页面——若签名端点本身不可达,join 会失败得"像认证问题",实际是后端问题,错误码文档中 3712/3704 的 Solution 都不适用。

10. 关联文档索引

围绕本错误码文档,仓库内以下文件可继续深入:

  • web/troubleshooting/common-issues.md:高频问题的快速诊断(init 顺序、CDN 加载、CORS、React 集成);
  • web/SKILL.md:Client View / Component View 完整 API 与 2026 授权要求;
  • references/bot-authentication.md:JWT 签名 / ZAK / OBF 三种令牌的行为差异与机器人入会流程;
  • references/signature-playbook.md:签名生成规则与常见失效模式;
  • references/troubleshooting.md:跨平台(Web/移动/桌面)的通用故障排查;
  • web/RUNBOOK.md 与 RUNBOOK.md:5 分钟预检流程与快速决策树。

适用前提说明:本文内容基于当前仓库中 zoom-plugin 的 Meeting SDK Web 文档整理,其中 2026 年 OBF/ZAK 强制策略的时间节点以仓库文档记载为准;错误码数值与名称可能随 SDK 版本演进,生产环境排障时建议对照所用 SDK 版本核对。

【免费下载链接】knowledge-work-pluginsOpen source repository of plugins primarily intended for knowledge workers to use in Claude Cowork项目地址: https://gitcode.com/GitHub_Trending/kn/knowledge-work-plugins

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询