Files
zyt/CHECK_USER_ONLINE_STATUS.md
T
2026-03-04 15:32:30 +08:00

5.0 KiB
Raw Blame History

检查用户在线状态

问题诊断

Web端显示:

  • 后端返回的 patientUserId: patient_2
  • 前端传入的 userId: patient_2
  • 最终使用的 targetUserId: patient_2

这说明 Web端的 userId 是正确的。问题可能在于:

  1. 小程序端使用了不同的 userId 格式
  2. 小程序端未登录或已离线
  3. 小程序端的 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,可以用它来测试:

  1. 在测试页面输入患者ID: 2
  2. 点击"初始化患者端"
  3. 在另一个窗口登录医生端
  4. 医生端发起通话给患者ID为2的患者
  5. 测试页面应该能收到来电

如果测试页面能收到来电,说明:

  • 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 }

检查点:

  1. 小程序端的接口是否返回了正确的 userId: 'patient_2'
  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 小程序端使用: 2user_2 或其他格式

解决方法: 修改小程序端代码,确保使用 patient_{id} 格式

原因2: 小程序端未保持在线

小程序在后台运行时可能会断开IM连接。

解决方法:

  1. 确保小程序在前台运行
  2. 在小程序的 onShow 事件中重新登录IM
  3. 监听网络状态变化,断线后自动重连

原因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端

  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端发起通话后的完整日志

    • 是否有错误码
    • 错误信息是什么