diff --git a/技术文档.md b/技术文档.md new file mode 100644 index 0000000..08736c7 --- /dev/null +++ b/技术文档.md @@ -0,0 +1,155 @@ +# 微信公众号AI助手服务技术文档 + +## 1. 概述 +本服务是一个基于Flask的微信公众号后端服务,实现了与Dify AI平台的集成。主要功能包括: +- 验证微信服务器请求的合法性 +- 接收用户消息并调用Dify AI服务获取智能回复 +- 通过微信客服消息接口异步返回AI回复 +- 维护用户会话状态,支持多轮对话 + +## 2. 功能描述 +| 功能模块 | 描述 | 实现方式 | +|---------|------|---------| +| 微信服务器验证 | 验证微信服务器请求的合法性 | SHA1签名验证 | +| 消息接收与路由 | 接收并处理用户消息 | XML解析与路由 | +| AI服务调用 | 调用Dify AI服务获取智能回复 | HTTP POST请求 | +| 会话管理 | 维护用户对话上下文 | 内存映射(conv_map) | +| 客服消息发送 | 异步发送AI回复给用户 | 微信客服消息接口 | +| 被动回复 | 即时返回"正在查询"提示 | XML格式响应 | + +## 3. 环境要求 +- Python 3.7+ +- Flask 2.0+ +- Requests库 +- 微信公众号(服务号或订阅号) +- Dify AI服务(本地或云端) + +## 4. 配置说明 +在代码全局配置区设置以下参数: + +```python +# 微信相关配置 +TOKEN = "your_wechat_token" # 与微信公众号后台配置一致 +APPID = "your_appid" # 微信公众号APPID +APPSECRET = "your_appsecret" # 微信公众号APPSECRET + +# Dify AI服务配置 +DIFY_API_BASE = "http://your-dify-server/api" # Dify API地址 +DIFY_API_KEY = "your_dify_api_key" # Dify API密钥(可选) +``` + +## 5. 核心模块说明 + +### 5.1 微信服务器验证 (`/wx` GET请求) +- 验证流程: + 1. 获取请求参数:signature, timestamp, nonce, echostr + 2. 对token、timestamp、nonce进行字典序排序 + 3. 拼接字符串并进行SHA1加密 + 4. 比较加密结果与signature是否一致 +- 成功:返回echostr +- 失败:返回403错误 + +### 5.2 消息处理 (`/wx` POST请求) +- 支持的消息类型:文本消息(MsgType=text) +- 处理流程: + 1. 解析XML消息体 + 2. 提取用户OpenID、公众号ID和消息内容 + 3. 启动后台线程调用AI服务 + 4. 立即返回"正在查询"的被动回复 + +### 5.3 Dify AI服务调用 (`async_reply`函数) +```mermaid +sequenceDiagram + participant W as 微信用户 + participant S as 本服务 + participant D as Dify AI服务 + W->>S: 发送文本消息 + S->>S: 启动后台线程 + S->>W: 返回"正在查询"提示 + S->>D: 发送用户消息和会话ID + D->>S: 返回AI回复和会话ID + S->>S: 更新会话映射(conv_map) + S->>W: 通过客服消息发送AI回复 +``` + +### 5.4 客服消息发送 (`send_wechat_customer_message`函数) +- 使用微信客服消息接口发送文本消息 +- 前提条件: + - 公众号已完成认证 + - 用户在48小时内与公众号有过交互 +- 消息格式: + ```json + { + "touser": "OPENID", + "msgtype": "text", + "text": {"content": "消息内容"} + } + ``` + +### 5.5 会话管理 +- 使用全局字典`conv_map`存储会话状态 +- 数据结构:`{user_openid: conversation_id}` +- 会话保持:每次调用Dify时带上conversation_id +- 新会话:当用户首次交互时自动创建新会话 + +## 6. 部署与运行 + +### 6.1 安装依赖 +```bash +pip install flask requests +``` + +### 6.2 运行服务 +```bash +python wechat_kefu.py +``` + +### 6.3 微信公众号配置 +1. 服务器地址(URL): `http://your-domain/wx` +2. Token: 与代码中TOKEN一致 +3. 消息加解密方式: 明文模式 + +## 7. 注意事项 + +### 7.1 安全性 +1. 验证所有来自微信服务器的请求 +2. 保护APP_SECRET和API_KEY不被泄露 +3. 生产环境禁用DEBUG模式 +4. 使用HTTPS加密传输 + +### 7.2 性能优化 +1. 实现access_token缓存(有效期7200秒) +2. 限制用户请求频率 +3. 使用连接池管理HTTP连接 +4. 监控conv_map内存使用情况 + +### 7.3 异常处理 +1. Dify服务不可用:返回用户友好提示 +2. 客服消息发送失败:记录日志并重试 +3. 会话丢失:自动创建新会话 +4. 非文本消息:忽略并返回success + +### 7.4 扩展性 +1. 支持其他消息类型(如图片、语音) +2. 添加用户身份验证 +3. 集成多个AI服务提供商 +4. 实现消息队列处理异步任务 + +## 8. 常见问题排查 + +| 问题现象 | 可能原因 | 解决方案 | +|----------|---------|----------| +| 微信验证失败 | TOKEN配置不一致 | 检查公众号后台配置 | +| 无法接收消息 | 服务器网络问题 | 检查服务器防火墙设置 | +| 客服消息发送失败 | access_token过期 | 实现token缓存机制 | +| AI回复乱码 | 编码问题 | 检查Unicode解码逻辑 | +| 会话不连续 | conv_map未持久化 | 使用数据库存储会话 | + +## 9. 版本信息 +- 初始版本:1.0 +- 最后更新:2025-06-05 +- 依赖版本: + - Flask 2.1.2 + - Requests 2.28.1 + +> 注意:本服务需要微信公众号具备客服消息接口权限,开发前请确认公众号类型和权限设置。 \ No newline at end of file