1. 企微自建应用接入 OpenClaw 后到底能不能给其他成员发消息
先把结论说清楚:能,但发消息这件事不是 OpenClaw 直接干的,而是你那个企微自建应用干的。OpenClaw 只是帮你把后端逻辑写出来、把请求发出去,真正落到同事手机上的那条消息,走的是企业微信的「应用消息」接口。所以整条链路能不能通,取决于三件事:应用可见范围有没有覆盖到目标成员、应用有没有拿到发消息的接口权限、以及调用时的 access_token 是不是有效。
我一开始也以为把 CorpID 和 Secret 丢给 OpenClaw 就完事了,结果第一次调用直接返回 60020(not allow to access from your ip),第二次返回 81013(user not exist),折腾了半天才明白:企微的权限是分层的,企业级、应用级、成员级各管一段,任何一层没配对,消息就发不出去。
这篇就按「先核对权限,再走 TaoToken 统一 Key 通道完成鉴权,最后逐条验证」的顺序写。适合两类人:一是已经建好企微自建应用、想用 OpenClaw 自动发通知的开发者;二是手里有 OpenClaw 但不确定企微这边要开哪些开关的同学。核心检索词就是企微自建应用发消息、OpenClaw 接入企业微信、TaoToken 统一 Key 通道这几个,下面会反复落到具体配置上。
需要提前说明的是,企微的接口权限和可见范围是在管理后台配的,OpenClaw 改不了这部分,它只能改后端调用逻辑。所以别指望给 OpenClaw 发一句「帮我给张三发消息」就自动生效,前置的授权动作必须人工在后台点完。
2. 接入前必须核对的企微权限与 TaoToken 统一 Key 通道准备
2.1 企微侧要拿到的三样东西
进入企微管理后台(work.weixin.qq.com),用管理员账号操作。第一样是企业 ID(CorpID),在「我的企业」→「企业信息」最下面,形如wwxxxxxxxxxxxxxxxx。第二样是自建应用的 AgentId 和 Secret,在「应用管理」→「自建」→ 点进你的应用,AgentId 是纯数字,Secret 点「查看」会发到管理员企微上。第三样最关键:应用可见范围。在应用详情页的「可见范围」里,必须把要接收消息的同事加进去,否则接口会报 81013。
这里有个容易忽略的点:可见范围分「部门」和「成员」两种添加方式,如果你只加了部门但同事不在该部门,照样发不到。我试过把整个「研发部」加进去,结果新入职还没分配部门的同事收不到,后来单独把他加进成员列表才行。
2.2 消息接口权限确认
自建应用默认有「发送应用消息」的权限,但如果你要用更细的能力,比如发给外部联系人、发到群机器人,需要在「应用管理」里单独申请。普通给内部成员发文本、图文、markdown 卡片,用message/send接口就够,不需要额外申请。接口地址是:
https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN2.3 TaoToken 统一 Key 通道的作用
OpenClaw 在调用企微接口前,需要先拿到 access_token。企微的 access_token 有效期 7200 秒,且同一应用多次获取会互相顶掉,自己写缓存逻辑容易出并发问题。TaoToken 的统一 Key 通道在这里的价值是:把模型调用和企微接口调用的鉴权收敛到一套 Key 管理里,OpenClaw 侧只需要配一次 Base URL 和 Key,不用在代码里硬编码企微 Secret。
TaoToken 的 API 入口是https://taotoken.net/api,控制台在https://taotoken.net/console,API Keys 管理在https://taotoken.net/api-keys。你可以在控制台建一个专用 Key,给 OpenClaw 用,权限范围只开需要的模型和接口,避免一个 Key 泄露影响全部业务。
注意:TaoToken 是统一 Key 通道,不是企微的替代品。企微的 CorpID、Secret、AgentId 仍然要在企微后台拿,TaoToken 负责的是 OpenClaw 调用时的鉴权收敛。
3. 可复制的企微应用配置片段与 OpenClaw 侧请求示例
3.1 企微应用配置片段(JSON)
把下面这段存成wecom-app.json,放在 OpenClaw 能读到的配置目录里。路径按你的实际项目改,我这边放在~/.openclaw/config/wecom-app.json:
{ "corp_id": "wwxxxxxxxxxxxxxxxx", "agent_id": 1000002, "secret": "你的应用Secret", "visible_members": ["zhangsan", "lisi"], "visible_departments": [1, 2], "api_base": "https://qyapi.weixin.qq.com/cgi-bin", "token_cache_ttl": 7000 }visible_members和visible_departments只是给你自己核对用的,实际权限以企微后台为准。token_cache_ttl设 7000 秒,比 7200 少 200 秒,留出刷新缓冲。
3.2 TaoToken 侧配置(TOML)
OpenClaw 如果支持 TOML 配置,可以这样写~/.openclaw/config/taotoken.toml:
[taotoken] base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" default_model = "claude-sonnet-4-20250514" [taotoken.wecom] enabled = true corp_id = "wwxxxxxxxxxxxxxxxx" agent_id = 1000002Base URL、Key、Model ID 三件套在这里齐了。如果你用的是 Claude Code 或 Cline 这类工具,配置项名称可能不同,但核心就是这三样。
3.3 OpenClaw 侧发消息请求示例
下面是一段 Python 示例,OpenClaw 生成后端逻辑时可以直接用。先拿 access_token,再发消息:
import requests import json CORP_ID = "wwxxxxxxxxxxxxxxxx" SECRET = "你的应用Secret" AGENT_ID = 1000002 def get_access_token(): url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={SECRET}" resp = requests.get(url, timeout=10) data = resp.json() if data.get("errcode") != 0: raise RuntimeError(f"gettoken failed: {data}") return data["access_token"] def send_text(to_user, content): token = get_access_token() url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}" payload = { "touser": to_user, "msgtype": "text", "agentid": AGENT_ID, "text": {"content": content}, "safe": 0 } resp = requests.post(url, data=json.dumps(payload), timeout=10) return resp.json() if __name__ == "__main__": print(send_text("zhangsan", "来自 OpenClaw 的测试消息"))touser填企微账号(不是手机号,是成员账号),多个用|分隔。agentid必须和你后台的应用一致,填错会报 60011。
3.4 用 TaoToken 统一 Key 调用模型生成消息内容
如果你想让 OpenClaw 先调模型生成消息文案,再发给同事,可以这样接:
import requests def gen_message(prompt): url = "https://taotoken.net/api/v1/chat/completions" headers = { "Authorization": "Bearer sk-你的TaoTokenKey", "Content-Type": "application/json" } body = { "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": prompt}] } resp = requests.post(url, headers=headers, json=body, timeout=30) return resp.json()["choices"][0]["message"]["content"]这样模型调用和企微发送走两条通道,但鉴权都收敛到 TaoToken 的 Key 上,OpenClaw 侧不用维护两套密钥。
4. 逐条验证请求与成功结果确认
4.1 第一步:验证 access_token 能拿到
先单独跑get_access_token(),成功返回类似:
{"errcode":0,"errmsg":"ok","access_token":"xxxxx","expires_in":7200}如果这里就失败,后面不用试了。常见错误 40001 是 Secret 填错,40013 是 CorpID 不对。
4.2 第二步:验证应用可见范围
调message/send之前,先用user/list接口确认目标成员在你的可见范围内:
https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=TOKEN&department_id=1&fetch_child=1返回里能看到成员列表。如果目标同事不在,说明可见范围没配好,回后台加。
4.3 第三步:发送测试消息
跑send_text("zhangsan", "测试"),成功返回:
{"errcode":0,"errmsg":"ok","msgid":"xxxxx"}msgid有值就说明消息已经投递到企微服务器。同事那边应该能收到来自你应用的消息卡片。
4.4 第四步:确认消息类型和展示
文本消息最稳,markdown 消息在企微里会渲染成卡片,但要注意markdown类型只支持部分语法。如果你发的是图文,articles数组里每项要有title、description、url、picurl。
提示:测试阶段建议先发给自己,确认链路通了再发给同事,避免打扰。
5. 本篇常见错误排查:401、local proxy failed、reading choices、OAuth
5.1 401 Unauthorized
这个通常出现在调 TaoToken 模型接口时,Key 填错或过期。检查Authorization: Bearer sk-xxx里的 Key 是不是从https://taotoken.net/api-keys复制的完整值。如果 Key 没问题,看下 Base URL 是不是写成了https://taotoken.net/api,少写/api会 404,多写斜杠可能 401。
5.2 local proxy failed
OpenClaw 如果配了本地代理转发,报这个错说明代理进程没起来或端口被占。检查你的代理配置里base_url指向的本地端口,用curl http://127.0.0.1:端口/health确认。如果是 Cline MCP 场景,MCP server 没启动也会报类似错误,重启 MCP 进程即可。
5.3 reading choices 报错
调模型接口返回reading 'choices'说明响应体里没有choices字段,通常是返回了错误 JSON。打印完整响应看看,常见原因是 model ID 写错,比如把claude-sonnet-4-20250514写成claude-sonnet-4。Model ID 必须和 TaoToken 控制台里列出的完全一致。
5.4 OAuth 相关报错
如果你用的是 Claude Code 接入,报 OAuth 错误说明认证方式选错了。Claude Code 应该用 API Key 方式,不是 OAuth。在~/.claude/settings.json里配:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey" } }三件套 Base URL、Key、Model ID 都要对上。Codex 的话看~/.codex/auth.json,里面OPENAI_API_KEY填 TaoToken 的 Key,base_url填https://taotoken.net/api。
5.5 企微侧错误码对照
| 错误码 | 含义 | 处理 |
|---|---|---|
| 60020 | IP 不在白名单 | 后台配可信 IP |
| 81013 | 成员不存在 | 检查可见范围 |
| 60011 | agentid 无效 | 核对 AgentId |
| 40001 | Secret 错误 | 重新查看 Secret |
| 45009 | 接口调用超限 | 降低频率 |
6. 把 OpenClaw 发消息能力落到日常通知场景
链路通了之后,实际用法可以很灵活。比如让 OpenClaw 监听某个事件,触发时先调模型生成一段通知文案,再通过自建应用发给相关同事。我现在的做法是:OpenClaw 里配一个定时任务,每天下班前把当天构建结果汇总,调 TaoToken 的模型接口润色成一段人话,再走企微message/send发给项目组。
如果你要长期跑这类编码和 Agent 任务,可以考虑 TaoToken 的 Coding Plan,入口在https://taotoken.net/coding-plan,适合需要稳定调用模型做自动化的场景。只是临时验证模型效果的话,用模型对话页https://taotoken.net/chat就够了。接入文档在https://taotoken.net/doc,API Keys 在https://taotoken.net/api-keys,排障时对着文档核对参数最快。
最后提醒一句:企微的可见范围和接口权限是动态的,新同事入职、部门调整后都要重新核对,别配一次就不管了。我踩过的坑就是部门重组后没更新可见范围,消息静默失败了好几天才发现。