OpenClaw 企业微信(WeCom)Channel Plugin,将企业微信接入 OpenClaw AI 助手平台。
参考 sunnoy/openclaw-plugin-wecom,兼容 OpenClaw 2026.2+。
企业微信用户 │ │ 消息回调 (XML + AES-256-CBC) ▼ ┌──────────────────────────────────────┐ │ OpenClaw Gateway │ │ │ │ GET /webhooks/wecom → URL 验证 │ │ POST /webhooks/wecom → 消息回调 │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ WeCom Plugin │ │ │ │ • 签名校验 │ │ │ │ • AES 解密 │ │ │ │ • 消息标准化 │ │ │ │ • 去重处理 │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ OpenClaw │ │ │ │ Agent 处理 │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ outbound.send│ │ │ │ → 企微 API │ │ │ │ (文本/MD/图文)│ │ │ └──────────────┘ │ └──────────────────────────────────────┘ 核心原则:插件只负责 Channel Adapter(消息协议适配),不负责 AI 业务逻辑。
@garrent/openclaw-plugin-wecom/ ├── package.json # 含 openclaw.extensions 声明 ├── openclaw.plugin.json # 插件清单(configSchema) ├── tsconfig.json ├── .env.example # 配置参考 └── src/ ├── index.ts # 入口:导出 register + dock ├── channel.ts # ChannelDock + createWecomPlugin ├── normalize.ts # 消息标准化(企微 ↔ OpenClaw) ├── types/ │ └── index.ts # 完整类型定义 ├── utils/ │ ├── crypto.ts # AES-256-CBC + SHA1 签名 │ ├── xml.ts # XML 解析/构建 │ └── logger.ts # 日志工具 └── services/ ├── tokenService.ts # Token 管理(内存缓存+重试) └── wecomApi.ts # 企微 API 封装 openclaw plugins install @garrent/openclaw-plugin-wecomgit clone https://github.com/garrent/openclaw-plugin-wecom.git cd openclaw-plugin-wecom npm install npm run build openclaw plugins install -l ./- 登录 企业微信管理后台
- 我的企业 → 记录
CorpID - 应用管理 → 创建自建应用 → 记录
AgentId和Secret - 应用详情 → 接收消息 → 设置 API 接收:
- URL:
http(s)://你的域名:18789/webhooks/wecom - Token: 随机字符串(记录下来)
- EncodingAESKey: 随机生成(记录下来)
- URL:
编辑 ~/.openclaw/openclaw.json:
{ "plugins": { "entries": { "garrent-wecom": { "enabled": true } } }, "channels": { "garrent-wecom": { "enabled": true, "corpId": "你的企业ID", "agentId": "应用AgentId", "secret": "应用Secret", "token": "回调Token", "encodingAESKey": "回调EncodingAESKey" } } }确保 Gateway 绑定到局域网(而非 loopback),以便企微服务器可以回调:
openclaw config set gateway.bind lanopenclaw gateway restart openclaw channels status1. 用户在企微发送消息 2. 企微服务器 POST → /webhooks/wecom 3. Plugin: SHA1 签名校验 → AES-256-CBC 解密 → XML 解析 4. Plugin: 消息去重(MsgId) 5. Plugin: 立即返回 "success"(解决 5 秒超时) 6. Plugin: 异步调用 api.messaging.receive(normalizedMessage) 7. OpenClaw Agent 处理 → 生成回复 8. OpenClaw 调用 outbound.send(outgoingMessage) 9. Plugin: 转换格式 → 调用企微 API 主动推送回复 企微要求 5 秒内响应,否则重试 3 次。本插件:
- 收到消息后 立即返回
"success" - 异步 将消息分发给 OpenClaw Agent
- Agent 回复后通过 主动推送 API 发送
- MsgId 去重 防止重试导致的重复处理
- 内存缓存(适配 OpenClaw 单进程插件模型)
- 提前 5 分钟刷新(留 buffer)
- 并发请求合并(多个消息同时到达时只刷新一次)
- 失败指数退避重试(1s → 2s → 4s,最多 3 次)
- 完整 SHA1 签名校验(每条消息都验证)
- AES-256-CBC 加解密(含 CorpId 校验)
- Token 失效自动重试(errcode 40014/42001)
| 类型 | 入站(接收) | 出站(回复) |
|---|---|---|
| 文本 | ✅ | ✅ |
| Markdown | - | ✅ (自动检测) |
| 图片 | ✅ (转文本描述) | - |
| 语音 | ✅ (转文本描述) | - |
| 视频 | ✅ (转文本描述) | - |
| 位置 | ✅ (转文本描述) | - |
| 链接 | ✅ (转文本描述) | - |
| 图文 | - | ✅ (附件模式) |
| 事件 | ✅ (subscribe等) | - |
# 安装依赖 npm install # 监听编译 npm run dev # 构建 npm run build| 组件 | 选型 | 说明 |
|---|---|---|
| 语言 | TypeScript | 完整类型安全 |
| 加解密 | Node.js crypto | AES-256-CBC + SHA1 |
| HTTP | axios | 企微 API 调用 |
| XML | xml2js | 消息解析 |
| 日志 | winston | 结构化日志 |
| 宿主 | OpenClaw >= 2026.2 | peerDependency |
MIT