# 快速修复：Web 端呼叫小程序端无法接听

## 核心问题

**userId 格式不匹配**是最常见的原因。

## 立即检查

### 1. 打开浏览器控制台（Web 端）

在发起通话前，查看日志：
```
=== 发起一对一通话 ===
后端返回的 patientUserId: patient_2
最终使用的 targetUserId: patient_2
```

### 2. 打开微信开发者工具控制台（小程序端）

在登录后，查看日志：
```
=== 小程序端登录信息 ===
userId: patient_2
```

### 3. 对比两个 userId

**必须完全一致！**

- ✅ 正确：Web 呼叫 `patient_2`，小程序登录为 `patient_2`
- ❌ 错误：Web 呼叫 `patient_2`，小程序登录为 `2`
- ❌ 错误：Web 呼叫 `2`，小程序登录为 `patient_2`

## 快速修复步骤

### 修复 1：确保后端返回正确格式

检查后端接口 `/api/tcm/getCallSignature` 和 `/api/tcm/getPatientSignature`：

```php
// 医生端（Web）
return [
    'userId' => 'doctor_' . $doctorId,        // 医生自己的ID
    'patientUserId' => 'patient_' . $patientId,  // 要呼叫的患者ID
    'sdkAppId' => $sdkAppId,
    'userSig' => $userSig
];

// 患者端（小程序）
return [
    'userId' => 'patient_' . $patientId,      // 患者自己的ID
    'sdkAppId' => $sdkAppId,
    'userSig' => $userSig
];
```

### 修复 2：小程序端已更新

小程序端代码已更新，支持自动转换：
- 输入纯数字 `1` → 自动转换为 `doctor_1`
- 输入完整格式 `doctor_1` → 直接使用

### 修复 3：测试流程

**场景 1：Web 端（医生）呼叫小程序端（患者）**

1. 小程序端操作：
   - 输入患者ID：`2`
   - 点击"登录"
   - 看到"当前登录: patient_2"

2. Web 端操作：
   - 打开患者详情页
   - 点击"视频通话"按钮
   - 系统自动使用 `patient_2` 发起呼叫

3. 小程序端应该：
   - 自动弹出来电界面
   - 显示来电提示
   - 可以接听或拒绝

**场景 2：小程序端（患者）呼叫 Web 端（医生）**

1. Web 端操作：
   - 医生登录系统（自动登录为 `doctor_1`）
   - 保持页面打开

2. 小程序端操作：
   - 已登录为 `patient_2`
   - 输入医生ID：`1` 或 `doctor_1`
   - 点击"呼叫"

3. Web 端应该：
   - 自动弹出来电界面
   - 显示来电提示
   - 可以接听或拒绝

## 常见错误及解决

### 错误 1：对方不在线（60011）

**原因：**
- 对方未登录
- userId 格式不匹配
- 对方已退出登录

**解决：**
1. 确认对方已登录
2. 检查 userId 格式是否一致
3. 让对方重新登录

### 错误 2：初始化失败

**原因：**
- SDKAppID 不一致
- userSig 过期或无效
- 网络连接问题

**解决：**
1. 检查双方 SDKAppID 是否相同
2. 重新获取 userSig
3. 检查网络连接

### 错误 3：无法访问摄像头/麦克风

**原因：**
- 小程序权限未授予
- 浏览器权限未授予
- 设备被其他应用占用

**解决：**
1. 小程序：在设置中允许摄像头和麦克风权限
2. 浏览器：点击地址栏的摄像头图标，允许权限
3. 关闭其他占用设备的应用

## 验证清单

在发起通话前，确认：

- [ ] 小程序端显示"当前登录: patient_X"
- [ ] Web 端控制台显示"最终使用的 targetUserId: patient_X"
- [ ] 两个 userId 完全一致
- [ ] 小程序在前台运行（未切换到后台）
- [ ] 双方网络连接正常
- [ ] 双方已授予摄像头和麦克风权限

## 测试命令

### 在小程序端控制台测试

```javascript
// 1. 检查登录状态
console.log('当前登录:', currentUserId.value)

// 2. 手动发起呼叫测试
TUICallKitAPI.calls({
  userIDList: ['doctor_1'],  // 替换为实际的医生ID
  type: 2
}).then(() => {
  console.log('呼叫成功')
}).catch(err => {
  console.error('呼叫失败:', err)
})
```

### 在 Web 端控制台测试

```javascript
// 1. 检查登录状态
console.log('医生登录信息:', {
  userId: '从后端获取',
  patientUserId: '要呼叫的患者ID'
})

// 2. 手动发起呼叫测试
TUICallKitServer.call({
  userID: 'patient_2',  // 替换为实际的患者ID
  type: TUICallType.VIDEO_CALL
}).then(() => {
  console.log('呼叫成功')
}).catch(err => {
  console.error('呼叫失败:', err)
})
```

## 仍然无法解决？

如果按照以上步骤仍然无法解决，请检查：

1. **后端日志**：查看签名生成是否正确
2. **网络抓包**：查看信令是否正常发送
3. **腾讯云控制台**：查看实时通话监控
4. **版本兼容性**：确保 Web 端和小程序端使用兼容的 SDK 版本

## 联系方式

提供以下信息以便快速定位问题：

1. Web 端完整控制台日志（截图）
2. 小程序端完整控制台日志（截图）
3. 后端返回的签名数据（隐藏敏感信息）
4. 具体错误代码和提示信息
