在 SpringBoot 项目里集成钉钉机器人,最稳妥的方式是通过 HTTP POST 请求调用钉钉自定义机器人的 Webhook 接口,适合需要即时通知系统异常或业务状态的场景。
先说结论:通过 Webhook 发送 JSON 消息,务必开启签名验证以确保请求合法性。
- 适合:系统异常告警、业务关键节点通知等轻量级消息推送。
- 先看:钉钉群机器人安全设置中的“加签”选项,获取 Secret。
- 建议:封装统一工具类,避免在业务代码中硬编码 Webhook 地址和签名逻辑。
命令速用版
Java 项目不涉及 shell 命令,这里提供核心依赖和请求逻辑片段,可直接复制到工具类中。
<!-- Maven 依赖,使用 Spring 自带 RestTemplate 即可,无需额外 SDK -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
为什么会这样
钉钉自定义机器人本质是一个接收 HTTP POST 请求的服务端点。SpringBoot 作为客户端,需要按照钉钉规定的 JSON 格式构造消息体,并通过 HTTPS 发送。开启签名验证是为了防止 Webhook 地址泄露后被恶意调用,签名算法基于时间戳和密钥生成,服务端会校验请求的时效性和合法性。
分步处理
- 创建机器人:在钉钉群设置中添加自定义机器人,记录 Webhook 地址和 Secret。
- 编写签名工具:使用 Java 标准库计算 HMAC-SHA256 签名,将时间戳和 Secret 拼接后加密,再进行 URL Encode。
- 构造请求:使用 RestTemplate 发送 POST 请求,URL 需拼接 access_token、timestamp 和 sign 参数。
- 配置管理:将 Webhook 和 Secret 放入 application.yml 配置文件中,不要写死在代码里。
怎么验证是否生效
启动项目后触发告警逻辑,观察钉钉群内是否收到消息。同时检查 SpringBoot 控制台日志,确认 HTTP 请求返回状态码为 200 且钉钉接口返回 errcode 为 0。
常见坑
- 签名错误:时间戳单位必须是毫秒,Secret 拼接位置容易出错,导致报错“签名校验失败”。
- 中文乱码:发送 Markdown 或文本消息时,确保请求头 Content-Type 设置为 application/json;charset=UTF-8。
- 频率限制:钉钉机器人有发送频率限制,短时间内大量告警可能导致消息被限流,建议在代码中做聚合或降级处理。
- 安全组限制:如果开启了 IP 白名单,确保服务器出口 IP 已添加到钉钉后台白名单中。
参考来源
- 钉钉开放平台 - 自定义机器人接入:https://open.dingtalk.com/document/robots/custom-robot-access
原文链接:https://www.zjcp.cc/ask/10715.html
