SpringBoot集成DingTalk钉钉机器人实现消息同步/异步预警推送1.0版本
开发环境说明
- JDK1.8
- springboot版本: 2.0.3.RELEASE
快速入门
V2.0快速使用文档
2.X版本使用文档
jar包依赖
<dependency>
<groupId>com.github.answerail</groupId>
<artifactId>dingtalk-spring-boot-starter</artifactId>
<version>2.0.4-RELEASE</version>
</dependency>
<!-- 2.0.1及之前版本需引入 -->
<!--
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
-->
配置文件
spring:
dingtalk:
token-id: c60d4824e0ba4a30544e81212256789331d68b0085ed1a5b2279715741355fbc
project-id: ${spring.application.name}
title: 预警通知
secret: APC3eb471b2761851d6ddd1abcndf2d97be21447d8818f1231c5ed61234as52d1w0
# xml方式配置, 注解方式不需要配置
dinger-locations: classpath*:dinger/*.xml
token-id获取方式: token-id的值就是机器人的Webhook地址中access_token的值。
启动类设置
@SpringBootApplication
@MapperScan(basePackages = "com.jaemon.dt.mapper")
// 标识Dinger层扫描路径
@DingerScan(basePackages = "com.jaemon.dt.dinger")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
- @DingerScan: 标识Dinger层扫描路径
Dinger层
注解方式
public interface OrderDinger {
@DingerText(value = "订单号${orderNum}下单成功啦, 下单金额${amt}", phones = {"13520200906"})
DingTalkResult orderSuccess(
@Parameter("orderNum") String orderNo,
@Parameter("amt") BigDecimal amt
);
@DingerMarkdown(
value = "#### 下单失败啦 @13520200906\n - 订单号: ${orderNo}\n - 标识: ${flag}\n - 数量: ${num}",
title = "下单结果反馈",
phones = {"13520200906"},
tokenId = @DingerTokenId(
value = "c60d4824e0ba4a30544e81212256789331d68b0085ed1a5b2279715741355fbc",
secret = "APC3eb471b2761851d6ddd1abcndf2d97be21447d8818f1231c5ed61234as52d1w0")
)
DingTalkResult orderFailed(String orderNo, int num, boolean flag);
}
- @Keyword: 标识关键词,用于根据关键词信息快速定位请求日志(主要用于发送钉钉消息异常时的日志定位);
- @Parameter: 如果消息体中使用的参数变量和定义的入参名称不一致,可使用该注解进行个性化设置参数变量名称;
- @DingerClose: 用于关闭 XXXDinger.java 或者指定其中的一个至多个方法;
- 作用于Dinger类上,关闭Dinger类中所有方法通知;
- 作用于方法上, 关闭当前方法通知;
- @Dinger: 用于指定 @DingerScan 指定路径之外的 XXXDinger.java 文件
xml方式
配置文件新增dinger-locations路径配置
spring:
dingtalk:
dinger-locations: classpath*:dinger/*.xml
如: resources/dinger/OrderDinger.xml
OrderDinger.java接口层
public interface OrderDinger {
DingTalkResult orderSuccess(
@Parameter("orderNum") String orderNo,
@Parameter("amt") BigDecimal amt
);
DingTalkResult orderFailed(String orderNo, int num, boolean flag);
}
OrderDinger.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE dinger SYSTEM "dingtalk-dinger.dtd">
<!DOCTYPE dinger PUBLIC "-//AnswerAIL//DTD Dinger 2.0//EN" "dingtalk-dinger.dtd">
<dinger namespace="com.jaemon.dt.dinger.OrderDinger">
<message id="orderSuccess" type="TEXT">
<body>
<!-- <type>text</type> -->
<content>
订单号${orderNum}下单成功啦, 下单金额${amt}
</content>
<phones atAll="true" />
</body>
<!-- 配置消息体使用的钉钉机器人信息 -->
<configuration async="false">
<token-id
secret="APC3eb471b2761851d6ddd1abcndf2d97be21447d8818f1231c5ed61234as52d1w0"
decrypt-key="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeSpqEVuq2NVNDu2lJb">iH178Wn85rI+Mlguimxml79o5/w/CVGEjVWULfJog
</token-id>
<!-- 是否异步发送 -->
<!-- <async-execute>true</async-execute> -->
</configuration>
</message>
<message id="orderFailed" type="MARKDOWN">
<body>
<!-- <type>markdown</type> -->
<content title="下单结果反馈">
#### 下单失败啦 @13520200906
- 订单号: ${orderNo}
- 标识: ${flag}
- 数量: ${num}
</content>
<!-- markdown不支持@全部, 只支持@指定用户 -->
<phones>
<!-- 指定的phone的用户必须在tokenId群中 -->
<phone value="13520200906" />
</phones>
</body>
</message>
</dinger>
XXXDinger.xml 配置模板文档
验证
@Slf4j
@RestController
public class TestController {
@Autowired
private OrderDinger orderDinger;
@GetMapping("/notify")
public void notify() {
DingTalkResult result = orderDinger.orderSuccess("20200906", BigDecimal.valueOf(10000));
log.info(JSON.toJSONString(result));
result = orderDinger.orderFailed("20200906", 10, false);
log.info(JSON.toJSONString(result));
}
}
收到消息格式
钉钉收到的orderSuccess通知消息
- 订单号20200906下单成功啦, 下单金额1000@所有人
钉钉收到的orderFailed通知消息
下单失败啦 @XXX
- 订单号: 20200906
- 标识: false
- 数量: 10