1. OpenClaw 接入微信生态:从消息回调到小程序端调用
OpenClaw 是一个支持多渠道接入的 AI 网关框架,能让你把大模型能力挂到微信公众号、小程序、企业微信等入口上。微信公众号负责对话式交互,微信小程序负责图形化 AI 应用界面,两者共用同一套 OpenClaw Gateway 后端。适合已经跑通 OpenClaw 本地环境、想进一步把 AI 能力推到微信用户面前的开发者。
我试过把公众号回调和小程序请求都指向同一个 Gateway 实例,用 TaoToken 统一 Key 管理模型调用,省去了每个渠道单独配一套模型凭证的麻烦。下面按公众号接入、小程序接入、统一 Key 配置、验证闭环、排障的顺序展开,每一步都给可复制的配置片段和命令。
先理清整体链路:用户在公众号发消息 → 微信服务器把消息推到你的 Gateway 回调地址 → OpenClaw 调用模型生成回复 → 通过客服消息或被动回复返回给用户。小程序端则是前端wx.request或 WebSocket 连到 Gateway 的 API 端点,Gateway 再调模型。两条链路最终都落到同一个模型调用层,这正是统一 Key 的价值所在。
公众号和小程序的差异主要在交互形态和限制上。公众号被动回复有 5 秒硬限制,超时微信会提示"该公众号暂时无法提供服务",所以 AI 生成慢的场景必须切客服消息。小程序没有这个限制,但 WebSocket 并发连接数同一小程序最多 5 个,HTTP 同域名最多 10 个并发,做压测时要留意。
环境准备清单:已初始化的 OpenClaw 环境、已认证的微信服务号(订阅号只有被动回复能力)、小程序开发者账号、公网可访问且完成 ICP 备案的 HTTPS 域名。备案这块是硬门槛,域名没备案微信服务器配置那一步直接过不了。
2. TaoToken 前置:统一 Key 打通模型调用层
TaoToken 在这里扮演的是模型调用凭证的统一入口。公众号和小程序两条链路如果各自配一套模型 Key,后期换模型、调额度、排查调用来源都会很乱。用 TaoToken 一个 Key 覆盖所有渠道,Gateway 里只维护一份模型配置。
先拿到 Key。访问 https://taotoken.net/api-keys 创建 API Key,复制保存。然后确认你要用的模型 ID,在模型对话页 https://taotoken.net/models 可以看到可用模型列表和对应的 Model ID。
Base URL 统一填https://taotoken.net/api,注意这个地址不带任何查询参数。Key 放在请求头的Authorization: Bearer <你的Key>里。
OpenClaw 的模型配置通常写在~/.openclaw/config.json或项目根目录的openclaw.config.json,具体路径看你初始化时选的。模型段配置如下:
{ "models": { "default": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoToken密钥", "model": "claude-sonnet-4-20250514", "maxTokens": 4096, "temperature": 0.7 } } }如果你用环境变量方式管理,对应写:
export OPENCLAW_MODEL_BASE_URL="https://taotoken.net/api" export OPENCLAW_MODEL_API_KEY="sk-你的TaoToken密钥" export OPENCLAW_MODEL_ID="claude-sonnet-4-20250514"配置完先单独验证模型层通不通,再往上叠微信渠道。用 curl 直接打一次:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复OK两个字"}], "max_tokens": 16 }'返回里能看到choices[0].message.content就说明模型层通了。这一步不通,后面微信渠道配得再对也没用,所以务必先过这关。
注意:TaoToken 的 Key 不要硬编码进会提交到 Git 的文件里,用环境变量或
.env加.gitignore管理。公众号和小程序共用这一个 Key,额度消耗在控制台 https://taotoken.net/console 可以按时间段查看。
3. 可复制配置:公众号回调与小程序 API 双链路
这一节给完整的可复制配置。公众号部分涉及服务器 URL、Token、EncodingAESKey 三个微信侧字段,以及 OpenClaw 侧的渠道配置。小程序部分涉及登录换 openid、WebSocket 对话、服务器域名白名单。
先装微信插件:
openclaw plugins install @openclaw/wechat openclaw plugins list输出里应包含@openclaw/wechat (v1.x.x) - active。
公众号渠道配置写进openclaw.config.json:
{ "channels": { "wechat": { "enabled": true, "appId": "wx1234567890abcdef", "appSecret": "你的AppSecret", "token": "your_custom_token", "encodingAESKey": "43位EncodingAESKey", "encryptMode": "safe", "dmPolicy": "open", "customerService": { "enabled": true, "switchThreshold": 4000, "pendingReply": "正在思考中,请稍候..." }, "autoReply": { "subscribe": "欢迎关注,我是 AI 助手,直接发消息即可。", "fallback": "抱歉,我暂时无法理解,请换个说法。" } } } }微信公众平台侧的服务器配置对应填:服务器地址 URL 填https://your-domain.com/api/channels/wechat/webhook,Token 填上面token字段同一个值,EncodingAESKey 填上面同一个值,消息加解密方式选安全模式。点提交时微信会发 GET 验证请求,Gateway 必须已经在跑。
小程序渠道配置追加到同一个文件:
{ "channels": { "wechatMiniProgram": { "enabled": true, "appId": "wx_miniprogram_appid", "appSecret": "小程序AppSecret", "apiMode": "websocket", "session": { "timeout": 1800, "maxConcurrent": 1000 } } } }小程序端登录换 token 的代码:
// app.js App({ onLaunch() { wx.login({ success: (res) => { wx.request({ url: 'https://your-domain.com/api/wechat-mp/login', method: 'POST', data: { code: res.code }, success: (loginRes) => { wx.setStorageSync('token', loginRes.data.token) } }) } }) } })小程序管理后台的服务器域名配置:request 合法域名填https://your-domain.com,socket 合法域名填wss://your-domain.com。域名必须 HTTPS/WSS,必须已备案,不支持 IP。
启动 Gateway:
openclaw gateway成功日志应包含:
[INFO] WeChat Official Account channel initialized [INFO] Gateway listening on :3000 [INFO] WeChat webhook ready at /api/channels/wechat/webhook4. 验证请求:跑通一次消息收发闭环
配置完必须验证,不然微信侧提交那一步就会失败。验证分三层:模型层、公众号回调层、小程序请求层。
模型层上面 curl 已经验过。公众号回调层先本地模拟微信的 GET 验证请求:
curl -s "https://your-domain.com/api/channels/wechat/webhook?signature=test×tamp=123&nonce=456&echostr=hello"如果 Gateway 正常,会返回hello。返回其他内容说明签名校验或路由有问题。
然后在公众号后台点提交服务器配置,微信会真实发一次验证请求。通过后点启用。启用后用自己的微信给公众号发一条"你好",观察 Gateway 日志是否出现消息接收记录,以及是否调用了模型。
小程序端验证:在开发者工具里跑一次登录,确认wx.setStorageSync('token', ...)拿到了值。然后发一条对话请求:
wx.request({ url: 'https://your-domain.com/api/wechat-mp/chat', method: 'POST', header: { 'Authorization': 'Bearer ' + wx.getStorageSync('token') }, data: { message: '你好' }, success: (res) => { console.log(res.data) } })返回里带模型回复内容,说明小程序链路通了。WebSocket 模式则用wx.connectSocket连wss://your-domain.com,发一条消息看是否收到流式返回。
完整闭环的标志:公众号发消息能收到 AI 回复,小程序发消息也能收到 AI 回复,且两条链路的模型调用都走同一个 TaoToken Key。到控制台看调用记录,应该能看到两个来源的请求都记在同一个 Key 下。
提示:验证阶段建议把
encryptMode先设成plain明文模式,减少加解密干扰。跑通后再切safe安全模式,切完重新在微信后台提交一次配置。
5. 常见报错排查:401、local proxy failed、reading choices
接入过程里最容易卡在几个固定报错上,逐个说。
401 Unauthorized:模型层返回 401,说明 TaoToken Key 不对或没带上。检查Authorization头格式是不是Bearer sk-xxx,中间有空格。检查 Key 有没有复制全,前后有没有多余换行。如果公众号能收到消息但回复是错误提示,去 Gateway 日志里搜401,确认是模型调用返回的还是微信 API 返回的。微信 API 的 401 通常是 AccessToken 过期,OpenClaw 会自动刷新,但 IP 白名单没配会一直失败,去公众平台把 Gateway 公网 IP 加进白名单。
local proxy failed:这个报错通常出现在 Gateway 启动或首次请求时,表示本地代理或网络出口有问题。先确认服务器能直连https://taotoken.net/api,用 curl 测。如果服务器在国内且网络策略严格,检查是否走了不该走的出口。OpenClaw 本身不需要额外代理配置,Base URL 直填即可。如果日志里出现local proxy failed同时伴随连接超时,优先排查服务器 DNS 和出网策略。
reading choices 报错:类似cannot read property 'choices' of undefined或reading 'choices',说明模型返回体结构不对,Gateway 拿不到choices字段。常见原因有三个:Base URL 填错导致打到了非兼容端点,比如多填了/v1或漏了;模型 ID 写错,返回了错误对象而不是正常响应;请求体格式不对,比如messages字段拼写错误。先用第 2 节的 curl 命令确认原始返回结构,再对照 Gateway 配置里的baseUrl和model字段。
OAuth 相关报错:小程序登录换 openid 时如果报 OAuth 错误,检查appId和appSecret是不是小程序的而不是公众号的。两个渠道的凭证不能混用。另外wx.login拿到的 code 只能用一次,重复使用会报错,确保每次登录都重新调wx.login。
公众号提示"该公众号暂时无法提供服务":这是被动回复 5 秒超时。检查customerService.switchThreshold是否设成了 4000 以下,确保 AI 生成慢时能及时切客服消息。同时确认客服消息接口权限已开通,服务号认证后才有。
小程序请求被拒:检查服务器域名白名单是否配了对应域名,协议是不是 HTTPS/WSS。开发者工具里可以勾选"不校验合法域名"临时绕过,但真机必须配好。
6. 继续深入:Coding Plan 与接入文档
公众号和小程序跑通后,如果你想把 OpenClaw 用在长期编码助手或 Agent 场景,可以看 Coding Plan https://taotoken.net/coding-plan ,它针对高频编码调用做了额度优化。模型对话页 https://taotoken.net/models 可以随时切换底层模型,公众号和小程序不用改配置,改 Gateway 里的model字段重启即可。
接入过程中遇到渠道配置细节,文档 https://taotoken.net/doc 里有各渠道的字段说明。API Key 管理在 https://taotoken.net/api-keys ,控制台 https://taotoken.net/console 看调用量和额度消耗。
最后给一个实用技巧:公众号和小程序共用同一个 Gateway 时,建议在日志里给两个渠道打不同 tag,方便排查是哪个渠道的请求出了问题。OpenClaw 的渠道配置里加一个logTag字段,日志输出时就能区分。这个在同时调试两条链路时特别省时间。