CMS对接钉钉,表单提交推送钉钉消息提醒:CMS对接钉钉
很多站长希望网站表单有人提交时,能立刻在钉钉收到提醒,避免错过客户留言。
实现思路很简单:在钉钉群创建自定义机器人,拿到 Webhook 地址,再在 CMS 的表单提交处理逻辑里调用这个地址发送消息。
本文按零基础可操作的方式,讲清配置、代码接入和验证方法。
动手前需要确认的三件事
开始配置前,先确认你的环境满足以下条件,否则后面容易卡住:
- 一个钉钉账号,并且能创建或加入至少一个群聊。
- CMS 后台能编辑表单处理文件,或者支持自定义表单提交后的回调。如果 CMS 完全封闭、不允许改代码,就需要用「表单提交到第三方接口」或「数据库触发」的替代方案。
- 服务器能访问外网,特别是能请求
https://oapi.dingtalk.com。如果服务器在内网且限制出站,需要先放行。
在钉钉群里创建自定义机器人
进入目标钉钉群,点击右上角群设置,找到「智能群助手」或「机器人管理」,选择「添加机器人」中的「自定义机器人」。
创建时重点填写两项:
- 机器人名称:例如「网站表单提醒」,方便群里识别。
- 安全设置:推荐勾选「加签」,这是目前兼容性最好、也最安全的方式。如果选「自定义关键词」,消息内容必须包含你设置的关键词,否则会被钉钉拒绝。
创建完成后,钉钉会给出一个 Webhook 地址,格式类似:
https://oapi.dingtalk.com/robot/send?access_token=你的token
如果启用了加签,还会同时给出一个以 SEC 开头的密钥。这个密钥只显示一次,务必先复制保存,关闭页面后就看不到了。
在 CMS 表单提交逻辑中接入推送
不同 CMS 的表单处理文件位置不同。
常见位置是 application/form/controller/Index.php、includes/form.php 或主题目录下的 post.php。
找到表单数据入库或发送邮件的那一段代码,在成功之后加入推送逻辑。
下面以 PHP 为例,给出一个可直接改用的推送函数:
function sendDingTalk($content) {
$webhook = '你的Webhook地址';
$secret = '你的SEC密钥';
$timestamp = round(microtime(true) * 1000);
$stringToSign = $timestamp . "\n" . $secret;
$sign = urlencode(base64_encode(hash_hmac('sha256', $stringToSign, $secret, true)));
$url = $webhook . "×tamp={$timestamp}&sign={$sign}";
$data = [
'msgtype' => 'text',
'text' => ['content' => $content]
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_exec($ch);
curl_close($ch);
}
然后在表单提交成功的位置调用:
$msg = "收到新表单提交\n姓名:{$name}\n电话:{$phone}\n内容:{$content}";
sendDingTalk($msg);
注意:推送代码要放在数据确认保存成功之后,避免表单校验失败也发消息。
同时建议用 try 包裹或加超时控制,钉钉接口异常不应导致用户提交失败。
容易踩坑的地方
- 签名计算错误:
timestamp和secret之间必须是换行符\n,不是空格,也不是字符串拼接。用错会导致返回310000错误。 - 忘记 URL 编码:
sign必须经过urlencode,否则特殊字符会破坏请求。 - IP 白名单没配:如果安全设置里填了服务器 IP,但服务器出口 IP 变了,推送会失败。建议先不加白名单,调通后再按需收紧。
- 消息频率超限:钉钉自定义机器人有发送频率限制,短时间内大量表单提交可能被限流。高频场景建议在代码里加简单队列或合并推送。
- 服务器时间不准:加签依赖时间戳,服务器时间偏差过大会导致签名失效。可以用
date命令检查,必要时同步 NTP。
验证推送是否真的生效
配置完成后,不要只看代码有没有报错,要实际验证:
- 在网站前台提交一条测试表单,内容填「测试」。
- 观察钉钉群是否收到消息,消息里应包含你拼装的字段。
- 如果没收到,先查看 CMS 日志或 PHP 错误日志,确认
curl_exec是否返回了内容。 - 手动访问一次 Webhook 地址(配合正确的签名参数),看钉钉返回的 JSON 里
errcode是否为 0。返回非 0 时,错误码会直接说明原因。
只要钉钉群能收到测试消息,并且表单字段完整,整个 CMS 对接钉钉的消息提醒就算配置成功了。
后续如果更换机器人或密钥,只需更新代码里的 $webhook 和 $secret 两个变量即可。