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