5.0 KiB
5.0 KiB
检查用户在线状态
问题诊断
Web端显示:
- 后端返回的 patientUserId:
patient_2 - 前端传入的 userId:
patient_2 - 最终使用的 targetUserId:
patient_2
这说明 Web端的 userId 是正确的。问题可能在于:
- 小程序端使用了不同的 userId 格式
- 小程序端未登录或已离线
- 小程序端的 SDKAppID 不一致
解决方案
方案1: 检查小程序端的 userId
在小程序端添加日志,查看登录时使用的 userId:
// 小程序端代码
const userId = `patient_${patientId}` // 确保格式一致
console.log('小程序端登录的 userId:', userId)
await TUICallKit.init({
SDKAppID: sdkAppId,
userID: userId, // 必须是 patient_2
userSig: userSig
})
console.log('TUICallKit 初始化成功,userId:', userId)
方案2: 使用测试页面验证
你已经有一个测试页面 admin/src/views/test/patient-call.vue,可以用它来测试:
- 在测试页面输入患者ID:
2 - 点击"初始化患者端"
- 在另一个窗口登录医生端
- 医生端发起通话给患者ID为2的患者
- 测试页面应该能收到来电
如果测试页面能收到来电,说明:
- Web端到Web端的通话是正常的
- 问题确实在小程序端
方案3: 检查小程序端的后端接口
小程序端应该有一个获取签名的接口,类似:
// 小程序端代码
const res = await wx.request({
url: 'https://your-api.com/api/getPatientSignature',
data: {
patient_id: 2
}
})
console.log('小程序端获取的签名:', res.data)
// 应该输出: { userId: 'patient_2', userSig: 'xxx', sdkAppId: xxx }
检查点:
- 小程序端的接口是否返回了正确的
userId: 'patient_2'? - 小程序端是否使用了这个 userId 来初始化?
方案4: 创建后端接口检查用户在线状态
可以创建一个后端接口来查询用户是否在线:
// server/app/adminapi/controller/tcm/DiagnosisController.php
/**
* @notes 检查用户在线状态
*/
public function checkUserOnline()
{
$userId = $this->request->get('user_id');
// 调用腾讯云IM REST API查询用户在线状态
$imService = new \app\common\service\TencentImService();
$result = $imService->checkUserOnline($userId);
return $this->data($result);
}
然后在Web端调用这个接口:
// 发起通话前先检查用户是否在线
const checkResult = await request.get({
url: '/tcm.diagnosis/checkUserOnline',
params: { user_id: 'patient_2' }
})
console.log('用户在线状态:', checkResult)
最可能的原因
根据经验,最常见的问题是:
原因1: 小程序端 userId 格式不一致
Web端使用: patient_2
小程序端使用: 2 或 user_2 或其他格式
解决方法:
修改小程序端代码,确保使用 patient_{id} 格式
原因2: 小程序端未保持在线
小程序在后台运行时可能会断开IM连接。
解决方法:
- 确保小程序在前台运行
- 在小程序的
onShow事件中重新登录IM - 监听网络状态变化,断线后自动重连
原因3: 小程序端初始化失败
小程序端可能初始化失败但没有报错。
解决方法: 添加详细的错误处理:
try {
await TUICallKit.init({
SDKAppID: sdkAppId,
userID: userId,
userSig: userSig
})
console.log('初始化成功')
} catch (error) {
console.error('初始化失败:', error)
wx.showToast({
title: '初始化失败: ' + error.message,
icon: 'none'
})
}
调试步骤
步骤1: 使用测试页面验证Web端
- 打开
http://localhost:5173/#/test/patient-call - 输入患者ID:
2 - 点击"初始化患者端"
- 在另一个窗口发起通话
- 如果能收到来电,说明Web端正常
步骤2: 检查小程序端日志
在微信开发者工具中查看控制台日志:
期望看到的日志:
- 获取签名成功: { userId: 'patient_2', ... }
- TUICallKit 初始化成功
- IM 登录成功
步骤3: 对比 userId
确保两端使用的 userId 完全一致:
Web端发起通话: patient_2
小程序端登录: patient_2 ← 必须一致
步骤4: 检查 SDKAppID
确保两端使用相同的 SDKAppID:
Web端: 1400xxx
小程序端: 1400xxx ← 必须一致
快速验证方法
最快的验证方法是:
- 打开测试页面,初始化患者ID为2
- 在医生端发起通话
- 如果测试页面能收到来电 → 问题在小程序端
- 如果测试页面收不到来电 → 问题在Web端
需要提供的信息
为了进一步帮助你,请提供:
-
小程序端的初始化代码
- 如何获取 userId
- 如何初始化 TUICallKit
-
小程序端的控制台日志
- 初始化时的日志
- 是否有错误信息
-
测试页面的测试结果
- 能否收到来电
- 控制台有什么日志
-
Web端发起通话后的完整日志
- 是否有错误码
- 错误信息是什么