Files
wecom-ai-assistant/docs/wecom-test-guide.md
2026-02-05 16:36:32 +08:00

545 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 企业微信回调功能测试详细流程
## 一、前置准备
### 1.1 检查服务状态
```bash
# 检查所有服务是否运行
docker compose ps
# 应该看到:
# - ai-db-1 (Running)
# - ai-backend-1 (Running)
# - ai-admin-1 (Running可选)
```
### 1.2 检查后端日志
```bash
# 查看后端最新日志,确认无错误
docker compose logs backend --tail 50
# 应该看到:
# INFO: Uvicorn running on http://0.0.0.0:8000
# INFO: Application startup complete.
```
### 1.3 配置环境变量
编辑 `.env` 文件,确保以下企业微信相关配置已填写:
```bash
# 企业微信配置(必须)
WECOM_CORP_ID=你的企业ID # 从"我的企业 → 企业信息"获取
WECOM_AGENT_ID=你的应用AgentId # 从"自建应用 → 应用详情"获取
WECOM_SECRET=你的应用Secret # 从"自建应用 → 应用详情"获取(可选,用于主动发送消息)
WECOM_TOKEN=你的Token # 自定义字符串,需与企微后台一致
WECOM_ENCODING_AES_KEY=你的43位密钥 # 从企微后台获取43位Base64编码
WECOM_API_BASE=https://qyapi.weixin.qq.com
WECOM_API_TIMEOUT=10
WECOM_API_RETRIES=2
```
**重要提示**
- `WECOM_TOKEN``WECOM_ENCODING_AES_KEY` 必须与企微后台配置**完全一致**
- `WECOM_ENCODING_AES_KEY` 是 43 位 Base64 编码字符串(不含等号)
### 1.4 重启后端服务(如果修改了 .env
```bash
# 重启后端以加载新的环境变量
docker compose restart backend
# 等待几秒后检查日志
docker compose logs backend --tail 20
```
---
## 二、企业微信后台配置
### 2.1 获取必要参数
1. **登录企业微信管理后台**https://work.weixin.qq.com
2. **获取企业 ID (CorpId)**
- 进入 **我的企业****企业信息**
- 复制 **企业 ID**,填入 `.env``WECOM_CORP_ID`
3. **获取应用信息**
- 进入 **应用管理****自建应用** → 选择你的应用
-**应用详情** 中获取:
- **AgentId**:填入 `.env``WECOM_AGENT_ID`
- **Secret**:填入 `.env``WECOM_SECRET`(可选)
### 2.2 配置回调 URL关键步骤
1. **进入接收消息设置**
- 在应用详情页面,找到 **接收消息****API接收**
- 点击 **设置 API 接收****配置回调URL**
2. **填写回调配置**
- **接收消息服务器 URL**`https://你的公网域名/api/wecom/callback`
- 本地测试:使用 ngrok 等工具暴露本地服务(见下方)
- 生产环境:使用你的实际域名
- **Token**:填写一个自定义字符串(例如:`my_wecom_token_2025`
- **重要**:这个 Token 必须与 `.env` 中的 `WECOM_TOKEN` **完全一致**
- **EncodingAESKey**
- 点击 **随机获取** 或手动输入 43 位 Base64 编码字符串
- **重要**:这个密钥必须与 `.env` 中的 `WECOM_ENCODING_AES_KEY` **完全一致**
- **消息加解密方式**:选择 **安全模式**(推荐)或 **明文模式**(仅测试)
3. **保存配置**
- 点击 **保存** 按钮
- 企业微信会立即发送 GET 请求到你的回调 URL 进行校验
- 如果配置正确,会显示 **保存成功**
---
## 三、本地测试方法
### 方法 1使用 Cloudflare Tunnel推荐 ⭐⭐⭐⭐⭐)
Cloudflare Tunnel (cloudflared) 提供免费的固定域名,比 ngrok 更稳定。
#### 3.1 安装 cloudflared
**Windows使用 Scoop**
```powershell
# 安装 Scoop如果还没有
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
# 安装 cloudflared
scoop install cloudflared
```
**或使用 Chocolatey**
```powershell
choco install cloudflared
```
**或手动下载**
- 访问https://github.com/cloudflare/cloudflared/releases
- 下载 `cloudflared-windows-amd64.exe`,重命名为 `cloudflared.exe`
#### 3.2 启动 cloudflared
```powershell
# 在项目根目录运行(暴露本地 8000 端口)
cloudflared tunnel --url http://localhost:8000
```
**输出示例**
```
2025-02-05T10:00:00Z INF +--------------------------------------------------------------------------------------------+
2025-02-05T10:00:00Z INF | Your quick Tunnel has been created! Visit it at: |
2025-02-05T10:00:00Z INF | https://abc123-def456-ghi789.trycloudflare.com |
2025-02-05T10:00:00Z INF +--------------------------------------------------------------------------------------------+
```
#### 3.3 获取公网 URL
从输出中复制 `https://xxx.trycloudflare.com`,这就是你的公网 URL。
**注意**
- 这个 URL 在本次运行期间是固定的
- 关闭 cloudflared 后URL 会失效
- 如需固定域名,请登录 Cloudflare 创建命名 tunnel`docs/cloudflared-setup.md`
#### 3.4 配置企微后台
在企微后台的回调 URL 中填写:`https://你的cloudflared域名.trycloudflare.com/api/wecom/callback`
例如:`https://abc123-def456-ghi789.trycloudflare.com/api/wecom/callback`
#### 3.5 保存并验证
1. 点击 **保存**
2. 观察后端日志:
```bash
docker compose logs backend -f
```
3. 应该看到:
```
INFO: wecom verify success {"trace_id": "...", "echostr_length": 43}
```
4. 企微后台应显示 **保存成功**
**详细文档**:参见 `docs/cloudflared-setup.md`
---
### 方法 2使用 ngrok 暴露本地服务
#### 2.1 安装 ngrok
- **Windows**:下载 https://ngrok.com/download解压到任意目录
- **或使用包管理器**`choco install ngrok` 或 `scoop install ngrok`
#### 2.2 启动 ngrok
```bash
# 在终端中运行(暴露本地 8000 端口)
ngrok http 8000
# 输出示例:
# Forwarding https://abc123.ngrok.io -> http://localhost:8000
```
#### 2.3 获取公网 URL
从 ngrok 输出中复制 `https://xxx.ngrok.io`,这就是你的公网 URL。
**注意**:免费版 ngrok 每次重启 URL 都会变化,需要重新配置企微后台。
#### 2.4 配置企微后台
在企微后台的回调 URL 中填写:`https://你的ngrok域名.ngrok.io/api/wecom/callback`
例如:`https://abc123.ngrok.io/api/wecom/callback`
#### 2.5 保存并验证
1. 点击 **保存**
2. 观察后端日志:
```bash
docker compose logs backend -f
```
3. 应该看到:
```
INFO: wecom verify success {"trace_id": "...", "echostr_length": 43}
```
4. 企微后台应显示 **保存成功**
---
### 方法 2使用企业微信官方测试工具
1. 在企业微信管理后台,进入 **自建应用** → **接收消息** → **调试工具**
2. 输入测试参数,生成测试请求
3. 使用 curl 或 Postman 发送请求到本地服务
---
## 四、测试消息回调
### 4.1 发送测试消息
1. **在企业微信中**
- 打开企业微信客户端
- 找到你配置的应用
- 发送一条文本消息,例如:`你好,测试一下`
### 4.2 查看后端日志
```bash
# 实时查看日志
docker compose logs backend -f
# 应该看到以下日志:
```
**收到消息日志**
```json
{
"timestamp": "2025-02-05T10:00:00Z",
"level": "INFO",
"message": "wecom message received",
"trace_id": "abc123-def456",
"external_userid": "wmxxxxx",
"msgid": "1234567890",
"msg_type": "text",
"content_summary": "你好,测试一下"
}
```
**发送回复日志**
```json
{
"timestamp": "2025-02-05T10:00:01Z",
"level": "INFO",
"message": "wecom reply sent",
"trace_id": "abc123-def456",
"external_userid": "wmxxxxx",
"msgid": "1234567890",
"reply_summary": "已收到:你好,测试一下"
}
```
### 4.3 验证回复消息
在企业微信客户端中,应该收到回复:**`已收到:你好,测试一下`**
### 4.4 检查数据库
```bash
# 进入数据库容器
docker compose exec db psql -U wecom -d wecom_ai
# 查询会话
SELECT id, external_user_id, external_name, status, created_at
FROM chat_sessions
ORDER BY created_at DESC
LIMIT 5;
# 查询消息
SELECT id, session_id, role, content, created_at
FROM messages
ORDER BY created_at DESC
LIMIT 10;
# 应该看到:
# - 一条会话记录external_user_id 为你的企微用户ID
# - 两条消息记录(一条 user一条 assistant
```
---
## 五、完整测试检查清单
### 5.1 配置检查
- [ ] `.env` 文件中所有企业微信配置已填写
- [ ] `WECOM_TOKEN` 与企微后台一致
- [ ] `WECOM_ENCODING_AES_KEY` 与企微后台一致43位
- [ ] `WECOM_CORP_ID` 已填写
- [ ] 后端服务正常运行
### 5.2 GET 校验测试
- [ ] 在企微后台点击保存配置
- [ ] 后端日志显示 `wecom verify success`
- [ ] 企微后台显示 **保存成功**
### 5.3 POST 回调测试
- [ ] 在企业微信中发送文本消息
- [ ] 后端日志显示 `wecom message received`
- [ ] 后端日志显示 `wecom reply sent`
- [ ] 企业微信中收到回复消息
- [ ] 数据库中创建了会话记录
- [ ] 数据库中创建了消息记录user + assistant
---
## 六、常见问题排查
### 问题 1GET 校验失败
**症状**:企微后台显示"保存失败"或"URL校验失败"
**排查步骤**
1. **检查 Token**
```bash
# 查看 .env 中的 WECOM_TOKEN
cat .env | grep WECOM_TOKEN
# 确保与企微后台完全一致(包括大小写、空格等)
```
2. **检查 EncodingAESKey**
```bash
# 查看 .env 中的 WECOM_ENCODING_AES_KEY
cat .env | grep WECOM_ENCODING_AES_KEY
# 确保是 43 位 Base64 编码(不含等号)
# 确保与企微后台完全一致
```
3. **检查后端日志**
```bash
docker compose logs backend | grep "wecom verify"
# 如果看到 "wecom verify failed",检查签名或解密错误
```
4. **检查回调 URL**
- 确保 URL 可公网访问(使用 ngrok 等工具)
- 确保 URL 格式正确:`https://域名/api/wecom/callback`
- 确保后端服务正常运行
**解决方案**
- 重新检查并同步 Token 和 EncodingAESKey
- 确保回调 URL 可访问
- 重启后端服务:`docker compose restart backend`
---
### 问题 2POST 回调失败
**症状**:发送消息后没有收到回复,或后端日志显示错误
**排查步骤**
1. **检查后端日志**
```bash
docker compose logs backend | grep -E "wecom|error|Error"
```
2. **检查解密错误**
- 如果看到 `wecom decrypt error`,检查 `WECOM_ENCODING_AES_KEY` 是否正确
- 如果看到 `wecom xml parse failed`,检查 XML 格式
3. **检查企业 ID**
```bash
# 确保 WECOM_CORP_ID 正确
cat .env | grep WECOM_CORP_ID
```
4. **检查数据库连接**
```bash
# 确保数据库服务正常运行
docker compose ps db
# 检查数据库连接
docker compose exec backend python -c "from app.database import engine; print('DB OK')"
```
**解决方案**
- 检查并修复配置错误
- 重启后端服务
- 检查数据库连接
---
### 问题 3收到消息但没有回复
**症状**:后端日志显示收到消息,但企业微信中没有收到回复
**排查步骤**
1. **检查回复日志**
```bash
docker compose logs backend | grep "wecom reply sent"
# 如果没有这条日志,说明回复构造或加密失败
```
2. **检查回复 XML 格式**
- 查看后端代码中的 `build_reply_xml` 函数
- 确保 XML 格式符合企业微信规范
3. **检查加密**
- 确保 `WECOM_ENCODING_AES_KEY` 正确
- 确保 `WECOM_CORP_ID` 正确(用于加密验证)
**解决方案**
- 检查回复 XML 构造逻辑
- 检查加密函数
- 查看完整错误日志
---
### 问题 4URL 变化问题
**症状**每次重启内网穿透工具URL 都会变化
**解决方案**
- **使用 Cloudflare Tunnel**:登录后可以创建固定域名的 tunnel推荐
- **使用 ngrok**:每次重启后需要重新在企微后台更新回调 URL
- **使用 ngrok 付费版**:可以设置固定域名
- **其他工具**frp、localtunnel 等(参见 `docs/cloudflared-setup.md`
---
## 七、高级测试
### 7.1 测试不同类型的消息
- **文本消息**:发送普通文本
- **图片消息**:发送图片(当前实现可能只回复"收到"
- **事件消息**:测试关注/取消关注等事件
### 7.2 测试并发消息
- 同时发送多条消息
- 检查数据库是否正确记录所有消息
- 检查回复是否正确
### 7.3 测试错误处理
- 发送格式错误的消息
- 检查错误日志
- 确保服务不会崩溃
---
## 八、测试完成后
### 8.1 验证数据完整性
```bash
# 检查会话和消息数据
docker compose exec db psql -U wecom -d wecom_ai -c "
SELECT
cs.id as session_id,
cs.external_user_id,
cs.external_name,
COUNT(m.id) as message_count,
MAX(m.created_at) as last_message_time
FROM chat_sessions cs
LEFT JOIN messages m ON cs.id = m.session_id
GROUP BY cs.id
ORDER BY cs.created_at DESC;
"
```
### 8.2 清理测试数据(可选)
```bash
# 删除测试数据
docker compose exec db psql -U wecom -d wecom_ai -c "
DELETE FROM messages;
DELETE FROM chat_sessions;
"
```
---
## 九、下一步
完成阶段 4 测试后,可以继续:
- **阶段 5**:接入 FAQ 匹配
- **阶段 6**:接入 RAG 检索
- **阶段 7**:实现工单转人工流程
---
## 十、快速测试命令汇总
```bash
# 1. 检查服务状态
docker compose ps
# 2. 查看后端日志
docker compose logs backend -f
# 3. 检查环境变量
docker compose exec backend env | grep WECOM
# 4. 启动 Cloudflare Tunnel推荐
cloudflared tunnel --url http://localhost:8000
# 5. 测试本地健康检查
curl http://localhost:8000/api/health
# 6. 测试公网健康检查(替换为你的 cloudflared URL
curl https://你的域名.trycloudflare.com/api/health
# 7. 检查数据库
docker compose exec db psql -U wecom -d wecom_ai -c "SELECT * FROM chat_sessions;"
# 8. 重启服务
docker compose restart backend
```
**详细 Cloudflare Tunnel 配置**:参见 `docs/cloudflared-setup.md`
---
**提示**:如果遇到问题,请先查看后端日志,大多数问题都会在日志中显示错误信息。