262 lines
6.1 KiB
Markdown
262 lines
6.1 KiB
Markdown
# 小程序端配置指南
|
||
|
||
## 问题原因
|
||
|
||
小程序端之前使用的是**本地生成的测试签名**(`GenerateTestUserSig`),这导致:
|
||
|
||
1. ❌ 小程序端和Web端使用了不同的 SDKAppID
|
||
2. ❌ 小程序端的 UserSig 可能已过期
|
||
3. ❌ 小程序端没有从后端获取统一的签名
|
||
|
||
## 解决方案
|
||
|
||
已修改 `wx/TUICallKit/pages/call.vue`,改为从后端获取签名。
|
||
|
||
## 配置步骤
|
||
|
||
### 步骤1: 修改后端API地址
|
||
|
||
在 `wx/TUICallKit/pages/call.vue` 中,找到这一行:
|
||
|
||
```javascript
|
||
url: 'https://your-domain.com/api/getPatientSignature', // 替换为你的后端地址
|
||
```
|
||
|
||
替换为你的实际后端地址,例如:
|
||
|
||
```javascript
|
||
url: 'https://your-domain.com/api/getPatientSignature',
|
||
// 或者
|
||
url: 'http://localhost:8000/api/getPatientSignature',
|
||
```
|
||
|
||
### 步骤2: 创建后端接口
|
||
|
||
需要在后端创建一个供小程序调用的接口:
|
||
|
||
```php
|
||
// server/app/api/controller/TcmController.php
|
||
|
||
/**
|
||
* @notes 获取患者签名(供小程序调用)
|
||
*/
|
||
public function getPatientSignature()
|
||
{
|
||
$patientId = $this->request->get('patient_id');
|
||
|
||
if (!$patientId) {
|
||
return $this->fail('患者ID不能为空');
|
||
}
|
||
|
||
// 调用逻辑层
|
||
$result = \app\adminapi\logic\tcm\DiagnosisLogic::getPatientSignature($patientId);
|
||
|
||
if ($result === false) {
|
||
return $this->fail(\app\adminapi\logic\tcm\DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->data($result);
|
||
}
|
||
```
|
||
|
||
### 步骤3: 添加后端逻辑
|
||
|
||
在 `DiagnosisLogic.php` 中添加方法:
|
||
|
||
```php
|
||
/**
|
||
* @notes 获取患者签名(供小程序调用)
|
||
* @param int $patientId
|
||
* @return array|bool
|
||
*/
|
||
public static function getPatientSignature(int $patientId)
|
||
{
|
||
try {
|
||
// 获取配置
|
||
$config = self::getTrtcConfig();
|
||
|
||
if (!$config) {
|
||
self::setError('请先配置腾讯云TRTC参数');
|
||
return false;
|
||
}
|
||
|
||
// 患者userId
|
||
$patientUserId = 'patient_' . $patientId;
|
||
|
||
// 生成患者的 UserSig
|
||
$userSig = self::generateUserSig(
|
||
$config['sdkAppId'],
|
||
$config['secretKey'],
|
||
$patientUserId
|
||
);
|
||
|
||
if (!$userSig) {
|
||
self::setError('生成签名失败');
|
||
return false;
|
||
}
|
||
|
||
// 确保患者账号已导入IM
|
||
self::ensurePatientImAccount($patientId, $patientUserId);
|
||
|
||
return [
|
||
'sdkAppId' => (int)$config['sdkAppId'],
|
||
'userId' => $patientUserId,
|
||
'userSig' => $userSig,
|
||
'expireTime' => 86400
|
||
];
|
||
} catch (\Exception $e) {
|
||
self::setError($e->getMessage());
|
||
return false;
|
||
}
|
||
}
|
||
```
|
||
|
||
### 步骤4: 配置路由
|
||
|
||
在路由文件中添加:
|
||
|
||
```php
|
||
// server/route/api.php
|
||
|
||
Route::get('getPatientSignature', 'tcm/getPatientSignature');
|
||
```
|
||
|
||
### 步骤5: 测试小程序端
|
||
|
||
1. 打开微信开发者工具
|
||
2. 打开小程序项目
|
||
3. 进入通话页面
|
||
4. 输入患者ID: `2`
|
||
5. 点击"登录"
|
||
6. 查看控制台日志,应该看到:
|
||
```
|
||
获取签名成功: { sdkAppId: xxx, userId: 'patient_2', userSig: 'xxx' }
|
||
TUICallKit 初始化成功, userId: patient_2
|
||
```
|
||
|
||
### 步骤6: 测试Web端呼叫小程序
|
||
|
||
1. 确保小程序端已登录(患者ID: 2)
|
||
2. 在Web端医生后台,找到患者ID为2的诊单
|
||
3. 点击"视频通话"按钮
|
||
4. 小程序端应该收到来电通知
|
||
|
||
## 使用说明
|
||
|
||
### 小程序端登录
|
||
|
||
1. 输入患者ID(数字,如:`2`)
|
||
2. 点击"登录"按钮
|
||
3. 等待初始化完成
|
||
4. 显示"当前登录: patient_2"
|
||
|
||
### 小程序端发起通话
|
||
|
||
1. 登录后,输入要呼叫的用户ID(如:`doctor_1`)
|
||
2. 点击"呼叫"按钮
|
||
3. 发起视频通话
|
||
|
||
### Web端呼叫小程序
|
||
|
||
1. 确保小程序端已登录
|
||
2. 在Web端点击"视频通话"
|
||
3. 小程序端会收到来电
|
||
|
||
## 关键点
|
||
|
||
### 1. userId 格式统一
|
||
|
||
- 患者: `patient_{id}`
|
||
- 医生: `doctor_{id}`
|
||
|
||
### 2. SDKAppID 必须一致
|
||
|
||
Web端和小程序端必须使用相同的 SDKAppID。
|
||
|
||
### 3. 从后端获取签名
|
||
|
||
不要使用本地生成的测试签名,必须从后端获取。
|
||
|
||
### 4. 保持在线状态
|
||
|
||
小程序在后台时可能会断开连接,需要在 `onShow` 时重新登录。
|
||
|
||
## 调试技巧
|
||
|
||
### 查看小程序端日志
|
||
|
||
在微信开发者工具的控制台中查看:
|
||
|
||
```javascript
|
||
console.log('获取签名成功:', signatureData)
|
||
console.log('TUICallKit 初始化成功, userId:', userId)
|
||
```
|
||
|
||
### 查看Web端日志
|
||
|
||
在浏览器控制台中查看:
|
||
|
||
```
|
||
=== 发起一对一通话 ===
|
||
后端返回的 patientUserId: patient_2
|
||
最终使用的 targetUserId: patient_2
|
||
通话已发起,目标用户: patient_2
|
||
```
|
||
|
||
### 常见错误
|
||
|
||
**错误1: 获取签名失败**
|
||
- 检查后端API地址是否正确
|
||
- 检查网络连接
|
||
- 检查后端接口是否正常
|
||
|
||
**错误2: 初始化失败**
|
||
- 检查 SDKAppID 是否正确
|
||
- 检查 UserSig 是否有效
|
||
- 检查网络连接
|
||
|
||
**错误3: 收不到来电**
|
||
- 检查小程序端是否已登录
|
||
- 检查 userId 格式是否一致
|
||
- 检查小程序是否在前台运行
|
||
|
||
## 完整流程
|
||
|
||
### 小程序端接收来电流程
|
||
|
||
1. 小程序启动
|
||
2. 输入患者ID(如:2)
|
||
3. 点击登录
|
||
4. 从后端获取签名(userId: patient_2)
|
||
5. 初始化 TUICallKit
|
||
6. 保持在线状态
|
||
7. Web端发起通话(目标: patient_2)
|
||
8. 小程序端收到来电
|
||
9. 接听或拒绝
|
||
|
||
### Web端发起通话流程
|
||
|
||
1. 医生登录后台
|
||
2. 找到患者诊单(patient_id: 2)
|
||
3. 点击"视频通话"
|
||
4. 从后端获取签名(patientUserId: patient_2)
|
||
5. 初始化 TUICallKit
|
||
6. 发起通话(目标: patient_2)
|
||
7. 等待小程序端接听
|
||
|
||
## 注意事项
|
||
|
||
1. **小程序端必须先登录**才能接收来电
|
||
2. **userId 格式必须一致**:都使用 `patient_{id}` 格式
|
||
3. **SDKAppID 必须相同**:Web端和小程序端使用同一个
|
||
4. **从后端获取签名**:不要使用本地测试签名
|
||
5. **保持在线状态**:小程序在后台时可能断开连接
|
||
|
||
## 下一步
|
||
|
||
1. 修改小程序端的后端API地址
|
||
2. 创建后端接口 `getPatientSignature`
|
||
3. 测试小程序端登录
|
||
4. 测试Web端呼叫小程序
|
||
5. 测试小程序端呼叫Web端
|