测测类

    /**
* 测试钉钉群通知
*
* @return
*/
@GetMapping("/testDingTalk")
public Result testDingTalk() {
//发送普通文本消息
DingTalkSendResult dingTalkSendResult = DingTalkUtil.sendTalk("测试普通文本消息");
//自己组装复杂的消息,以便发送其他消息类型的消息
// DingTalkSendResult dingTalkSendResult = DingTalkUtil.sendTalkContent("{\"actionCard\":{\"title\":\"乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身\",\"text\":\"![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png) ### 乔布斯 20 年前想打造的苹果咖啡厅 Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划\",\"btnOrientation\":\"0\",\"singleTitle\":\"阅读全文\",\"singleURL\":\"https://www.dingtalk.com/\"},\"msgtype\":\"actionCard\"}");
return Result.ok(dingTalkSendResult);
}

工具类

读取redis那块自己改哦

package cn.daenx.myadmin.common.utils;

import cn.daenx.myadmin.common.constant.RedisConstant;
import cn.daenx.myadmin.system.constant.SystemConstant;
import cn.daenx.myadmin.system.po.SysConfig;
import cn.daenx.myadmin.system.vo.system.DingTalkSendResult;
import cn.daenx.myadmin.system.vo.system.SysDingTalkConfigVo;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.codec.binary.Base64; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder; /**
* 钉钉群通知工具类
*
* @author DaenMax
*/
public class DingTalkUtil { /**
* 发送钉钉群通知
* text类型,如果需要其他消息类型,请自己组装报文,然后调用DingTalkSendResult方法
*
* @param msg 消息内容
* @return
*/
public static DingTalkSendResult sendTalk(String msg) {
SysDingTalkConfigVo sysSmsConfigVo = getSysSmsConfigVo();
JSONObject req = new JSONObject();
req.put("msgtype", "text");
JSONObject text = new JSONObject();
text.put("content", ObjectUtil.isEmpty(sysSmsConfigVo.getKeywords()) ? msg : sysSmsConfigVo.getKeywords() + msg);
req.put("text", text);
return sendMsg(sysSmsConfigVo, req.toJSONString());
} /**
* 发送钉钉群通知
* 自己组装报文,以便实现更多消息类型
*
* @param content JSON格式的数据
* @return
*/
public static DingTalkSendResult sendTalkContent(String content) {
SysDingTalkConfigVo sysSmsConfigVo = getSysSmsConfigVo();
return sendMsg(sysSmsConfigVo, content);
} /**
* 发送钉钉群通知_实际算法
*
* @param sysSmsConfigVo
* @param content
* @return
*/
private static DingTalkSendResult sendMsg(SysDingTalkConfigVo sysSmsConfigVo, String content) {
if (ObjectUtil.isEmpty(sysSmsConfigVo)) {
return new DingTalkSendResult(false, 9999, "系统钉钉通知配置不可用");
}
String sign = "";
if (ObjectUtil.isNotEmpty(sysSmsConfigVo.getSecret())) {
try {
sign = getSign(sysSmsConfigVo.getSecret());
} catch (Exception e) {
return new DingTalkSendResult(false, 9999, "计算签名失败");
}
}
String url = "https://oapi.dingtalk.com/robot/send?access_token=" + sysSmsConfigVo.getAccessToken() + sign;
String body = HttpRequest.post(url).header("Content-Type", "application/json").body(content).execute().body();
if (ObjectUtil.isEmpty(body)) {
return new DingTalkSendResult(false, 9999, "请求接收为空");
}
JSONObject jsonObject = JSONObject.parseObject(body);
Integer errcode = jsonObject.getInteger("errcode");
if (errcode == 0) {
return new DingTalkSendResult(true, errcode, jsonObject.getString("errmsg"));
}
return new DingTalkSendResult(false, errcode, jsonObject.getString("errmsg"));
} /**
* 加签模式下,计算签名
*
* @param secret
* @return
* @throws Exception
*/
private static String getSign(String secret) throws Exception {
Long timestamp = System.currentTimeMillis();
String stringToSign = timestamp + "\n" + secret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
return "&sign=" + sign + "&timestamp=" + timestamp;
} /**
* 从redis里获取系统钉钉通知配置
* 不存在或者被禁用或者数量为0返回null
*
* @return
*/
private static SysDingTalkConfigVo getSysSmsConfigVo() {
Object object = RedisUtil.getValue(RedisConstant.CONFIG + "sys.dingTalk.config");
if (ObjectUtil.isEmpty(object)) {
return null;
}
SysConfig sysConfig = JSON.parseObject(JSON.toJSONString(object), SysConfig.class);
if (!sysConfig.getStatus().equals(SystemConstant.STATUS_NORMAL)) {
return null;
}
SysDingTalkConfigVo sysDingTalkConfigVo = JSONObject.parseObject(sysConfig.getValue(), SysDingTalkConfigVo.class);
return sysDingTalkConfigVo;
} }

实体类

SysDingTalkConfigVo

package cn.daenx.myadmin.system.vo.system;

import lombok.AllArgsConstructor;
import lombok.Data; import java.io.Serializable; /**
* 系统钉钉通知配置
*/
@Data
@AllArgsConstructor
public class SysDingTalkConfigVo implements Serializable { /**
* 如果启用了关键词,那么需要填写此参数,会直接拼接在消息前面
*/
private String keywords; /**
* 如果启用了加签,那么需要填写此参数
*/
private String secret; /**
* WEBHOOK连接里的参数,必填
*/
private String accessToken; /**
* 仅仅是备注,无其他作用
*/
private String remark;
}

DingTalkSendResult

package cn.daenx.myadmin.system.vo.system;

import lombok.AllArgsConstructor;
import lombok.Data; @Data
@AllArgsConstructor
public class DingTalkSendResult {
/**
* 是否成功
*/
private boolean isSuccess;
/**
* 钉钉返回的
*/
private Integer code;
/**
* 钉钉返回的
*/
private String msg;
}

java 钉钉群机器人发消息通知工具类的更多相关文章

  1. 钉钉机器人SDK 封装预警消息发送工具

    1 群机器人     (1) 引言     钉钉聊天群内支持的群机器人, 类似QQ 群机器人, 可以发天气, 讲笑话那样;     钉钉群机器人支持自定义机器人, 允许开发者管理机器人做预警消息通知; ...

  2. Java匹马行天下之JavaSE核心技术——工具类

    Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...

  3. Java并发(十六):并发工具类——Exchanger

    Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...

  4. Java并发(十五):并发工具类——信号量Semaphore

    先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...

  5. Java并发(十四):并发工具类——CountDownLatch

    先做总结: 1.CountDownLatch 是什么? CountDownLatch 允许一个或多个线程等待其他线程(不一定是线程,某个操作)完成之后再执行. CountDownLatch的构造函数接 ...

  6. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  7. Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable

    Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...

  8. Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明

    Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明 每博一文案 别把人生,输给心情 师父说:心情不是人生的全部,却能左右人生的全部. 你有没有体会到,当你心情好的时 ...

  9. 利用Redis发布订阅完成tomcat集群下的消息通知

    以下为个人想法,如果有说的不对的地方请各位大佬见谅! 这是博主的第一篇博客,可能排版以及一些描述有不合理的地方还请勿喷,希望大家尽可能的多给我这样的新人一些鼓励让我能在写博客的道路上走下去. 进入正题 ...

  10. 翻翻git之---一个丰富的通知工具类 NotifyUtil

    转载请注明出处王亟亟的大牛之路 P1(废话板块.今天还加了个小广告) 昨天出去浪,到家把麦麦当当放出来玩一会就整到了12点多..早上睡过头了. .简直心酸. ... 近期手头上有一些职位能够操作,然后 ...

随机推荐

  1. 痞子衡嵌入式:了解主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制. 在痞子衡旧文 <RT四位数Boot模式> 里的 1.2 ...

  2. 错误修正记录: [Vivado 12-8300] Launch HLS failed! Please see vitis_hls.log for details.

    起因 使用了Vivado Video Frame Buffer Read和Vivado Video Frame Buffer Write,按out of context模式综合失败.vivado版本2 ...

  3. hexo 本地启动项目 hexo-browsersync 不工作原因总结

    问题 1 : hexo-server 开启 compress 压缩后 hexo-browsersync 插件热更新完全无效,没办法自动刷新 此问题表现在 hexo 任何版本 问题原因: hexo-se ...

  4. PHP的回调函数

    所谓的回调函数,就是指调用函数时并不是向函数中传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中,这个作为参数的函数就是回调函数.通俗的来说,回调函数也是一个我们定义的函数,但是不 ...

  5. .NET 中的 Swagger 文档排序设置

    Swagger的API默认排序往往达不到效果,甚至设置了Action排序也没有作用.这里直接给出代码,关键在于 IDocumentFilter 实现. 注意 DocumentFilter 注册要放在尾 ...

  6. [每日算法] leetcode第2题:两数相加

    leetcode第2题入口 题目描述 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表 ...

  7. 【Java】各种代码块的执行顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行. 执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public ...

  8. CH390使用注意事项

    关于CH390使用注意事项 CH390替换DM90xx硬件注意事项 1.CH390L替换DM9000 AVDD33的对地电容建议1uF贴近芯片放置,42脚为主电源AVDD33需10uF并联0.1uF. ...

  9. day11”函数“入门

    函数 函数的作⽤ 函数的使⽤步骤 函数的参数作⽤ 函数的返回值作⽤ 函数的说明⽂档 函数嵌套 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利 ...

  10. MySql随笔记基础

    XAMPP使用 shell 命令 每个数据库对应 一个子文件夹 mysql 进入mySQL的命令 -uroot userroot 登录用户 -uroot -p password 登录密码 -p123 ...