# 快速修复:Web 端呼叫小程序端无法接听 ## 核心问题 **userId 格式不匹配**是最常见的原因。 ## 立即检查 ### 1. 打开浏览器控制台(Web 端) 在发起通话前,查看日志: ``` === 发起一对一通话 === 后端返回的 patientUserId: patient_2 最终使用的 targetUserId: patient_2 ``` ### 2. 打开微信开发者工具控制台(小程序端) 在登录后,查看日志: ``` === 小程序端登录信息 === userId: patient_2 ``` ### 3. 对比两个 userId **必须完全一致!** - ✅ 正确:Web 呼叫 `patient_2`,小程序登录为 `patient_2` - ❌ 错误:Web 呼叫 `patient_2`,小程序登录为 `2` - ❌ 错误:Web 呼叫 `2`,小程序登录为 `patient_2` ## 快速修复步骤 ### 修复 1:确保后端返回正确格式 检查后端接口 `/api/tcm/getCallSignature` 和 `/api/tcm/getPatientSignature`: ```php // 医生端(Web) return [ 'userId' => 'doctor_' . $doctorId, // 医生自己的ID 'patientUserId' => 'patient_' . $patientId, // 要呼叫的患者ID 'sdkAppId' => $sdkAppId, 'userSig' => $userSig ]; // 患者端(小程序) return [ 'userId' => 'patient_' . $patientId, // 患者自己的ID 'sdkAppId' => $sdkAppId, 'userSig' => $userSig ]; ``` ### 修复 2:小程序端已更新 小程序端代码已更新,支持自动转换: - 输入纯数字 `1` → 自动转换为 `doctor_1` - 输入完整格式 `doctor_1` → 直接使用 ### 修复 3:测试流程 **场景 1:Web 端(医生)呼叫小程序端(患者)** 1. 小程序端操作: - 输入患者ID:`2` - 点击"登录" - 看到"当前登录: patient_2" 2. Web 端操作: - 打开患者详情页 - 点击"视频通话"按钮 - 系统自动使用 `patient_2` 发起呼叫 3. 小程序端应该: - 自动弹出来电界面 - 显示来电提示 - 可以接听或拒绝 **场景 2:小程序端(患者)呼叫 Web 端(医生)** 1. Web 端操作: - 医生登录系统(自动登录为 `doctor_1`) - 保持页面打开 2. 小程序端操作: - 已登录为 `patient_2` - 输入医生ID:`1` 或 `doctor_1` - 点击"呼叫" 3. Web 端应该: - 自动弹出来电界面 - 显示来电提示 - 可以接听或拒绝 ## 常见错误及解决 ### 错误 1:对方不在线(60011) **原因:** - 对方未登录 - userId 格式不匹配 - 对方已退出登录 **解决:** 1. 确认对方已登录 2. 检查 userId 格式是否一致 3. 让对方重新登录 ### 错误 2:初始化失败 **原因:** - SDKAppID 不一致 - userSig 过期或无效 - 网络连接问题 **解决:** 1. 检查双方 SDKAppID 是否相同 2. 重新获取 userSig 3. 检查网络连接 ### 错误 3:无法访问摄像头/麦克风 **原因:** - 小程序权限未授予 - 浏览器权限未授予 - 设备被其他应用占用 **解决:** 1. 小程序:在设置中允许摄像头和麦克风权限 2. 浏览器:点击地址栏的摄像头图标,允许权限 3. 关闭其他占用设备的应用 ## 验证清单 在发起通话前,确认: - [ ] 小程序端显示"当前登录: patient_X" - [ ] Web 端控制台显示"最终使用的 targetUserId: patient_X" - [ ] 两个 userId 完全一致 - [ ] 小程序在前台运行(未切换到后台) - [ ] 双方网络连接正常 - [ ] 双方已授予摄像头和麦克风权限 ## 测试命令 ### 在小程序端控制台测试 ```javascript // 1. 检查登录状态 console.log('当前登录:', currentUserId.value) // 2. 手动发起呼叫测试 TUICallKitAPI.calls({ userIDList: ['doctor_1'], // 替换为实际的医生ID type: 2 }).then(() => { console.log('呼叫成功') }).catch(err => { console.error('呼叫失败:', err) }) ``` ### 在 Web 端控制台测试 ```javascript // 1. 检查登录状态 console.log('医生登录信息:', { userId: '从后端获取', patientUserId: '要呼叫的患者ID' }) // 2. 手动发起呼叫测试 TUICallKitServer.call({ userID: 'patient_2', // 替换为实际的患者ID type: TUICallType.VIDEO_CALL }).then(() => { console.log('呼叫成功') }).catch(err => { console.error('呼叫失败:', err) }) ``` ## 仍然无法解决? 如果按照以上步骤仍然无法解决,请检查: 1. **后端日志**:查看签名生成是否正确 2. **网络抓包**:查看信令是否正常发送 3. **腾讯云控制台**:查看实时通话监控 4. **版本兼容性**:确保 Web 端和小程序端使用兼容的 SDK 版本 ## 联系方式 提供以下信息以便快速定位问题: 1. Web 端完整控制台日志(截图) 2. 小程序端完整控制台日志(截图) 3. 后端返回的签名数据(隐藏敏感信息) 4. 具体错误代码和提示信息