企业微信机器人Webhook请求必须设Content-Type: application/json,否则返回errcode40005;@人需用userid或@all数组格式;key泄露即失控;须结合HTTP状态码与响应体errcode双重判断成败。

curl 发送 Webhook 请求必须设 Content-Type: application/json
企业微信机器人接口只认 application/json 的请求头,漏掉或写成 text/plain、application/x-www-form-urlencoded 都会返回 {"errcode":40005,"errmsg":"invalid media type"}。这不是服务器拒绝你,是它根本没把你的 body 当成 JSON 解析。
实操要点:
-
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'))这行不能省,且必须在curl_setopt($ch, CURLOPT_POSTFIELDS, ...)之前设置 -
json_encode()后的字符串要确保 UTF-8 编码,中文乱码会导致errcode:40002 - 如果用
file_get_contents()替代 curl,需手动构造完整 HTTP 请求(含 header),远不如 curl 稳定
text 类型消息里 @人必须填对 userid 或用 @all
想在文本消息中提醒特定成员,mentioned_list 字段填错格式就会静默失败——接口返回 {"errcode":0,"errmsg":"ok"},但群里啥也没出现。
常见错误和对应写法:
立即学习“PHP免费学习笔记(深入)”;
微信聊天分析助手 v2.1.0 — 完全本地运行的隐私保护工具。 分析聊天记录,推断 MBTI 与大五人格,检测情感趋势,生成可视化报告。 支持 jieba 精准分词、否定识别、反讽检测、风险预警。 内置 RAG 检索增强预测和多智能体博弈模拟,完全本地化、零数据外传。 可选 MiroFish 群体智能引擎增强对话预测。
- 填手机号或邮箱:❌ 不支持,必须是成员在企业微信后台的
userid(如"zhangsan") - 填中文名:❌ 企业微信不认名字,只认系统分配的唯一
userid - @所有人:✅ 写成
array('@all'),不是"@all"(数组形式) - @多个用户:✅
array('zhangsan', 'lisi'),不能带空格或换行
Webhook URL 的 key 泄露等于群消息控制权丢失
那个以 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=... 结尾的地址,key 是公开凭证,没有签名、没有过期时间、不校验来源 IP。谁拿到就能发。
这意味着:
- 绝对不要硬编码在前端 JS、Git 公开仓库、日志输出里
- 生产环境应从环境变量或配置文件读取,且该文件权限设为
600 - 如果怀疑泄露,立刻在企业微信后台删除旧机器人、新建一个,URL 全换
- 测试时用新群加测试机器人,别直接拿正式运营群练手
调试时 curl_getinfo($ch, CURLINFO_HTTP_CODE) 比看 $response 更可靠
企业微信机器人接口在出错时仍可能返回 200 状态码(比如内容字段缺失),而真正有用的错误信息藏在 response body 里;反过来,某些网络超时或 DNS 失败,$response 是 false,但 $httpCode 是 0。
所以判断是否“真成功”,得组合检查:
-
$httpCode !== 200→ 网络/协议层失败,先查 URL、DNS、防火墙 -
$httpCode === 200但json_decode($response, true)['errcode'] !== 0→ 业务逻辑失败,看errmsg - 永远别只靠
if ($response)做判断,curl 默认失败时返回 false,但开启CURLOPT_FAILONERROR反而容易掩盖细节
mentioned_list 里某个 userid 被停用或改名了,而不是代码坏了。


















