316 lines
7.9 KiB
Markdown
316 lines
7.9 KiB
Markdown
# 视频通话问题排查清单
|
||
|
||
## 问题:Web 端呼叫小程序端无法接听
|
||
|
||
### 第一步:确认基础环境 ✓
|
||
|
||
#### Web 端(医生端)
|
||
- [ ] 使用 HTTPS 协议访问(或 localhost)
|
||
- [ ] 浏览器支持 WebRTC(Chrome/Edge/Safari)
|
||
- [ ] 已授予摄像头和麦克风权限
|
||
- [ ] 网络连接正常
|
||
|
||
#### 小程序端(患者端)
|
||
- [ ] 已授予摄像头和麦克风权限
|
||
- [ ] 网络连接正常
|
||
- [ ] 小程序在前台运行(未切到后台)
|
||
- [ ] 微信版本支持音视频通话
|
||
|
||
### 第二步:确认登录状态 ✓
|
||
|
||
#### Web 端检查
|
||
打开浏览器控制台,查找日志:
|
||
```
|
||
TUICallKit init 方法调用完成
|
||
初始化完成,显示通话界面
|
||
```
|
||
|
||
如果看到这些日志,说明 Web 端登录成功。
|
||
|
||
#### 小程序端检查
|
||
1. 输入患者ID(如:2)
|
||
2. 点击"登录"
|
||
3. 看到提示"登录成功"
|
||
4. 界面显示"当前登录: patient_2"
|
||
|
||
如果看到这些,说明小程序端登录成功。
|
||
|
||
### 第三步:确认 userId 格式 ✓✓✓(最重要)
|
||
|
||
#### Web 端日志
|
||
在浏览器控制台查找:
|
||
```
|
||
=== 发起一对一通话 ===
|
||
后端返回的 patientUserId: patient_2
|
||
前端传入的 userId:
|
||
最终使用的 targetUserId: patient_2
|
||
```
|
||
|
||
记录 `targetUserId` 的值:__________________
|
||
|
||
#### 小程序端日志
|
||
在微信开发者工具控制台查找:
|
||
```
|
||
=== 小程序端登录信息 ===
|
||
userId: patient_2
|
||
```
|
||
|
||
记录 `userId` 的值:__________________
|
||
|
||
#### 对比结果
|
||
- [ ] Web 端的 `targetUserId` 和小程序端的 `userId` 完全一致
|
||
- [ ] 格式都是 `prefix_number`(如:patient_2)
|
||
- [ ] 没有多余的空格或特殊字符
|
||
|
||
**如果不一致,这就是问题所在!**
|
||
|
||
### 第四步:确认 SDKAppID 一致 ✓
|
||
|
||
#### Web 端日志
|
||
```
|
||
签名获取成功: {
|
||
doctorUserId: doctor_1,
|
||
patientUserId: patient_2,
|
||
sdkAppId: 1400xxxxxx
|
||
}
|
||
```
|
||
|
||
记录 `sdkAppId`:__________________
|
||
|
||
#### 小程序端日志
|
||
```
|
||
=== 小程序端登录信息 ===
|
||
sdkAppId: 1400xxxxxx
|
||
```
|
||
|
||
记录 `sdkAppId`:__________________
|
||
|
||
#### 对比结果
|
||
- [ ] 两个 SDKAppID 完全一致
|
||
|
||
**如果不一致,双方无法通话!**
|
||
|
||
### 第五步:测试呼叫流程 ✓
|
||
|
||
#### 从 Web 端呼叫小程序端
|
||
|
||
1. **准备工作**
|
||
- [ ] 小程序端已登录(显示"当前登录: patient_2")
|
||
- [ ] 小程序在前台运行
|
||
- [ ] Web 端已打开患者详情页
|
||
|
||
2. **发起呼叫**
|
||
- [ ] Web 端点击"视频通话"按钮
|
||
- [ ] Web 端显示"等待对方接听..."
|
||
- [ ] 浏览器控制台显示"通话已发起,目标用户: patient_2"
|
||
|
||
3. **小程序端应该**
|
||
- [ ] 自动弹出来电界面
|
||
- [ ] 显示来电提示音
|
||
- [ ] 显示"接听"和"拒绝"按钮
|
||
- [ ] 控制台显示收到来电信息
|
||
|
||
4. **如果小程序端没反应**
|
||
- 检查控制台是否有错误日志
|
||
- 确认 userId 格式是否一致
|
||
- 确认小程序是否在前台
|
||
- 尝试重新登录小程序
|
||
|
||
#### 从小程序端呼叫 Web 端
|
||
|
||
1. **准备工作**
|
||
- [ ] Web 端已登录(医生已登录系统)
|
||
- [ ] Web 端页面保持打开
|
||
- [ ] 小程序端已登录
|
||
|
||
2. **发起呼叫**
|
||
- [ ] 小程序端输入医生ID:`1` 或 `doctor_1`
|
||
- [ ] 点击"呼叫"按钮
|
||
- [ ] 小程序显示"正在呼叫..."
|
||
- [ ] 控制台显示"准备呼叫用户: doctor_1"
|
||
|
||
3. **Web 端应该**
|
||
- [ ] 自动弹出来电窗口
|
||
- [ ] 显示来电提示
|
||
- [ ] 显示"接听"和"拒绝"按钮
|
||
- [ ] 控制台显示收到来电信息
|
||
|
||
4. **如果 Web 端没反应**
|
||
- 检查控制台是否有错误日志
|
||
- 确认 userId 格式是否一致
|
||
- 确认 Web 端是否已登录
|
||
- 尝试刷新页面重新登录
|
||
|
||
### 第六步:常见错误代码 ✓
|
||
|
||
| 错误代码 | 错误信息 | 原因 | 解决方案 |
|
||
|---------|---------|------|---------|
|
||
| 60006 | 不支持 WebRTC | 非 HTTPS 环境 | 使用 HTTPS 或 localhost |
|
||
| 60007 | 设备不支持 | 浏览器不支持 | 更换浏览器 |
|
||
| 60008 | 对方拒绝 | 用户点击拒绝 | 正常情况 |
|
||
| 60009 | 对方未接听 | 超时未接听 | 正常情况 |
|
||
| 60010 | 对方忙线 | 对方正在通话中 | 稍后再试 |
|
||
| 60011 | 对方不在线 | userId 不匹配或未登录 | 检查 userId 格式 |
|
||
| 60012 | 网络连接失败 | 网络问题 | 检查网络 |
|
||
| 60013 | 权限未授予 | 摄像头/麦克风权限 | 授予权限 |
|
||
|
||
### 第七步:后端接口检查 ✓
|
||
|
||
#### 医生端接口(Web)
|
||
请求:`POST /api/tcm/getCallSignature`
|
||
```json
|
||
{
|
||
"diagnosis_id": 1,
|
||
"patient_id": 2
|
||
}
|
||
```
|
||
|
||
期望响应:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"data": {
|
||
"userId": "doctor_1", // 医生自己的ID
|
||
"patientUserId": "patient_2", // 要呼叫的患者ID
|
||
"sdkAppId": "1400xxxxxx",
|
||
"userSig": "eJw1..."
|
||
}
|
||
}
|
||
```
|
||
|
||
检查点:
|
||
- [ ] `userId` 格式正确(doctor_X)
|
||
- [ ] `patientUserId` 格式正确(patient_X)
|
||
- [ ] `sdkAppId` 正确
|
||
- [ ] `userSig` 不为空
|
||
|
||
#### 患者端接口(小程序)
|
||
请求:`GET /api/tcm/getPatientSignature?patient_id=2`
|
||
|
||
期望响应:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"data": {
|
||
"userId": "patient_2", // 患者自己的ID
|
||
"sdkAppId": "1400xxxxxx",
|
||
"userSig": "eJw1..."
|
||
}
|
||
}
|
||
```
|
||
|
||
检查点:
|
||
- [ ] `userId` 格式正确(patient_X)
|
||
- [ ] `sdkAppId` 与医生端一致
|
||
- [ ] `userSig` 不为空
|
||
|
||
### 第八步:网络抓包分析(高级)✓
|
||
|
||
如果以上都正常但仍无法通话,可以抓包分析:
|
||
|
||
#### 工具
|
||
- Chrome DevTools(Network 标签)
|
||
- 微信开发者工具(Network 标签)
|
||
- Wireshark(专业工具)
|
||
|
||
#### 检查点
|
||
1. **信令服务器连接**
|
||
- [ ] WebSocket 连接成功
|
||
- [ ] 收到服务器响应
|
||
|
||
2. **呼叫信令**
|
||
- [ ] 发送 INVITE 信令
|
||
- [ ] 收到 RINGING 响应
|
||
- [ ] 收到 ACCEPT 或 REJECT
|
||
|
||
3. **媒体流**
|
||
- [ ] ICE 候选交换成功
|
||
- [ ] DTLS 握手成功
|
||
- [ ] RTP 数据包传输
|
||
|
||
### 问题解决方案汇总
|
||
|
||
#### 问题 1:userId 格式不一致
|
||
**症状:** 错误代码 60011(对方不在线)
|
||
|
||
**解决:**
|
||
1. 检查后端接口返回的 userId 格式
|
||
2. 确保都使用 `prefix_number` 格式
|
||
3. 修改后端代码统一格式
|
||
|
||
#### 问题 2:SDKAppID 不一致
|
||
**症状:** 初始化失败或无法通话
|
||
|
||
**解决:**
|
||
1. 检查后端配置文件
|
||
2. 确保 Web 端和小程序端使用同一个腾讯云应用
|
||
3. 重新生成 userSig
|
||
|
||
#### 问题 3:小程序未在线
|
||
**症状:** 小程序端无反应
|
||
|
||
**解决:**
|
||
1. 确认小程序已登录
|
||
2. 确认小程序在前台运行
|
||
3. 尝试重新登录
|
||
|
||
#### 问题 4:权限未授予
|
||
**症状:** 无法访问摄像头/麦克风
|
||
|
||
**解决:**
|
||
1. 小程序:设置 → 权限管理 → 允许摄像头和麦克风
|
||
2. Web:浏览器地址栏 → 权限设置 → 允许摄像头和麦克风
|
||
3. 重新加载页面
|
||
|
||
#### 问题 5:网络问题
|
||
**症状:** 连接失败或断开
|
||
|
||
**解决:**
|
||
1. 检查网络连接
|
||
2. 尝试切换网络(WiFi/4G)
|
||
3. 检查防火墙设置
|
||
4. 确认服务器可访问
|
||
|
||
### 成功标志
|
||
|
||
当一切正常时,你应该看到:
|
||
|
||
#### Web 端控制台
|
||
```
|
||
WebRTC 环境检测: { isHttps: true, hasGetUserMedia: true, hasRTCPeerConnection: true }
|
||
签名获取成功: { doctorUserId: "doctor_1", patientUserId: "patient_2", sdkAppId: "1400xxxxxx" }
|
||
TUICallKit init 方法调用完成
|
||
初始化完成,显示通话界面
|
||
=== 发起一对一通话 ===
|
||
最终使用的 targetUserId: patient_2
|
||
通话已发起,目标用户: patient_2
|
||
>>> 正在呼叫
|
||
>>> 通话已接通
|
||
```
|
||
|
||
#### 小程序端控制台
|
||
```
|
||
获取签名成功: { userId: "patient_2", sdkAppId: "1400xxxxxx", ... }
|
||
=== 小程序端登录信息 ===
|
||
userId: patient_2
|
||
TUICallKit 初始化成功, userId: patient_2
|
||
[收到来电] from: doctor_1
|
||
[通话接通]
|
||
```
|
||
|
||
### 需要帮助?
|
||
|
||
如果按照清单检查后仍然无法解决,请提供:
|
||
|
||
1. ✅ Web 端完整控制台日志(截图)
|
||
2. ✅ 小程序端完整控制台日志(截图)
|
||
3. ✅ 后端接口响应数据(隐藏 userSig)
|
||
4. ✅ 具体错误代码和提示信息
|
||
5. ✅ 测试环境信息(开发/生产,域名等)
|
||
6. ✅ 本清单的检查结果
|
||
|
||
---
|
||
|
||
**最后更新:** 2024-03-04
|
||
**版本:** 1.0
|