5.7 KiB
5.7 KiB
Web端呼叫小程序调试指南
当前状态
- ✅ 小程序呼叫Web端:正常
- ❌ Web端呼叫小程序:不通
调试步骤
步骤1: 检查后端返回的数据
打开浏览器控制台,查看发起通话时的日志:
=== 发起一对一通话 ===
后端返回的 patientUserId: patient_1
前端传入的 userId: patient_1
最终使用的 targetUserId: patient_1
完整的 res 对象: { sdkAppId: 1400xxx, userId: 'doctor_1', userSig: 'xxx', patientUserId: 'patient_1' }
检查点:
res.patientUserId是否存在?res.patientUserId的格式是否为patient_{id}?- 是否与小程序端登录时使用的 userId 一致?
步骤2: 检查小程序端的 userId
在小程序端,查看登录时使用的 userId:
// 小程序端代码
console.log('小程序登录的 userId:', userId)
// 应该输出: patient_1
检查点:
- 小程序端的 userId 格式是否为
patient_{id}? - 是否与Web端发起通话时使用的 userId 完全一致?
步骤3: 检查小程序端是否在线
方法1: 查看小程序端日志
// 小程序端应该有类似的日志
console.log('IM登录成功')
console.log('TUICallKit初始化成功')
方法2: 查看Web端错误码
- 如果返回
60011错误:说明小程序端不在线 - 如果返回
60010错误:说明小程序端忙线中 - 如果返回
60008错误:说明小程序端拒绝了通话
步骤4: 检查后端代码
确认后端是否正确返回 patientUserId:
// server/app/adminapi/logic/tcm/DiagnosisLogic.php
// getCallSignature 方法应该返回:
return [
'sdkAppId' => (int)$config['sdkAppId'],
'userId' => $doctorUserId, // 医生的userId
'userSig' => $userSig,
'patientUserId' => $patientUserId, // 患者的userId ← 必须有这个
'expireTime' => 86400
];
步骤5: 测试后端API
使用Postman或浏览器直接测试后端API:
POST /adminapi/tcm.diagnosis/getCallSignature
Content-Type: application/json
{
"diagnosis_id": 1,
"patient_id": 1
}
预期响应:
{
"code": 1,
"msg": "success",
"data": {
"sdkAppId": 1400xxx,
"userId": "doctor_1",
"userSig": "xxx",
"patientUserId": "patient_1", ← 必须有这个字段
"expireTime": 86400
}
}
步骤6: 检查小程序端初始化代码
小程序端必须正确初始化:
// 小程序端 app.js 或页面代码
import { TUICallKit } from '@tencentcloud/call-uikit-wechat'
// 1. 获取签名
const res = await wx.request({
url: 'https://your-api.com/getPatientSignature',
data: { patient_id: 1 }
})
// 2. 初始化
await TUICallKit.init({
SDKAppID: res.data.sdkAppId,
userID: res.data.userId, // 必须是 patient_1 格式
userSig: res.data.userSig
})
// 3. 监听来电
TUICallKit.on('onCallReceived', (event) => {
console.log('收到来电', event)
// 显示来电界面
})
常见问题
问题1: 后端没有返回 patientUserId
症状:
后端返回的 patientUserId: undefined
前端传入的 userId: patient_1
最终使用的 targetUserId: patient_1
解决方案:
- 检查后端代码是否已更新
- 清除后端缓存:
php think clear - 重启后端服务
问题2: userId 格式不一致
症状:
- Web端使用:
patient_1 - 小程序端使用:
1或user_1
解决方案:
统一使用 patient_{id} 格式
问题3: 小程序端未登录IM
症状:
- Web端发起通话后,返回 60011 错误(用户不在线)
- 小程序端没有收到任何通知
解决方案:
- 确保小程序端在启动时调用了
TUICallKit.init() - 确保小程序端保持在前台运行
- 检查小程序端的网络连接
问题4: SDKAppID 不一致
症状:
- Web端和小程序端使用了不同的 SDKAppID
解决方案: 确保Web端和小程序端使用相同的 SDKAppID
完整的调试日志示例
正常情况(应该看到的日志)
Web端:
签名获取成功: { doctorUserId: 'doctor_1', patientUserId: 'patient_1', sdkAppId: 1400xxx }
TUICallKit init 方法调用完成
初始化完成,显示通话界面
=== 发起一对一通话 ===
后端返回的 patientUserId: patient_1
前端传入的 userId: patient_1
最终使用的 targetUserId: patient_1
通话已发起,目标用户: patient_1
小程序端:
IM登录成功
TUICallKit初始化成功
收到来电: { inviter: 'doctor_1', inviteeList: ['patient_1'], callType: 1 }
异常情况(问题日志)
情况1: 后端未返回 patientUserId
后端返回的 patientUserId: undefined
前端传入的 userId: patient_1
最终使用的 targetUserId: patient_1
完整的 res 对象: { sdkAppId: 1400xxx, userId: 'doctor_1', userSig: 'xxx' }
↑ 缺少 patientUserId
情况2: 小程序端不在线
发起通话失败: Error: 对方不在线,无法发起通话
错误码: 60011
情况3: userId 格式不匹配
最终使用的 targetUserId: patient_1
小程序端登录的 userId: 1 ← 格式不一致
解决方案总结
-
确保后端返回 patientUserId
- 修改
getCallSignature方法 - 返回
patientUserId字段
- 修改
-
统一 userId 格式
- Web端:
patient_{id} - 小程序端:
patient_{id}
- Web端:
-
确保小程序端在线
- 小程序启动时初始化 TUICallKit
- 保持小程序在前台运行
-
添加详细日志
- Web端:查看控制台日志
- 小程序端:查看微信开发者工具控制台
下一步
- 打开浏览器控制台
- 发起一次通话
- 查看日志输出
- 根据日志判断问题所在
- 按照上述解决方案修复