# 检查用户在线状态 ## 问题诊断 Web端显示: - 后端返回的 patientUserId: `patient_2` - 前端传入的 userId: `patient_2` - 最终使用的 targetUserId: `patient_2` 这说明 Web端的 userId 是正确的。问题可能在于: 1. 小程序端使用了不同的 userId 格式 2. 小程序端未登录或已离线 3. 小程序端的 SDKAppID 不一致 ## 解决方案 ### 方案1: 检查小程序端的 userId 在小程序端添加日志,查看登录时使用的 userId: ```javascript // 小程序端代码 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`,可以用它来测试: 1. 在测试页面输入患者ID: `2` 2. 点击"初始化患者端" 3. 在另一个窗口登录医生端 4. 医生端发起通话给患者ID为2的患者 5. 测试页面应该能收到来电 如果测试页面能收到来电,说明: - Web端到Web端的通话是正常的 - 问题确实在小程序端 ### 方案3: 检查小程序端的后端接口 小程序端应该有一个获取签名的接口,类似: ```javascript // 小程序端代码 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 } ``` **检查点:** 1. 小程序端的接口是否返回了正确的 `userId: 'patient_2'`? 2. 小程序端是否使用了这个 userId 来初始化? ### 方案4: 创建后端接口检查用户在线状态 可以创建一个后端接口来查询用户是否在线: ```php // 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端调用这个接口: ```typescript // 发起通话前先检查用户是否在线 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连接。 **解决方法:** 1. 确保小程序在前台运行 2. 在小程序的 `onShow` 事件中重新登录IM 3. 监听网络状态变化,断线后自动重连 ### 原因3: 小程序端初始化失败 小程序端可能初始化失败但没有报错。 **解决方法:** 添加详细的错误处理: ```javascript 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端 1. 打开 `http://localhost:5173/#/test/patient-call` 2. 输入患者ID: `2` 3. 点击"初始化患者端" 4. 在另一个窗口发起通话 5. 如果能收到来电,说明Web端正常 ### 步骤2: 检查小程序端日志 在微信开发者工具中查看控制台日志: ``` 期望看到的日志: - 获取签名成功: { userId: 'patient_2', ... } - TUICallKit 初始化成功 - IM 登录成功 ``` ### 步骤3: 对比 userId 确保两端使用的 userId 完全一致: ``` Web端发起通话: patient_2 小程序端登录: patient_2 ← 必须一致 ``` ### 步骤4: 检查 SDKAppID 确保两端使用相同的 SDKAppID: ``` Web端: 1400xxx 小程序端: 1400xxx ← 必须一致 ``` ## 快速验证方法 最快的验证方法是: 1. 打开测试页面,初始化患者ID为2 2. 在医生端发起通话 3. 如果测试页面能收到来电 → 问题在小程序端 4. 如果测试页面收不到来电 → 问题在Web端 ## 需要提供的信息 为了进一步帮助你,请提供: 1. **小程序端的初始化代码** - 如何获取 userId - 如何初始化 TUICallKit 2. **小程序端的控制台日志** - 初始化时的日志 - 是否有错误信息 3. **测试页面的测试结果** - 能否收到来电 - 控制台有什么日志 4. **Web端发起通话后的完整日志** - 是否有错误码 - 错误信息是什么