企业微信发消息必须先获取并缓存access_token,有效期2小时;发送时需URL编码凭证、设正确Content-Type、JSON必填字段齐全、链接强制HTTPS;机器人需按规范签名且限频。

企业微信发送消息必须先拿到 access_token
不拿 access_token,所有发消息请求都会返回 {"errcode":40014,"errmsg":"invalid access_token"}。这不是权限问题,是认证凭据缺失的硬性拦截。
-
access_token有效期 2 小时,必须缓存并自动刷新,不能每次发消息都重新请求 - 推荐用静态变量 + 定时器或懒加载+双重检查锁(
Lazy配合Interlocked)管理,避免并发重复获取 - 调用
https://qyapi.weixin.qq.com/cgi-bin/gettoken时,corpid和corpsecret必须 URL 编码(尤其corpsecret含斜杠或加号时)
用 HttpClient 发 POST 请求发文本消息最稳
别用 WebClient 或封装过重的 SDK,企业微信对 HTTP 状态码和 JSON 格式敏感,越简单越可控。
- 必须设
Content-Type: application/json; charset=utf-8,漏掉charset=utf-8可能导致中文乱码(返回errcode=0但消息体为空) - 消息体 JSON 中
toparty、touser、totag三者至少填一个,全空会报errcode=40005 - 发送给部门时,
toparty值是数字 ID 字符串(如"123"),不是名称;ID 需从管理后台「通讯录」里手动查,API 不提供名称转 ID 接口 - 示例片段:
var json = new { touser = "ZhangSan", msgtype = "text", text = new { content = "你好" } };
发送图文/卡片消息要注意字段嵌套和权限
企业微信的 news 和 interactive 消息类型,字段层级深、校验严,错一层就 errcode=40006(无效参数)。
-
news类型中,articles是数组,每个元素必须含title、description、url、picurl四个字段,缺一不可(picurl可为空字符串,但不能省略) -
interactive卡片消息需提前在管理后台「应用管理 → 自建应用 → 选择应用 → 设置 → 交互消息」开启权限,否则返回errcode=40019 - 所有链接字段(
url、picurl、btntxt对应的链接)必须是 HTTPS,HTTP 会静默失败
企业微信机器人 Webhook 要单独处理签名和限频
机器人不是走 access_token 流程,而是用 Webhook URL + 可选签名,但签名逻辑容易写错。
- 启用签名时,必须按文档拼接
timestamp + "\n" + secret再算 SHA256,换行符是\n(不是\r\n),且末尾不能多空格 - 签名后要 hex 编码成小写字符串,拼到 URL 后作为
sign参数,例如:https://qyapi.weixin.qq.com/...?key=xxx&sign=abcd1234... - 机器人每分钟最多 20 条,超限返回
429 Too Many Requests,需在代码里做滑动窗口计数,不能只靠重试 - 机器人不支持
touser/toparty,消息默认发到配置的群,也无法指定接收人
企业微信消息接口看着简单,但 access_token 生命周期、字段必填性、HTTPS 强制要求、签名换行细节这些地方,错一个就卡住半天。实际跑通第一条消息后,建议立刻把 token 获取、JSON 构造、HTTP 发送这三块抽成独立方法,后面加新类型只是改 body。











