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

217 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 检查用户在线状态
## 问题诊断
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端发起通话后的完整日志**
- 是否有错误码
- 错误信息是什么