217 lines
5.0 KiB
Markdown
217 lines
5.0 KiB
Markdown
# 检查用户在线状态
|
||
|
||
## 问题诊断
|
||
|
||
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端发起通话后的完整日志**
|
||
- 是否有错误码
|
||
- 错误信息是什么
|