1. 内网 OpenClaw 接企微回调,卡在哪一步
企业微信的自建应用有个硬性要求:配置「网页授权及JS-SDK」或「接收消息服务器」时,企微后台会先向你的回调 URL 发一个 GET 校验请求,只有拿到正确响应,域名才算验证通过。问题在于,大多数人的 OpenClaw 跑在内网机器或公司内网服务器上,没有公网 IP,企微的校验请求根本到不了你的服务,后台就一直提示「回调地址验证失败」或者「域名归属校验不通过」。
这个场景的典型特征是:OpenClaw 本身功能没问题,能跑自动化、能调模型、能处理文档,但它「藏」在内网里,企微看不见它。你要么去申请公网 IP、配防火墙端口映射,要么用内网穿透把回调地址暴露出去。前者流程长、涉及网络变更审批,后者更轻量。ZeroNews 就是干这件事的——它给你一个公网域名,把企微发来的校验请求转发到你内网的 OpenClaw 服务上,同时帮你响应企微的 GET 校验。
这篇要解决的就是这条链路:内网 OpenClaw 通过 ZeroNews 暴露企微 API 回调地址,再用 TaoToken 统一管理模型调用的 Key,最后验证回调连通、跑通创建文档的请求。适合已经在内网部署了 OpenClaw、想接企微自建应用做自动化文档/智能表格的开发者。下面按「前置准备 → 可复制配置 → 验证请求 → 排障」的顺序走,配置骨架可以直接抄。
2. 前置准备:TaoToken 统一 Key 与企微应用信息
在动 ZeroNews 之前,先把两边的凭证理清楚,不然后面配置到一半发现缺东西,来回切后台很烦。
TaoToken 侧:OpenClaw 调用模型能力时需要 API Key。如果你同时用多个模型(比如对话用一个、代码补全用另一个),每个都单独配 Key 会很乱。TaoToken 的做法是给你一个统一的接入入口,模型对话、Coding Plan、API Keys 都在一个控制台里管。先去控制台创建 Key:
- 模型对话入口:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- Coding Plan(长期编码/Agent 场景):https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
API 基础地址是https://taotoken.net/api,这个地址在 OpenClaw 的模型配置里会用到。Key 创建后复制保存,后面写进 config.toml。
企微侧:登录企业微信管理后台,在「应用管理」里创建一个自建应用,记下三个值——企业 ID(corpid)、应用 Secret、AgentId。这三个是后面换 Access Token 用的。另外,自建应用如果要调文档 API 或走 OAuth2.0,企微要求可信回调域名的所属权跟企业认证主体一致或关联,这点在配 ZeroNews 域名时要留意,别随便拿个不相关的域名填。
ZeroNews 侧:参考 ZeroNews 官方安装文档,在内网机器上装好客户端,登录控制台拿到分配的公网域名。如果要用自有域名,需要在控制台完成 CNAME 映射,具体按 ZeroNews 的「自有域名」文档操作。装完之后你会得到一个形如https://xxx.zeronews.cc的公网地址,这就是待会儿填进企微后台的回调 URL。
3. 可复制配置:config.toml 骨架与 ZeroNews 映射
这一步是核心。先给 OpenClaw 的 config.toml 骨架,把模型接入和回调服务端口都写清楚,再讲 ZeroNews 怎么把公网请求转到这个端口。
3.1 OpenClaw config.toml 骨架
# OpenClaw 主配置 [server] # 内网监听端口,ZeroNews 会把公网请求转发到这里 host = "0.0.0.0" port = 8787 # 回调路径,企微校验请求会打到这个路径 callback_path = "/wecom/callback" [model] # TaoToken 统一接入地址 base_url = "https://taotoken.net/api" # 从 TaoToken 控制台创建的 Key api_key = "sk-你的TaoTokenKey" # 按需选择模型,对话/编码可分开配 default_model = "claude-sonnet" timeout = 60 [wecom] corp_id = "ww你的企业ID" agent_id = "1000002" secret = "你的应用Secret" # 企微回调校验用的 Token 和 EncodingAESKey,在企微后台随机生成 callback_token = "你在企微后台设置的Token" encoding_aes_key = "你在企微后台设置的EncodingAESKey" [log] level = "info" path = "./logs/openclaw.log"几个关键点说明。server.port是内网端口,ZeroNews 的映射目标就是它,别跟其他服务冲突。callback_path要和企微后台填的 URL 路径一致,比如企微填https://xxx.zeronews.cc/wecom/callback,那这里就是/wecom/callback。model.base_url指向 TaoToken 的 API 地址,api_key填控制台创建的 Key,这样 OpenClaw 调模型时走统一入口,换模型不用改代码。
3.2 ZeroNews 映射配置
在 ZeroNews 控制台新建一条隧道/映射,把公网域名指向内网服务:
| 配置项 | 填写值 | 说明 |
|---|---|---|
| 公网域名 | xxx.zeronews.cc | ZeroNews 分配或自有域名 |
| 内网地址 | 127.0.0.1:8787 | 对应 config.toml 的 host:port |
| 协议 | HTTPS | 企微要求回调走 HTTPS |
| 路径 | /wecom/callback | 与 callback_path 一致 |
如果用的是自有域名,先在域名服务商处加一条 CNAME 记录指向 ZeroNews 给的地址,等解析生效后在 ZeroNews 控制台完成域名绑定。这一步不做,企微后台填域名时会提示归属校验失败。
3.3 企微后台填写回调
回到企业微信管理后台,进入自建应用的「开发者接口」→「网页授权及JS-SDK」或「接收消息服务器配置」,把 ZeroNews 的公网 URL 填进去,路径带上/wecom/callback。同时把 config.toml 里写的callback_token和encoding_aes_key填到企微后台对应位置,两边必须完全一致。保存时企微会立即发 GET 校验请求,ZeroNews 转发到内网 OpenClaw,OpenClaw 按企微规则解密并返回明文 echostr,校验就通过了。
4. 验证请求:回调连通与创建文档实测
配置填完不代表链路通了,得实际验证。分两步:先验回调,再验 API 调用。
4.1 回调连通性验证
企微后台点保存时如果提示「验证成功」,说明 GET 校验过了。但为了确认不是缓存假象,可以手动模拟一次校验请求。企微的校验逻辑是:发 GET 带msg_signature、timestamp、nonce、echostr四个参数,你的服务解密echostr后原样返回明文。
用 curl 模拟(参数需按你的 Token/AESKey 实际计算签名,这里演示请求结构):
curl -v "https://xxx.zeronews.cc/wecom/callback?msg_signature=xxx×tamp=1234567890&nonce=abc123&echostr=加密串"如果返回的是解密后的明文 echostr,说明 ZeroNews 转发正常、OpenClaw 校验逻辑正常。如果返回 404,检查 callback_path 和 ZeroNews 路径是否一致;返回 401 或签名错误,检查 callback_token 是否两边一致。
4.2 获取 Access Token 并创建文档
回调通了之后,OpenClaw 就能用自建应用身份换 Access Token 调企微 API 了。把 corpid 和 secret 发给 OpenClaw(或写进配置让它自动换),拿到 token 后调创建文档接口:
# 获取 access_token curl "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww你的企业ID&corpsecret=你的应用Secret"返回里拿到access_token,然后创建文档:
curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/wedoc/create_doc?access_token=ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "spaceid": "你的SPACEID", "fatherid": "你的FATHERID", "doc_type": 3, "doc_name": "运营日报", "admin_users": ["USERID1"] }'doc_type为 3 表示文档类型,具体取值按企微文档 API 说明。请求成功会返回文档的url和docid,说明整条链路——内网 OpenClaw → ZeroNews → 企微 API——完全打通。实测下来,从保存回调到成功创建文档,顺利的话十分钟内能跑完。
5. 本篇常见错排查
回调验证一直失败:九成是 callback_token 或 encoding_aes_key 两边不一致。企微后台生成后复制粘贴容易带空格,逐字符核对。另一个原因是 ZeroNews 映射的路径跟 config.toml 的 callback_path 不匹配,比如映射配了/但代码监听/wecom/callback。
域名归属校验不通过:企微要求可信域名所属权跟企业认证主体一致或关联。如果你用自有域名,确认域名注册主体跟企微认证主体对得上;对不上就换 ZeroNews 分配的域名,或走关联主体流程。
ZeroNews 转发 502:内网 OpenClaw 没起来,或端口写错。先在服务器上curl 127.0.0.1:8787/wecom/callback确认本地服务活着,再看 ZeroNews 映射的内网地址是不是127.0.0.1:8787。如果 OpenClaw 跑在容器里,127.0.0.1可能指不到宿主机,改成容器实际 IP 或宿主机内网 IP。
Access Token 拿不到:corpid 或 secret 填错,或者自建应用没被授权对应权限。企微后台检查应用可见范围,secret 重新生成后旧的要作废。
模型调用报 401:TaoToken 的 Key 没填对或过期。去 API Keys 页面重新创建一个,确认 config.toml 里base_url是https://taotoken.net/api,别多写或少写路径。接入细节可对照接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
6. 把链路固定下来,后续只改业务
回调打通后,剩下的就是业务逻辑。OpenClaw 定时汇总内网数据、调企微文档 API 写入智能表格,这些都在内网完成,ZeroNews 只负责把企微的校验和回调请求送进来。模型调用统一走 TaoToken 的 Key,换模型时改 config.toml 的default_model就行,不用动企微侧配置。
如果你还在调回调阶段,先把 API Keys 建好、接入文档过一遍:API Keys 在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。长期跑编码和 Agent 任务的话,Coding Plan 更省心:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。验证模型通不通,直接去模型对话页发一条:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。