企业微信机器人消息异常的90%原因在于webhook地址未校验、json结构不合规或mentioned_mobile_list传空字符串而非空数组;需确保key保密、payload字段类型正确、手机号纯数字、content无控制字符、markdown含###开头及合法title,复用httpclient并设10秒超时,避免频率超限。

企业微信机器人消息能发出去,但收不到、格式错、@不生效——90%的问题出在 Webhook 地址没校验、JSON 结构不合规、或 mentioned_mobile_list 传了空字符串而非空数组。
Webhook 地址必须带 key 参数且不能泄露
企业微信机器人 Webhook 是一次性生成的固定 URL,形如 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。这个 key 就是密钥,一旦泄露,任何人拿它都能往你的群发消息。
- 不要硬编码在源码里,更别提交到 Git;应通过配置文件(如
appsettings.json)或环境变量注入 - 测试时用 Postman 直接 POST 到该地址,body 设为最简文本消息,确认能收到再集成进 C#
- 如果返回
{"errcode":40014,"errmsg":"invalid webhook url"},说明 URL 格式错误或 key 已被重置(重置后旧地址立即失效)
SendTextAsync 发送失败的三个高频原因
C# 调用 SendTextAsync 返回 true 但群里没消息,往往不是代码问题,而是 payload 不符合企业微信 API 规范。
由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发
-
mentioned_list和mentioned_mobile_list必须是 string[] 类型,传null会被序列化为null,而企业微信要求这两个字段必须存在且为数组(哪怕空) - 手机号必须是 11 位纯数字,不能带
+、-或空格;例如"13812345678"合法,"+8613812345678"无效 - 消息内容
content里不能含控制字符(如 \u0000–\u001F),否则整个请求被静默丢弃;建议用content.Trim().Replace("\0", "")预处理
Markdown 消息颜色和加粗不生效?检查 title 和 text 字段
企业微信 Markdown 消息要求 title 字段非空,且 text 内容必须以 ### 开头(三级标题),否则渲染为纯文本。
- 错误写法:
text = "报警:温度超限"→ 显示为普通文字 - 正确写法:
text = "### 报警:温度超限\n**设备ID**:DEV-001"→ 才会解析为标题+加粗 - 颜色依赖
title值匹配内置关键词:info(灰)、warning(黄)、comment(绿)、red(红);注意大小写敏感,"Warning"不生效
HttpClient 实例必须复用,且超时设为 10 秒内
每次发消息都 new 一个 HttpClient,短时间内大量调用会导致端口耗尽(SocketException: Too many open files)。
- 把
HttpClient声明为static readonly或注册为 DI 中的单例服务 -
Timeout设为TimeSpan.FromSeconds(10)即可;设太长(如 60 秒)会让报警链路卡死,设太短(如 1 秒)容易因网络抖动误判失败 - 别手动调用
Dispose()—— 它是长生命周期对象,由 .NET 运行时管理释放时机
真正容易被忽略的是:企业微信对同一 Webhook 地址的调用频率有限制(约 20 次/分钟),连续快速重试失败消息前,务必加 Thread.Sleep(3000) 或用指数退避;否则触发限流后,后续所有消息都会返回 errcode: 87014,且持续 5 分钟以上无法恢复。









