Files
AIclinicalresearch/backend/WECHAT_ENV_CONFIG.md
HaHafeng 6a567f028f feat(iit-manager): 完成MVP闭环 - 企业微信集成与端到端测试
核心交付物:
- WechatService (314行): Access Token缓存 + 消息推送
- WechatCallbackController (501行): URL验证 + 消息接收
- 质控Worker完善: 质控逻辑 + 企业微信推送 + 审计日志
- Worker注册修复: initIitManager() 在启动时调用
- 数据库字段修复: action -> action_type
- 端到端测试通过: <2秒延迟, 100%成功率

性能指标:
- Webhook响应: 5.8ms (目标<10ms)
- Worker执行: ~50ms (目标<100ms)
- 端到端延迟: <2秒 (目标<5秒)
- 消息成功率: 100% (测试5次)

临时措施:
- UserID从环境变量获取 (Phase 2改进)
- 定时轮询暂时禁用 (Phase 2添加)
- 质控逻辑简化 (Phase 1.5集成Dify)

Closes #IIT-MVP-Day3
2026-01-03 14:19:08 +08:00

401 lines
12 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.
# 企业微信环境变量配置说明
## 📋 必需的环境变量
`backend/.env` 文件中添加以下配置:
```env
# ==========================================
# 企业微信配置
# ==========================================
# 企业微信基础配置(应用信息)
WECHAT_CORP_ID=ww6ab493470ab4f377
WECHAT_AGENT_ID=1000002
WECHAT_CORP_SECRET=AZIVxMtoLb0rEszXS81e4dBRl-I9kgTjygIS0cFfENU
# 企业微信回调配置(消息加解密)
WECHAT_TOKEN=oX1RBm1YnvMy2SbDLbvAdDd5Gq3oBGq
WECHAT_ENCODING_AES_KEY=zE4tcdBeekCHPUV015jCh9RVUydnCITINqSmCzg9xtO
# 测试用户ID可选仅测试环境使用
WECHAT_TEST_USER_ID=FengZhiBo
```
## 📝 配置项说明
### 1. WECHAT_CORP_ID
- **说明**企业微信的企业ID
- **获取方式**:企业微信管理后台 → 我的企业 → 企业信息 → 企业ID
- **当前值**`ww6ab493470ab4f377`
### 2. WECHAT_AGENT_ID
- **说明**应用的AgentID
- **获取方式**:企业微信管理后台 → 应用管理 → IIT Manager Agent → AgentId
- **当前值**`1000002`
- **应用名称**`IIT Manager Agent`
### 3. WECHAT_CORP_SECRET
- **说明**应用的Secret用于获取access_token
- **获取方式**:企业微信管理后台 → 应用管理 → IIT Manager Agent → Secret
- **当前值**`AZIVxMtoLb0rEszXS81e4dBRl-I9kgTjygIS0cFfENU`
- **⚠️ 安全提示**Secret 非常重要,切勿泄露
### 4. WECHAT_TOKEN
- **说明**消息回调的Token用于验证签名
- **获取方式**:企业微信管理后台 → 应用管理 → IIT Manager Agent → 接收消息 → 点击"随机获取"
- **当前值**`oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq`
### 5. WECHAT_ENCODING_AES_KEY
- **说明**消息加解密密钥43位字符
- **获取方式**:企业微信管理后台 → 应用管理 → IIT Manager Agent → 接收消息 → 点击"随机获取"
- **当前值**`zE4tcdBeekCHPUV015jCh9RVUydnCITINqSmCzg9xtO`
### 6. WECHAT_TEST_USER_ID可选
- **说明**测试用户的企业微信UserID仅用于开发和测试环境
- **获取方式**:企业微信管理后台 → 通讯录 → 选择成员 → 查看"账号"字段
- **当前值**`FengZhiBo`
- **用途**
- 用于快速测试企业微信推送功能
- 生产环境中UserID应从项目配置的`notificationConfig`中动态获取
- 可配置多个用户,用竖线分隔:`FengZhiBo|ZhangSan|LiSi`
- **⚠️ 注意**:该配置仅供测试使用,生产环境通知目标应由项目配置决定
## 🔧 企业微信回调URL配置
### 本地开发natapp
```
回调URL: https://iit.nat100.top/api/v1/iit/wechat/callback
Token: oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
EncodingAESKey: zE4tcdBeekCHPUV015jCh9RVUydnCITINqSmCzg9xtO
```
### 生产环境SAE
```
回调URL: https://iit.xunzhengyixue.com/api/v1/iit/wechat/callback
Token: oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
EncodingAESKey: zE4tcdBeekCHPUV015jCh9RVUydnCITINqSmCzg9xtO
```
## ⚠️ 重要提示
1. **IP白名单**(生产环境必需)
- SAE NAT网关EIP`182.92.176.14`
- 需要在企业微信后台配置为"企业可信IP"
- 位置:企业微信管理后台 → 应用管理 → IIT Manager Agent → 企业可信IP
2. **natapp隧道**(本地开发)
- 确保natapp隧道正常运行`http://iit.nat100.top`
- 后端服务监听:`http://localhost:3001`
3. **环境变量加载**
- 修改 `.env` 文件后,需要**重启后端服务**
- 验证方法:查看后端启动日志是否显示"✅ 企业微信服务初始化成功"
## 🧪 消息推送测试
在配置后端服务之前,建议先使用**企业微信官方调试工具**测试推送功能。
### 测试工具地址
```
https://developer.work.weixin.qq.com/document/path/90236
```
在文档页面右侧有"在线调试"按钮。
### 测试步骤
#### Step 1: 获取Access Token
**接口**获取access_token
**参数**
- `corpid`: `ww6ab493470ab4f377`
- `corpsecret`: `AZlVxMtoLb0rEszXS81e4dBRl-I9kgTjyglS0cFfENU`
**预期返回**
```json
{
"errcode": 0,
"errmsg": "ok",
"access_token": "很长的token字符串...",
"expires_in": 7200
}
```
#### Step 2: 发送测试消息
**接口**:发送应用消息
**参数**
- `access_token`: 从Step 1获取的token
**消息Body示例**
##### A. 文本消息(简单测试)
```json
{
"touser": "FengZhiBo",
"msgtype": "text",
"agentid": 1000002,
"text": {
"content": "🎉 IIT Manager 测试消息\n\n这是来自企业微信官方调试工具的测试推送。\n\n如果您收到此消息说明推送功能正常"
}
}
```
##### B. 卡片消息(数据录入通知)
```json
{
"touser": "FengZhiBo",
"msgtype": "textcard",
"agentid": 1000002,
"textcard": {
"title": "📊 test0102 - 数据录入",
"description": "<div class=\"gray\">2026-01-03 16:00</div><div class=\"normal\">受试者8</div><div class=\"normal\">操作:新增</div><div class=\"normal\">表单demographics</div><div class=\"normal\">录入8个字段</div>",
"url": "https://iit.xunzhengyixue.com",
"btntxt": "查看详情"
}
}
```
##### C. Markdown消息富文本
```json
{
"touser": "FengZhiBo",
"msgtype": "markdown",
"agentid": 1000002,
"markdown": {
"content": "## 📊 IIT Manager 数据通知\n\n**项目名称**test0102\n**受试者ID**8\n**操作类型**:新增\n**数据表单**demographics\n**录入字段**8个\n\n---\n\n### 📋 字段摘要\n- 姓名:张三\n- 年龄45岁\n- 性别:男\n- BMI23.5\n\n> 数据录入时间2026-01-03 16:30 \n> 录入人员CRC001\n\n[点击查看详情](https://iit.xunzhengyixue.com/chat?recordId=8)"
}
}
```
**预期效果**
- API返回`{"errcode":0,"errmsg":"ok","msgid":"消息ID"}`
- 企业微信客户端手机或PC收到消息1-2秒内
### 测试结果记录
**测试日期**2026-01-03
| 测试项 | 状态 | 说明 |
|-------|------|------|
| 获取Access Token | ✅ 通过 | errcode=0token有效期7200秒 |
| 发送文本消息 | ✅ 通过 | 手机端成功接收 |
| 发送卡片消息 | ✅ 通过 | 卡片显示正常,可点击跳转 |
| 发送Markdown消息 | ✅ 通过 | 富文本格式正确 |
---
## 🚀 验证配置
### 步骤1检查后端日志
启动后端服务后,应该看到:
```
✅ 企业微信服务初始化成功
✅ 企业微信回调控制器初始化成功
Registered route: GET /api/v1/iit/wechat/callback
Registered route: POST /api/v1/iit/wechat/callback
```
### 步骤2访问健康检查
```bash
curl https://iit.nat100.top/api/v1/iit/health
```
预期返回:
```json
{
"status": "ok",
"module": "iit-manager",
"version": "1.1.0",
"timestamp": "2026-01-02T14:30:00.000Z"
}
```
### 步骤3保存企业微信回调配置
在企业微信后台点击"保存",如果配置正确:
- ✅ 企业微信会发送GET请求验证URL
- ✅ 后端会解密echostr并返回
- ✅ 显示"保存成功"
## 👤 如何获取UserID
UserID是企业微信成员的唯一标识不是姓名用于指定消息接收人。
### 方法1通过管理后台查看推荐
1. 登录企业微信管理后台
2. 进入"通讯录"
3. 找到要获取UserID的成员
4. 点击成员详情
5. 查看"账号"字段即为UserID
**示例**`FengZhiBo``ZhangSan``LiSi`
### 方法2通过API获取部门成员列表
```bash
# 获取部门1的成员列表
curl "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=ACCESS_TOKEN&department_id=1"
```
**返回示例**
```json
{
"errcode": 0,
"errmsg": "ok",
"userlist": [
{
"userid": "FengZhiBo",
"name": "冯智博",
"department": [1]
},
{
"userid": "ZhangSan",
"name": "张三",
"department": [1]
}
]
}
```
### 方法3使用特殊UserID
- `@all` - 发送给应用可见范围内的所有人(仅用于测试或全员通知)
**示例**
```json
{
"touser": "@all",
"msgtype": "text",
"agentid": 1000002,
"text": {
"content": "这是发给所有人的测试消息"
}
}
```
---
## 📞 常见问题
### Q1: 保存回调URL时提示"URL验证失败"
**可能原因**
1. 后端服务未启动或无法访问
2. natapp隧道未运行
3. 环境变量配置错误Token或EncodingAESKey不匹配
**解决方法**
1. 检查后端日志是否有错误
2. 确认natapp状态`http://iit.nat100.top/api/v1/iit/health`
3. 检查 `.env` 文件中的Token和EncodingAESKey
### Q2: 收不到企业微信消息
**可能原因**
1. 回调URL未保存成功
2. 消息类型未勾选(文本消息、支付且退款通知等)
3. 用户未关注应用
**解决方法**
1. 确认回调URL已保存成功
2. 检查"选择需要接收的消息事件类型"是否勾选了对应类型
3. 用户在企业微信中打开应用
### Q3: 发送消息提示"invalid user"
**可能原因**
1. 用户UserID不存在
2. 用户未在应用的可见范围内
**解决方法**
1. 确认UserID正确企业微信后台查看
2. 检查应用的可见范围设置
### Q4: 获取Access Token提示"60020"错误
**错误信息**`errcode: 60020, errmsg: "not allow to access from your ip"`
**原因**请求来源IP未在"企业可信IP"白名单中
**解决方法**
1. 确认当前IP地址本地开发公网IPSAE`182.92.176.14`
2. 登录企业微信管理后台
3. 应用管理 → IIT Manager Agent → 企业可信IP
4. 添加IP地址到白名单
5. 保存并重试
### Q5: 官方调试工具测试成功,但代码发送失败
**可能原因**
1. 环境变量未正确配置
2. 后端服务未重启
3. Access Token缓存有误
**解决方法**
1. 检查 `.env` 文件中的配置是否与调试工具中使用的一致
2. 重启后端服务
3. 清空Access Token缓存重新获取
4. 查看后端日志排查具体错误
## ✅ 配置检查清单
在开始开发前,请确认以下配置项已完成:
### 企业微信后台配置
- [ ] 企业微信应用已创建IIT Manager Agent
- [ ] 应用可见范围已设置(包含测试用户)
- [ ] 企业可信IP已添加本地开发可跳过生产环境必须配置
- [ ] Token和EncodingAESKey已生成
- [ ] 回调URL已配置并验证成功用于接收消息
### 环境变量配置
- [ ] `WECHAT_CORP_ID` 已配置(`ww6ab493470ab4f377`
- [ ] `WECHAT_AGENT_ID` 已配置(`1000002`
- [ ] `WECHAT_CORP_SECRET` 已配置
- [ ] `WECHAT_TOKEN` 已配置
- [ ] `WECHAT_ENCODING_AES_KEY` 已配置
- [ ] `WECHAT_TEST_USER_ID` 已配置(`FengZhiBo`
### 功能测试
- [x] 使用官方调试工具成功获取Access Token
- [x] 使用官方调试工具成功发送文本消息
- [x] 使用官方调试工具成功发送卡片消息
- [x] 使用官方调试工具成功发送Markdown消息
- [ ] 后端服务启动成功,日志显示"企业微信服务初始化成功"
- [ ] 回调URL验证成功
- [ ] 完整闭环测试通过REDCap → Node.js → 企业微信)
---
## 📚 相关文档
### 企业微信官方文档
- [企业微信API概览](https://developer.work.weixin.qq.com/document/path/90664)
- [发送应用消息](https://developer.work.weixin.qq.com/document/path/90236)
- [接收消息和事件](https://developer.work.weixin.qq.com/document/path/90239)
- [消息加解密说明](https://developer.work.weixin.qq.com/document/path/90968)
- [全局错误码](https://developer.work.weixin.qq.com/document/path/90313)
### 项目文档
- [Day 3 企业微信集成开发完成记录](../docs/03-业务模块/IIT Manager Agent/06-开发记录/Day3-企业微信集成开发完成记录.md)
- [最小MVP闭环开发计划](../docs/03-业务模块/IIT Manager Agent/04-开发计划/最小MVP闭环开发计划.md)
- [模块当前状态与开发指南](../docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md)
---
**文档维护者**:开发团队
**最后更新**2026-01-03
**测试状态**:✅ 推送功能已验证通过