Java项目中集成钉钉机器人推送消息提醒
前言:
项目中有一个需求,当有新订单产生的时候,希望能够及时通知到业务相关人员进行处理,整体考虑了一下,选用了钉钉机器人提醒功能(公司内部主要也是使用钉钉进行通讯)。
操作:
主要分为两部分进行处理:
一、添加自定义机器人
首先新建一个群
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。完成必要的安全设置(至少选择一种),勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”即可。
(备注:安全设置方式,我选用的是加签,密钥要复制出来,后面要用到)

步骤二:复制出机器人的Webhook地址(格式如下截图),可用于向这个群发送消息。并点击【完成】,自定义机器人就添加成功了。

二、代码部分
主要分为两部分进行处理:
首先在application中配置accessToken和密钥
#集成钉钉服务
ding:
robot:
token: 对应Webhook中的access_token值
key: 对应安全设置->加签方式中的密钥
添加加密方式
1 /**
2 * 钉钉自定义机器人安全设置
3 * 把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)
4 * @param secret
5 * @return
6 */
7 public static String dingHmacSHA256(String timestamp, String secret) {
8 try {
9 String stringToSign = timestamp + "\n" + secret;
10 Mac mac = Mac.getInstance("HmacSHA256");
11 mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
12 byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
13 String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
14 return sign;
15 } catch (Exception e) {
16 log.error("dingHmacSHA256加密失败", e);
17 }
18 return null;
19 }
业务代码
1 @Value("${ding.robot.token}")
2 private String robotToken;
3 @Value("${ding.robot.key}")
4 private String robotKey;
5
6 @Autowired
7 private RestTemplate restTemplate;
8
9 /**
10 * 推送钉钉机器人消息
11 * @param type
12 * @return
13 */
14 public String sendDingMsg(String type, String orderId, String serviceName) {
15 String timestamp = String.valueOf(System.currentTimeMillis());
16 String sign = HmacSha256Util.dingHmacSHA256(timestamp, robotKey);
17 // 钉钉机器人地址(配置机器人的webhook)
18 // https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX
19 String dingUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + robotToken + "×tamp=" + timestamp + "&sign=" + sign;
20
21 //是否通知所有人
22 boolean isAtAll = true;
23
24 //通知具体人的手机号码列表
25 List<String> mobileList = Lists.newArrayList();
26 //mobileList.add("填入手机号,可以具体@到某个人");
27 //mobileList.add("13411111111");
28
29 //钉钉机器人消息内容
30 String content = "【提醒】有一笔新的[" + serviceName + "]服务订单,订单号为" + orderId + ",请及时查看!";
31 //组装请求内容
32 Map<String, Object> reqStr = buildReqStr(content, isAtAll, mobileList);
33 return invokeGeneralApi(dingUrl, reqStr);
34 }
35
36 /**
37 * 组装请求报文
38 * @param content
39 * @return
40 */
41 private Map<String, Object> buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
42 //消息内容
43 Map<String, String> contentMap = Maps.newHashMap();
44 contentMap.put("content", content);
45
46 //通知人
47 Map<String, Object> atMap = Maps.newHashMap();
48 //1.是否通知所有人
49 atMap.put("isAtAll", isAtAll);
50 //2.通知具体人的手机号码列表
51 atMap.put("atMobiles", mobileList);
52
53 Map<String, Object> reqMap = Maps.newHashMap();
54 reqMap.put("msgtype", "text");
55 reqMap.put("text", contentMap);
56 reqMap.put("at", atMap);
57
58 return reqMap;
59 }
60
61 @Override
62 public String invokeGeneralApi(String url, Map<String, Object> params) {
63 String body = "";
64 try {
65 HttpHeaders headers = new HttpHeaders();
66 headers.setContentType(MediaType.APPLICATION_JSON);
67 HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(params, headers);
68 ResponseEntity<String> entity = restTemplate.postForEntity(url, httpEntity, String.class);
69 body = entity.getBody();
70 LOGGER.info("invokeGeneralApi()>>>[{}]", body);
71 } catch (RestClientException e) {
72 LOGGER.error("API调用错误,接口地址:[{}],请求参数:[{}]", url, params, e);
73 }
74 return body;
75 }
三、效果图

官方链接:
Java项目中集成钉钉机器人推送消息提醒的更多相关文章
- nodejs通过钉钉群机器人推送消息
nodejs 通过钉钉群机器人推送消息 Intro 最近在用 nodejs 写爬虫,之前的 nodejs 爬虫代码用 js 写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescri ...
- Java Springboot webSocket简单实现,调接口推送消息到客户端socket
Java Springboot webSocket简单实现,调接口推送消息到客户端socket 后台一般作为webSocket服务器,前台作为client.真实场景可能是后台程序在运行时(满足一定条件 ...
- 最新的极光推送服务器端代码(java服务器后台向手机端自定义推送消息)
一共两个类 一个Jdpush 一个JpushClientUtil 代码如下 注解都写的很清楚 package com.sm.common.ajpush; import org.slf4j.Log ...
- mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能
接着上一篇说,上一篇的TOPIC是写死的,然而在实际项目中要给不同用户 也就是不同的topic进行推送 所以要写活 package com.fh.controller.information.push ...
- Python3使用钉钉机器人推送消息(签名方式)
import time import hmac import hashlib import base64 import urllib import json import requests impor ...
- 【OF框架】在Azure DevOps中配置项目持续集成CI服务,推送镜像到Azure容器注册表
准备工作 开通Azure账号,具有开通服务权限,关键是里面要有钱. 开通Azure DevOps,能够创建组织和项目. 具备一定的DevOps知识,了解CICD概念.Docker基本操作. 一.创建& ...
- 钉钉机器人集成Jenkins推送消息模板自定义发送报告
一.由于公司同样也使用了钉钉.那么在做Jenkins集成自动化部署的时候,也是可以集成钉钉的. 那种Jenkins下载钉钉插件集成,简单设置就可以完成了.我们今天要做的是,定制化的发送消息. 钉钉推送 ...
- 在Java项目中整合Scala
Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...
- Django 通过APNS推送消息
最近手上一个项目需要通过APNS向app推送消息,由于后端采用drf框架,在github上找了好多模块,最终发现pzanitti大神的推送模块 django-push-notifications 比较 ...
随机推荐
- python函数模块
python函数模块 学习完本篇,你将会深入掌握 函数相关知识 1.函数定义 2.函数如何调用 3.递归函数以及匿名函数使用 模块相关知识 1.模块如何导入调用 2.函数调用顺序 函数定义 函数代码块 ...
- 重学VUE——vue 常用指令有哪些?
一.什么是指令? 在 vue 中,指令以 v- 开头,是一种特殊的自定义行间属性.指令属性的预期值是一个表达式,指令的职责就是:表达式的值改变时,相应地将某些行为应用到DOM上.只有v-for是一个类 ...
- COS控制台进阶 - 文件预览和在线编辑
导语 | COS控制台新上线了文件预览功能,用户可在控制台内直接预览.编辑文件内容. 前不久,微软发布了 vscode for web 的公告,是基于web的在线代码编辑器,无需下载安装可以直接在we ...
- 使用ImageMagick操作gif图
上篇文章我们已经学习了 GraphicsMagick 中的许多函数,也说过 GraphicsMagick 是 ImageMagick 的一个分支,所以他们很多的函数都是一样的使用方式和效果,相似的内容 ...
- TP5框架下实现数据库的备份功能-tp5er/tp5-databackup
1.安装扩展 方法一: composer require tp5er/tp5-databackup dev-master 方法二 composer.json: "require": ...
- jQuery has been removed
jQuery has been removed, 新的项目不要用jQuery了 这些问题都已经有了解决方案 * $()选择器, * $.ajax, * $dom.on("click" ...
- python的列表和java的数组有何异同
今天面试被问到,自己学习一下. python的列表是可变长的,定义时不需要指定长度:pyhton是弱对象类型,python的列表存储的数据类型可以不相同:python的列表更加灵活,如可以通过''命令 ...
- P3211-[HNOI2011]XOR和路径【高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P3211 题目大意 一个\(n\)个点\(m\)条边的无向图,从\(1\)到\(n\)随机游走.求期望路径异或和. ...
- Python3入门系列之-----循环语句(for/while)
前言 for循环在Python中是用的比较多的一种循环方法,小伙伴需要熟练掌握它的使用 本章节将为大家介绍 Python 循环语句的使用.Python 中的循环语句有 for 和 while for循 ...
- 利用PATH环境变量 - 提升linux权限~👻
利用PATH提升linux权限 参考地址:https://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/ ...