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

12 KiB
Raw Blame History

企业微信环境变量配置说明

📋 必需的环境变量

backend/.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网关EIP182.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

预期返回

{
  "errcode": 0,
  "errmsg": "ok",
  "access_token": "很长的token字符串...",
  "expires_in": 7200
}

Step 2: 发送测试消息

接口:发送应用消息

参数

  • access_token: 从Step 1获取的token

消息Body示例

A. 文本消息(简单测试)
{
  "touser": "FengZhiBo",
  "msgtype": "text",
  "agentid": 1000002,
  "text": {
    "content": "🎉 IIT Manager 测试消息\n\n这是来自企业微信官方调试工具的测试推送。\n\n如果您收到此消息说明推送功能正常"
  }
}
B. 卡片消息(数据录入通知)
{
  "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消息富文本
{
  "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访问健康检查

curl https://iit.nat100.top/api/v1/iit/health

预期返回:

{
  "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

示例FengZhiBoZhangSanLiSi

方法2通过API获取部门成员列表

# 获取部门1的成员列表
curl "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=ACCESS_TOKEN&department_id=1"

返回示例

{
  "errcode": 0,
  "errmsg": "ok",
  "userlist": [
    {
      "userid": "FengZhiBo",
      "name": "冯智博",
      "department": [1]
    },
    {
      "userid": "ZhangSan",
      "name": "张三",
      "department": [1]
    }
  ]
}

方法3使用特殊UserID

  • @all - 发送给应用可见范围内的所有人(仅用于测试或全员通知)

示例

{
  "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地址本地开发公网IPSAE182.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

功能测试

  • 使用官方调试工具成功获取Access Token
  • 使用官方调试工具成功发送文本消息
  • 使用官方调试工具成功发送卡片消息
  • 使用官方调试工具成功发送Markdown消息
  • 后端服务启动成功,日志显示"企业微信服务初始化成功"
  • 回调URL验证成功
  • 完整闭环测试通过REDCap → Node.js → 企业微信)

📚 相关文档

企业微信官方文档

项目文档

  • [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
测试状态 推送功能已验证通过