核心逻辑:从“群 ID”到“发送消息”
要实现主动向外部群发送消息,本质上不是简单的 send 指令,而是一套基于 客户联系(External Contact) 权限体系的操作。
1. 权限前提
在开发前,必须确保以下三点:
- 自建应用权限:在企业微信后台,自建应用必须具备“客户联系”权限。
- 配置可信域名:确保你的服务器 IP 和域名已在企业微信后台备案。
- 配置配置范围:应用必须在配置范围内包含该群的主持人(群主)。
2. 获取 chat_id 的路径
外部群的唯一标识是 chat_id。你不能凭空猜测,通常有三种获取方式:
-
通过客户群列表接口:调用
群聊列表获取接口,遍历当前成员拥有的群聊。 -
通过回调事件:当外部群发生变化(成员入群、退群、重命名)时,企业微信会向你的服务器推送包含
chat_id的 XML 数据。 - 通过群二维码/群路径解析。
关键技术实现(以发送消息为例)
在获取了 chat_id 后,调用接口的核心步骤如下:
API 接口地址
POST https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/send?access_token=ACCESS_TOKEN
请求体关键字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
chat_id |
String | 是 | 客户群 ID |
msgtype |
String | 是 | 消息类型(text, image, link, miniprogram 等) |
text |
Object | 否 | 文本消息内容 |
safe |
Integer | 否 | 表示是否是保密消息,0表示否,1表示是,默认0 |
注意: 外部群的消息发送有频率限制。如果短时间内高频发送,可能会触发风控导致消息发送失败(返回错误码
45009)。
开发者必须绕过的“坑”
1. 外部群不等于内部群
很多开发者直接调用 appchat/send 接口,发现只能发给公司内部同事。对于包含微信用户的客户群,必须使用 externalcontact/groupchat/send 相关的专用接口。
2. AccessToken 的缓存机制
不要在每次调用接口时都去请求 access_token。企业微信对 Token 获取频率有限制,务必在本地服务器进行全局缓存(通常有效期 2 小时),并在失效前提前刷新。
3. “可发送”状态校验
并不是所有的外部群都能随时通过 API 发送。如果群主退出了企业,或者该群被解散,chat_id 虽然存在但发送会报错。建议在业务逻辑中加入异常捕获机制。
总结与建议
企业微信外部群的二次开发,重点不在于代码的复杂程度,而在于对企业微信权限模型的理解。
-
流程规范化:先获取权限 -> 监听回调获取
chat_id-> 缓存 Token -> 按需调用。 - 合规性:API 虽好,但切记不要利用 API 进行高频骚扰操作,保护好私域生态的活跃度。

image.png