# 视频通话问题排查清单 ## 问题:Web 端呼叫小程序端无法接听 ### 第一步:确认基础环境 ✓ #### Web 端(医生端) - [ ] 使用 HTTPS 协议访问(或 localhost) - [ ] 浏览器支持 WebRTC(Chrome/Edge/Safari) - [ ] 已授予摄像头和麦克风权限 - [ ] 网络连接正常 #### 小程序端(患者端) - [ ] 已授予摄像头和麦克风权限 - [ ] 网络连接正常 - [ ] 小程序在前台运行(未切到后台) - [ ] 微信版本支持音视频通话 ### 第二步:确认登录状态 ✓ #### Web 端检查 打开浏览器控制台,查找日志: ``` TUICallKit init 方法调用完成 初始化完成,显示通话界面 ``` 如果看到这些日志,说明 Web 端登录成功。 #### 小程序端检查 1. 输入患者ID(如:2) 2. 点击"登录" 3. 看到提示"登录成功" 4. 界面显示"当前登录: patient_2" 如果看到这些,说明小程序端登录成功。 ### 第三步:确认 userId 格式 ✓✓✓(最重要) #### Web 端日志 在浏览器控制台查找: ``` === 发起一对一通话 === 后端返回的 patientUserId: patient_2 前端传入的 userId: 最终使用的 targetUserId: patient_2 ``` 记录 `targetUserId` 的值:__________________ #### 小程序端日志 在微信开发者工具控制台查找: ``` === 小程序端登录信息 === userId: patient_2 ``` 记录 `userId` 的值:__________________ #### 对比结果 - [ ] Web 端的 `targetUserId` 和小程序端的 `userId` 完全一致 - [ ] 格式都是 `prefix_number`(如:patient_2) - [ ] 没有多余的空格或特殊字符 **如果不一致,这就是问题所在!** ### 第四步:确认 SDKAppID 一致 ✓ #### Web 端日志 ``` 签名获取成功: { doctorUserId: doctor_1, patientUserId: patient_2, sdkAppId: 1400xxxxxx } ``` 记录 `sdkAppId`:__________________ #### 小程序端日志 ``` === 小程序端登录信息 === sdkAppId: 1400xxxxxx ``` 记录 `sdkAppId`:__________________ #### 对比结果 - [ ] 两个 SDKAppID 完全一致 **如果不一致,双方无法通话!** ### 第五步:测试呼叫流程 ✓ #### 从 Web 端呼叫小程序端 1. **准备工作** - [ ] 小程序端已登录(显示"当前登录: patient_2") - [ ] 小程序在前台运行 - [ ] Web 端已打开患者详情页 2. **发起呼叫** - [ ] Web 端点击"视频通话"按钮 - [ ] Web 端显示"等待对方接听..." - [ ] 浏览器控制台显示"通话已发起,目标用户: patient_2" 3. **小程序端应该** - [ ] 自动弹出来电界面 - [ ] 显示来电提示音 - [ ] 显示"接听"和"拒绝"按钮 - [ ] 控制台显示收到来电信息 4. **如果小程序端没反应** - 检查控制台是否有错误日志 - 确认 userId 格式是否一致 - 确认小程序是否在前台 - 尝试重新登录小程序 #### 从小程序端呼叫 Web 端 1. **准备工作** - [ ] Web 端已登录(医生已登录系统) - [ ] Web 端页面保持打开 - [ ] 小程序端已登录 2. **发起呼叫** - [ ] 小程序端输入医生ID:`1` 或 `doctor_1` - [ ] 点击"呼叫"按钮 - [ ] 小程序显示"正在呼叫..." - [ ] 控制台显示"准备呼叫用户: doctor_1" 3. **Web 端应该** - [ ] 自动弹出来电窗口 - [ ] 显示来电提示 - [ ] 显示"接听"和"拒绝"按钮 - [ ] 控制台显示收到来电信息 4. **如果 Web 端没反应** - 检查控制台是否有错误日志 - 确认 userId 格式是否一致 - 确认 Web 端是否已登录 - 尝试刷新页面重新登录 ### 第六步:常见错误代码 ✓ | 错误代码 | 错误信息 | 原因 | 解决方案 | |---------|---------|------|---------| | 60006 | 不支持 WebRTC | 非 HTTPS 环境 | 使用 HTTPS 或 localhost | | 60007 | 设备不支持 | 浏览器不支持 | 更换浏览器 | | 60008 | 对方拒绝 | 用户点击拒绝 | 正常情况 | | 60009 | 对方未接听 | 超时未接听 | 正常情况 | | 60010 | 对方忙线 | 对方正在通话中 | 稍后再试 | | 60011 | 对方不在线 | userId 不匹配或未登录 | 检查 userId 格式 | | 60012 | 网络连接失败 | 网络问题 | 检查网络 | | 60013 | 权限未授予 | 摄像头/麦克风权限 | 授予权限 | ### 第七步:后端接口检查 ✓ #### 医生端接口(Web) 请求:`POST /api/tcm/getCallSignature` ```json { "diagnosis_id": 1, "patient_id": 2 } ``` 期望响应: ```json { "code": 1, "data": { "userId": "doctor_1", // 医生自己的ID "patientUserId": "patient_2", // 要呼叫的患者ID "sdkAppId": "1400xxxxxx", "userSig": "eJw1..." } } ``` 检查点: - [ ] `userId` 格式正确(doctor_X) - [ ] `patientUserId` 格式正确(patient_X) - [ ] `sdkAppId` 正确 - [ ] `userSig` 不为空 #### 患者端接口(小程序) 请求:`GET /api/tcm/getPatientSignature?patient_id=2` 期望响应: ```json { "code": 1, "data": { "userId": "patient_2", // 患者自己的ID "sdkAppId": "1400xxxxxx", "userSig": "eJw1..." } } ``` 检查点: - [ ] `userId` 格式正确(patient_X) - [ ] `sdkAppId` 与医生端一致 - [ ] `userSig` 不为空 ### 第八步:网络抓包分析(高级)✓ 如果以上都正常但仍无法通话,可以抓包分析: #### 工具 - Chrome DevTools(Network 标签) - 微信开发者工具(Network 标签) - Wireshark(专业工具) #### 检查点 1. **信令服务器连接** - [ ] WebSocket 连接成功 - [ ] 收到服务器响应 2. **呼叫信令** - [ ] 发送 INVITE 信令 - [ ] 收到 RINGING 响应 - [ ] 收到 ACCEPT 或 REJECT 3. **媒体流** - [ ] ICE 候选交换成功 - [ ] DTLS 握手成功 - [ ] RTP 数据包传输 ### 问题解决方案汇总 #### 问题 1:userId 格式不一致 **症状:** 错误代码 60011(对方不在线) **解决:** 1. 检查后端接口返回的 userId 格式 2. 确保都使用 `prefix_number` 格式 3. 修改后端代码统一格式 #### 问题 2:SDKAppID 不一致 **症状:** 初始化失败或无法通话 **解决:** 1. 检查后端配置文件 2. 确保 Web 端和小程序端使用同一个腾讯云应用 3. 重新生成 userSig #### 问题 3:小程序未在线 **症状:** 小程序端无反应 **解决:** 1. 确认小程序已登录 2. 确认小程序在前台运行 3. 尝试重新登录 #### 问题 4:权限未授予 **症状:** 无法访问摄像头/麦克风 **解决:** 1. 小程序:设置 → 权限管理 → 允许摄像头和麦克风 2. Web:浏览器地址栏 → 权限设置 → 允许摄像头和麦克风 3. 重新加载页面 #### 问题 5:网络问题 **症状:** 连接失败或断开 **解决:** 1. 检查网络连接 2. 尝试切换网络(WiFi/4G) 3. 检查防火墙设置 4. 确认服务器可访问 ### 成功标志 当一切正常时,你应该看到: #### Web 端控制台 ``` WebRTC 环境检测: { isHttps: true, hasGetUserMedia: true, hasRTCPeerConnection: true } 签名获取成功: { doctorUserId: "doctor_1", patientUserId: "patient_2", sdkAppId: "1400xxxxxx" } TUICallKit init 方法调用完成 初始化完成,显示通话界面 === 发起一对一通话 === 最终使用的 targetUserId: patient_2 通话已发起,目标用户: patient_2 >>> 正在呼叫 >>> 通话已接通 ``` #### 小程序端控制台 ``` 获取签名成功: { userId: "patient_2", sdkAppId: "1400xxxxxx", ... } === 小程序端登录信息 === userId: patient_2 TUICallKit 初始化成功, userId: patient_2 [收到来电] from: doctor_1 [通话接通] ``` ### 需要帮助? 如果按照清单检查后仍然无法解决,请提供: 1. ✅ Web 端完整控制台日志(截图) 2. ✅ 小程序端完整控制台日志(截图) 3. ✅ 后端接口响应数据(隐藏 userSig) 4. ✅ 具体错误代码和提示信息 5. ✅ 测试环境信息(开发/生产,域名等) 6. ✅ 本清单的检查结果 --- **最后更新:** 2024-03-04 **版本:** 1.0