本方案通过 OpenClaw、企业微信自建应用 与 阿里云千问 Code Plan 在云服务器上搭建企业微信智能助手,让员工在企业微信内即可与 AI 对话,提升企业 AI 使用水平。
文档记录如何完成以下内容:
安装并配置 OpenClaw 网关(含阿里千问 Code Plan 模型配置) 接入企业微信自建应用,接收员工发来的消息并主动回复 通过 OpenClaw 调用千问大模型(阿里云百炼 / Code Plan 接口)完成问答
目标效果:员工在企业微信自建应用里发消息 → 云服务器收到消息 → 调用 OpenClaw + 千问 → 再通过企业微信把答案发回,实现「企业微信 + AI」一体化使用体验。

一、整体架构与数据流
终端用户:企业微信中的员工,在“自建应用”的聊天窗口里发送文本消息。 企业微信服务器:把消息通过 HTTP 回调推送到我们的云服务器。 云服务器 Node.js 中转服务: 监听 http://<云服务器IP>:3000/wework/webhook解密企业微信推送的加密消息( Encrypt字段)从 XML 中解析出文本内容 把文本发到本机的 OpenClaw 网关 OpenClaw 网关: 监听本地端口 127.0.0.1:18789(见openclaw.json中gateway.port)统一调度后端大模型(默认使用 dashscope/qwen3.5-plus,走阿里千问 Code Plan 接口https://coding.dashscope.aliyuncs.com/v1)企业微信开放平台接口: 云服务器拿 access_token调 message/send主动把 AI 的回复发回给刚才的员工
消息链路可以概括为:
企业微信用户 → 企业微信服务器 → 云服务器 Node 中转 → OpenClaw + 千问 Code Plan → 云服务器主动调用企业微信 API → 企业微信用户
二、云服务器环境准备
操作系统:Linux(例如 CentOS / Ubuntu,本文示例使用一台公网 IP 为 47.238.98.71的服务器)Node.js:建议 **16+**(示例环境为 Node 22) 已开通企业微信(可以是未认证企业,但接口权限会有一定限制)
1. 基础安装
# 更新系统包sudo yum update -y # 或 apt update && apt upgrade -y# 安装 Node.js(以 nvm 或发行版自带为准)# 这里不展开,保持你的现有 Node 环境即可# 建目录mkdir -p /wwwcd /www三、安装并配置 OpenClaw
1. 安装 OpenClaw
参考官方文档安装 OpenClaw(略),安装完成后,你会拥有一个类似 openclaw 的可执行程序,以及一个默认的配置文件 openclaw.json。
在本项目中,我们把配置文件放在云服务器的:
/root/.openclaw/openclaw.json # 仅示例路径本仓库中的 openclaw.json 为参考配置,与当前实现对齐,主要包含:
gateway:端口 18789,bind: "loopback"(仅本机127.0.0.1:18789),Token 认证,并启用responses接口供中转服务调用。agents.defaults:默认使用 dashscope/qwen3.5-plus,workspace 可设为/root/.openclaw/workspace。session: dmScope: "per-channel-peer"等按需保留。models:使用阿里千问 Code Plan 网关 https://coding.dashscope.aliyuncs.com/v1,通过env.vars.DASHSCOPE_API_KEY注入密钥。
网关与模型配置示例(节选):
"gateway": {"port": 18789,"mode": "local","bind": "loopback","auth": {"mode": "token","token": "<YOUR_OPENCLAW_GATEWAY_TOKEN>" },"http": {"endpoints": {"responses": { "enabled": true } } }},"agents": {"defaults": {"model": { "primary": "dashscope/qwen3.5-plus" },"workspace": "/root/.openclaw/workspace" }},"models": {"mode": "merge","providers": {"dashscope": {"baseUrl": "https://coding.dashscope.aliyuncs.com/v1","apiKey": "${DASHSCOPE_API_KEY}","api": "openai-completions","models": [ {"id": "qwen3.5-plus","name": "Qwen3.5-Plus","reasoning": false,"input": ["text"],"contextWindow": 128000,"maxTokens": 8192 } ] } }},"env": {"vars": {"DASHSCOPE_API_KEY": "<YOUR_CODE_PLAN_API_KEY>" }}baseUrl 使用 https://coding.dashscope.aliyuncs.com/v1即走阿里千问 Code Plan 接口。可在 models.providers.dashscope.models中增加其他 Code Plan 模型(如qwen3-max-*、qwen3-coder-*等),id与官方一致即可。
安全建议:不要将真实 Token / API Key 提交到仓库,使用环境变量或密钥管理服务。
3. 启动 OpenClaw 网关
确保已设置千问 Code Plan 的 API Key(与 openclaw.json 中 env.vars.DASHSCOPE_API_KEY 或环境变量一致),然后启动网关:
export DASHSCOPE_API_KEY="<YOUR_CODE_PLAN_API_KEY>"openclaw gateway启动后,本机可通过 http://127.0.0.1:18789/v1/responses 调用 OpenClaw,供 wework-verify.js 转发企业微信消息并获取千问回复。
四、Node.js 中转服务设计与实现
中转服务的主要职责:
校验并解密企业微信的回调消息。 将文本内容转发给 OpenClaw。 在后台异步调用 OpenClaw,拿到返回文本。 对长回复按企业微信 2048 字节文本长度限制 分段,多条依次发送,并在每条前加类似 (1/3)的序号提示。同时满足企业微信“5 秒内必须响应回调”的约束,在模型推理期间先发一条“正在处理您的消息,请稍候…”的加载提示消息。
1. 关键配置项
在 wework-verify.js 顶部配置区需填写(与 openclaw.json 及企业微信后台一致):
// 企业微信(自建应用 - 接收消息 + 应用 Secret)const WEWORK_TOKEN = '<YOUR_WEWORK_TOKEN>';const WEWORK_ENCODING_AES_KEY = '<YOUR_ENCODING_AES_KEY>'; // 43 位,与后台完全一致const WEWORK_CORP_ID = '<YOUR_CORP_ID>';const WEWORK_AGENT_ID = '<YOUR_AGENT_ID>';const WEWORK_SECRET = '<YOUR_APP_SECRET>';// OpenClaw 网关(与 openclaw.json 中 gateway 一致)const OPENCLAW_HOST = '127.0.0.1';const OPENCLAW_PORT = 18789;const OPENCLAW_TOKEN = '<YOUR_OPENCLAW_GATEWAY_TOKEN>';// 长消息分段(企业微信单条文本 ≤2048 字节,多段时加「(1/3)」前缀)const WEWORK_TEXT_MAX_BYTES = 2048;const WEWORK_SEGMENT_PREFIX_RESERVE_BYTES = 20;POST 消息会先校验 msg_signature 再解密;解密失败时日志会提示检查 EncodingAESKey 是否与企业管理后台「接收消息」配置一致。
2. 企业微信回调处理逻辑
企业微信消息分为两类 HTTP 请求:
GET:首次配置“接收消息服务器”时,用于 URL 验证。 POST:真正的消息推送。
代码中通过一个 HTTP 服务器统一处理:
const http = require('http');const https = require('https');const server = http.createServer(async (req, res) => { res.setHeader('Connection', 'close');// 日志:记录所有进入的 HTTP 请求,便于排查const ip = req.socket && req.socket.remoteAddress ? req.socket.remoteAddress : 'unknown';console.log(`[HTTP] ${req.method}${req.url} from ${ip}`);// 1)GET /wework/webhook:URL 验证// 2)POST /wework/webhook:接收加密消息// 3)GET /health:健康检查});server.listen(3000, '0.0.0.0', () => {console.log('企业微信 + OpenClaw 中转服务已启动');});2.1 GET:URL 验证
企业微信在后台保存“接收消息服务器配置”时会发送 GET 请求,参数包括:
msg_signaturetimestampnonceechostr(加密的随机串)
服务器需要:
校验签名是否正确。 使用 AES 解密 echostr还原明文。把明文返回给企业微信。
这一步成功后,后台才会认为回调 URL 可用,后续消息才会推送。
2.2 POST:接收消息并异步处理
收到企业微信消息的 XML 后:
立即返回 success(防止超过 5 秒被重试)。在后台异步: 解析 XML 中的 Encrypt字段;解密得到内层 XML,解析出 MsgType、FromUserName、Content等;对文本消息调用 OpenClaw,获取回复; 先给用户发送一条“正在处理您的消息,请稍候…”的加载提示,让用户立刻看到反馈; 对长回复按 UTF-8 字节数切分为多段(每段预留前缀空间,保证整体不超过 2048 字节),按顺序依次发送给 FromUserName,并在每条前加(当前序号/总条数)。
这样既满足了超时限制,又保证了模型推理的完整性和长消息的可读性。
五、OpenClaw 调用与回复解析
中转服务通过 askOpenClaw 调用本地 OpenClaw 网关(/v1/responses),请求体为 model: "agent:defaults"、input: userMsg。回复从 OpenClaw 返回的 output 中解析第一段文本(兼容 item.content[].text、item.text、item.content 等格式),超时时间为 90 秒,与当前 wework-verify.js 实现一致。
六、企业微信主动发送消息(HTTPS 与文本长度注意事项)
在实践过程中,最容易踩的一个坑是:企业微信开放平台所有接口必须使用 HTTPS。
如果错误地用 HTTP 请求 qyapi.weixin.qq.com,企业微信会返回一个 HTML 重定向页面,代码里用 JSON.parse 解析时就会出现:
SyntaxError: Unexpected token '<', "<html>..." is not valid JSON
正确做法是在 Node.js 中使用 https 模块:
另外,企业微信应用消息中的文本内容有长度限制:
文本 content字段最长 不超过 2048 字节,超出部分会被企业微信截断。本项目在服务端侧按 UTF-8 字节数 事先将长回复切分成多段,每段长度控制在 2048 字节以内,并预留了前缀空间,用于在每条消息前加上 (1/3)、(2/3)这样的序号提示。多段消息之间会加入一个很短的发送间隔,尽量确保用户在聊天窗口里看到的顺序与逻辑顺序一致。
const https = require('https');functiongetAccessToken() {// ...const req = https.get({hostname: 'qyapi.weixin.qq.com',path: `/cgi-bin/gettoken?corpid=${encodeURIComponent(WEWORK_CORP_ID)}&corpsecret=${encodeURIComponent(WEWORK_SECRET)}` }, (res) => {// 解析 JSON });}functionsendWeworkText(toUser, text) {return getAccessToken().then((token) => {returnnewPromise((resolve, reject) => {const body = JSON.stringify({touser: toUser,msgtype: 'text',agentid: parseInt(WEWORK_AGENT_ID, 10),text: { content: text } });const req = https.request({hostname: 'qyapi.weixin.qq.com',path: `/cgi-bin/message/send?access_token=${encodeURIComponent(token)}`,method: 'POST',headers: {'Content-Type': 'application/json','Content-Length': Buffer.byteLength(body) } }, (res) => {// 解析返回 JSON,检查 errcode/errmsg });// ... }); });}七、企业微信 IP 白名单与典型错误 60020
当中转服务成功拿到 access_token,但在调用 message/send 时报错:
发送应用消息失败: 60020 not allow to access from your ip, from ip: 47.xxx.xxx.xxx这说明:你这台云服务器的公网 IP 没有被加入企业微信开放平台的“可信 IP 列表 / IP 白名单”。
解决步骤:
使用管理员账号登录企业微信管理后台。
进入:应用管理 → 自建应用 → 开发管理 / 接口权限 / IP 白名单(名称可能略有差异)。
在“可信 IP / IP 白名单”中添加你的云服务器公网 IP,例如:
47.238.98.71保存之后,再次发送消息即可正常调用。
如果企业未认证,可能对可配置 IP 数量或部分接口能力有一定限制,需结合官方文档具体评估。
八、运行与调试方式
1. 前台调试
cd /wwwnode wework-verify.js保持终端不关,直接观察输出日志。发送企业微信消息时,可以看到每一条请求的处理过程,便于快速定位问题。
2. 后台运行 + 日志文件
生产环境可以使用 nohup 简单托管:
cd /wwwnohup node wework-verify.js > wework.log 2>&1 &tail -f wework.log如果报错 EADDRINUSE(地址已被占用),说明端口 3000 已被其他进程占用,可以用:
ss -tlnp | grep 3000kill <占用该端口的PID>九、总结与可扩展方向
本方案在一台云服务器上完成:
OpenClaw 网关:按 openclaw.json部署,对接阿里千问 Code Plan(coding.dashscope.aliyuncs.com),默认使用qwen3.5-plus。企业微信智能助手:通过 wework-verify.js实现自建应用回调、消息解密、先发「正在处理…」再异步调 OpenClaw、长回复按 2048 字节分段并带「(1/3)」序号、POST 验签与解密失败提示,有效提升企业 AI 使用水平。运维与排错:HTTPS 调用企业微信 API、IP 白名单(错误码 60020)、EncodingAESKey 与 Token 校验等已在文档与代码中体现。
可扩展方向:
接入企业内部知识库、工单、CRM 等,让 AI 具备企业上下文; 多轮对话、会话记忆、用户身份与权限; 更多通道(Web、H5、小程序)统一经 OpenClaw 调用千问等模型。
“企业微信 + OpenClaw + 阿里千问 Code Plan” 架构适合作为企业内统一 AI 助手入口,便于后续扩展与运维。

软件接单交流群:

夜雨聆风

