# Web 端呼叫小程序端调试指南

## 问题现象
Web 端呼叫小程序端时，小程序端无法接听通话。

## 常见原因及解决方案

### 1. userId 格式不一致（最常见）

**问题：**
- Web 端使用 `doctor_1` 格式
- 小程序端使用 `patient_2` 格式
- 呼叫时 userId 格式不匹配

**解决方案：**
确保双方使用相同的 userId 格式规则。

**检查步骤：**

1. **查看 Web 端日志**（浏览器控制台）：
```javascript
// 在 admin/src/components/video-call/index.vue 中查找
console.log('=== 发起一对一通话 ===')
console.log('后端返回的 patientUserId:', res.patientUserId)
console.log('最终使用的 targetUserId:', targetUserId)
```

2. **查看小程序端日志**（微信开发者工具控制台）：
```javascript
// 在 wx/TUICallKit/pages/call.vue 中查找
console.log('=== 小程序端登录信息 ===')
console.log('userId:', userId)
console.log('准备呼叫用户:', targetUserId)
```

3. **确保格式一致**：
   - 如果 Web 端医生登录为 `doctor_1`，小程序端患者登录为 `patient_2`
   - Web 端呼叫时应使用 `patient_2`
   - 小程序端呼叫时应使用 `doctor_1`

### 2. SDKAppID 不一致

**问题：**
Web 端和小程序端使用了不同的腾讯云应用。

**解决方案：**
确保双方使用相同的 SDKAppID。

**检查步骤：**
```javascript
// Web 端
console.log('Web 端 SDKAppID:', res.sdkAppId)

// 小程序端
console.log('小程序端 SDKAppID:', sdkAppId)
```

### 3. 小程序端未在线

**问题：**
小程序端未登录或已退出登录状态。

**解决方案：**
1. 确保小程序端已成功登录
2. 查看小程序端是否显示"当前登录: patient_X"
3. 检查小程序端是否在前台运行

### 4. 网络权限问题

**问题：**
小程序端网络权限配置不正确。

**解决方案：**
检查 `wx/TUICallKit/manifest.json` 或 `project.config.json`：

```json
{
  "permission": {
    "scope.camera": {
      "desc": "需要使用您的摄像头进行视频通话"
    },
    "scope.record": {
      "desc": "需要使用您的麦克风进行语音通话"
    }
  },
  "requiredPrivateInfos": [
    "getLocation",
    "chooseLocation",
    "onLocationChange",
    "startLocationUpdate"
  ]
}
```

### 5. 信令服务器连接问题

**问题：**
小程序端未成功连接到腾讯云信令服务器。

**解决方案：**
1. 检查小程序端初始化是否成功
2. 查看是否有网络错误日志
3. 确认 userSig 是否有效（未过期）

## 调试步骤

### 步骤 1：验证登录状态

**Web 端：**
```javascript
// 在浏览器控制台执行
console.log('Web 端登录信息:', {
  userId: res.userId,
  sdkAppId: res.sdkAppId
})
```

**小程序端：**
```javascript
// 在微信开发者工具控制台查看
console.log('小程序端登录信息:', {
  userId: currentUserId.value,
  isLogin: isLogin.value
})
```

### 步骤 2：验证呼叫参数

**Web 端呼叫时：**
```javascript
// 查看控制台输出
console.log('准备发起一对一通话，目标用户:', targetUserId)
```

**小程序端应该收到：**
- 来电通知
- TUICallKit 界面自动弹出

### 步骤 3：检查错误日志

**Web 端可能的错误：**
- `60011`: 对方不在线
- `60010`: 对方忙线中
- `60008`: 对方拒绝了通话

**小程序端可能的错误：**
- 初始化失败
- 网络连接失败
- 权限未授予

## 测试方案

### 方案 1：同一设备测试（推荐）

1. 在电脑上打开 Web 端（医生端）
2. 在手机上打开小程序（患者端）
3. 小程序端先登录（输入患者ID，如：2）
4. Web 端发起呼叫（目标用户应为 `patient_2`）

### 方案 2：双向测试

1. **Web 呼叫小程序：**
   - 小程序端登录：患者ID = 2（登录为 `patient_2`）
   - Web 端呼叫：目标用户 = `patient_2`

2. **小程序呼叫 Web：**
   - Web 端登录：医生ID = 1（登录为 `doctor_1`）
   - 小程序端呼叫：输入 `doctor_1` 或 `1`（会自动转换为 `doctor_1`）

## 后端接口检查

确保后端返回正确的 userId 格式：

```php
// 医生端获取签名
{
  "userId": "doctor_1",      // 医生自己的ID
  "patientUserId": "patient_2",  // 要呼叫的患者ID
  "sdkAppId": "1400xxxxx",
  "userSig": "eJw1..."
}

// 患者端获取签名
{
  "userId": "patient_2",     // 患者自己的ID
  "sdkAppId": "1400xxxxx",
  "userSig": "eJw1..."
}
```

## 常用调试命令

### 查看小程序端 TUICallKit 状态
```javascript
// 在微信开发者工具控制台执行
console.log('TUICallKit 状态:', TUICallKitAPI)
```

### 手动测试呼叫
```javascript
// 在小程序端控制台执行
TUICallKitAPI.calls({
  userIDList: ['doctor_1'],
  type: 2
}).then(() => {
  console.log('呼叫成功')
}).catch(err => {
  console.error('呼叫失败:', err)
})
```

## 问题排查清单

- [ ] Web 端和小程序端使用相同的 SDKAppID
- [ ] userId 格式一致（都使用 `prefix_id` 格式）
- [ ] 小程序端已成功登录并在线
- [ ] 小程序端在前台运行（未切换到后台）
- [ ] 网络连接正常
- [ ] 摄像头和麦克风权限已授予
- [ ] userSig 未过期（有效期通常为 7 天）
- [ ] 后端接口返回正确的 userId

## 联系支持

如果以上方法都无法解决问题，请提供以下信息：

1. Web 端控制台完整日志
2. 小程序端控制台完整日志
3. 后端返回的签名数据（隐藏 userSig）
4. 具体的错误提示信息
5. 测试环境（开发/生产）
