294 lines
7.6 KiB
Markdown
294 lines
7.6 KiB
Markdown
# 小程序后端接口配置完成
|
||
|
||
## 已创建的文件
|
||
|
||
### 1. 控制器
|
||
`server/app/api/controller/TcmController.php`
|
||
|
||
```php
|
||
<?php
|
||
namespace app\api\controller;
|
||
|
||
use app\adminapi\logic\tcm\DiagnosisLogic;
|
||
|
||
class TcmController extends BaseApiController
|
||
{
|
||
public function getPatientSignature()
|
||
{
|
||
$patientId = $this->request->get('patient_id');
|
||
|
||
if (!$patientId) {
|
||
return $this->fail('患者ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::getPatientSignature($patientId);
|
||
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->data($result);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 逻辑层方法
|
||
已在 `server/app/adminapi/logic/tcm/DiagnosisLogic.php` 中添加:
|
||
|
||
```php
|
||
public static function getPatientSignature(int $patientId)
|
||
{
|
||
// 生成患者的 UserSig
|
||
// 返回 sdkAppId, userId, userSig
|
||
}
|
||
```
|
||
|
||
## API 接口信息
|
||
|
||
### 接口地址
|
||
```
|
||
GET /api/tcm/getPatientSignature
|
||
```
|
||
|
||
### 请求参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| patient_id | int | 是 | 患者ID |
|
||
|
||
### 请求示例
|
||
```
|
||
GET http://your-domain.com/api/tcm/getPatientSignature?patient_id=2
|
||
```
|
||
|
||
### 响应示例
|
||
|
||
**成功响应:**
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"sdkAppId": 1400123456,
|
||
"userId": "patient_2",
|
||
"userSig": "eJwtzMsKgj...",
|
||
"expireTime": 86400
|
||
}
|
||
}
|
||
```
|
||
|
||
**失败响应:**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"msg": "患者ID不能为空",
|
||
"data": []
|
||
}
|
||
```
|
||
|
||
## 小程序端配置
|
||
|
||
### 修改 API 地址
|
||
|
||
在 `wx/TUICallKit/pages/call.vue` 中,修改第47行:
|
||
|
||
```javascript
|
||
// 开发环境
|
||
url: 'http://localhost:8000/api/tcm/getPatientSignature',
|
||
|
||
// 或生产环境
|
||
url: 'https://your-domain.com/api/tcm/getPatientSignature',
|
||
```
|
||
|
||
### 完整的小程序端代码
|
||
|
||
```javascript
|
||
// 从后端获取签名
|
||
const getSignatureFromServer = async (patientId) => {
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: 'http://your-domain.com/api/tcm/getPatientSignature',
|
||
method: 'GET',
|
||
data: {
|
||
patient_id: patientId
|
||
},
|
||
success: (res) => {
|
||
if (res.data && res.data.code === 1) {
|
||
resolve(res.data.data);
|
||
} else {
|
||
reject(new Error(res.data.msg || '获取签名失败'));
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
reject(err);
|
||
}
|
||
});
|
||
});
|
||
};
|
||
```
|
||
|
||
## 测试步骤
|
||
|
||
### 1. 测试后端接口
|
||
|
||
使用浏览器或 Postman 测试:
|
||
|
||
```
|
||
http://localhost:8000/api/tcm/getPatientSignature?patient_id=2
|
||
```
|
||
|
||
**预期响应:**
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"sdkAppId": 1400xxx,
|
||
"userId": "patient_2",
|
||
"userSig": "xxx...",
|
||
"expireTime": 86400
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 测试小程序端登录
|
||
|
||
1. 打开微信开发者工具
|
||
2. 打开小程序项目
|
||
3. 进入通话页面
|
||
4. 输入患者ID: `2`
|
||
5. 点击"登录"按钮
|
||
6. 查看控制台日志
|
||
|
||
**预期日志:**
|
||
```
|
||
获取签名成功: { sdkAppId: xxx, userId: 'patient_2', userSig: 'xxx' }
|
||
TUICallKit 初始化成功, userId: patient_2
|
||
```
|
||
|
||
### 3. 测试 Web 端呼叫小程序
|
||
|
||
1. 确保小程序端已登录(患者ID: 2)
|
||
2. 在 Web 端医生后台,找到患者ID为2的诊单
|
||
3. 点击"视频通话"按钮
|
||
4. 小程序端应该收到来电通知
|
||
|
||
## 常见问题
|
||
|
||
### 问题1: 接口404
|
||
|
||
**症状:**
|
||
```
|
||
GET http://localhost:8000/api/tcm/getPatientSignature?patient_id=2
|
||
404 Not Found
|
||
```
|
||
|
||
**解决方案:**
|
||
1. 检查控制器文件是否存在:`server/app/api/controller/TcmController.php`
|
||
2. 检查命名空间是否正确:`namespace app\api\controller;`
|
||
3. 清除缓存:`php think clear`
|
||
4. 重启服务器
|
||
|
||
### 问题2: 获取签名失败
|
||
|
||
**症状:**
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"msg": "请先配置腾讯云TRTC参数",
|
||
"data": []
|
||
}
|
||
```
|
||
|
||
**解决方案:**
|
||
在后台配置腾讯云 TRTC 参数(SDKAppID 和 SecretKey)
|
||
|
||
### 问题3: 跨域问题
|
||
|
||
**症状:**
|
||
```
|
||
Access to XMLHttpRequest at 'http://localhost:8000/api/tcm/getPatientSignature'
|
||
from origin 'http://localhost:5173' has been blocked by CORS policy
|
||
```
|
||
|
||
**解决方案:**
|
||
在后端配置 CORS 允许跨域访问
|
||
|
||
### 问题4: 小程序请求失败
|
||
|
||
**症状:**
|
||
```
|
||
request:fail url not in domain list
|
||
```
|
||
|
||
**解决方案:**
|
||
1. 在微信公众平台配置服务器域名
|
||
2. 或在微信开发者工具中勾选"不校验合法域名"
|
||
|
||
## 完整流程图
|
||
|
||
```
|
||
小程序端 后端服务器 Web端
|
||
| | |
|
||
|-- 1. 输入患者ID: 2 | |
|
||
| | |
|
||
|-- 2. 请求签名 ------------>| |
|
||
| GET /api/tcm/ | |
|
||
| getPatientSignature | |
|
||
| ?patient_id=2 | |
|
||
| | |
|
||
| |-- 3. 生成 UserSig |
|
||
| | userId: patient_2 |
|
||
| | |
|
||
|<-- 4. 返回签名 ------------| |
|
||
| { userId: patient_2, | |
|
||
| userSig: xxx } | |
|
||
| | |
|
||
|-- 5. 初始化 TUICallKit | |
|
||
| 登录 IM | |
|
||
| | |
|
||
|-- 6. 保持在线 | |
|
||
| | |
|
||
| | |-- 7. 医生点击"视频通话"
|
||
| | |
|
||
| |<-- 8. 请求签名 -----------|
|
||
| | POST /adminapi/tcm. |
|
||
| | diagnosis/ |
|
||
| | getCallSignature |
|
||
| | |
|
||
| |-- 9. 返回签名 ----------->|
|
||
| | { patientUserId: |
|
||
| | patient_2 } |
|
||
| | |
|
||
| | |-- 10. 发起通话
|
||
| | | 目标: patient_2
|
||
| | |
|
||
|<-- 11. 收到来电 ------------------------------------ IM服务器
|
||
| | |
|
||
|-- 12. 接听/拒绝 | |
|
||
| | |
|
||
```
|
||
|
||
## 下一步
|
||
|
||
1. ✅ 后端接口已创建
|
||
2. ✅ 逻辑层方法已添加
|
||
3. ⏳ 修改小程序端 API 地址
|
||
4. ⏳ 测试后端接口
|
||
5. ⏳ 测试小程序端登录
|
||
6. ⏳ 测试 Web 端呼叫小程序
|
||
|
||
## 注意事项
|
||
|
||
1. **API 地址**:根据实际部署环境修改
|
||
2. **跨域配置**:如果小程序和后端不在同一域名,需要配置 CORS
|
||
3. **HTTPS**:生产环境必须使用 HTTPS
|
||
4. **域名白名单**:小程序需要在微信公众平台配置服务器域名
|
||
5. **日志记录**:已添加详细日志,方便调试
|
||
|
||
## 相关文件
|
||
|
||
- 控制器:`server/app/api/controller/TcmController.php`
|
||
- 逻辑层:`server/app/adminapi/logic/tcm/DiagnosisLogic.php`
|
||
- 小程序端:`wx/TUICallKit/pages/call.vue`
|
||
- 配置指南:`MINIPROGRAM_SETUP_GUIDE.md`
|