Java项目中集成钉钉机器人推送消息提醒

前言:
项目中有一个需求,当有新订单产生的时候,希望能够及时通知到业务相关人员进行处理,整体考虑了一下,选用了钉钉机器人提醒功能(公司内部主要也是使用钉钉进行通讯)。

操作:
主要分为两部分进行处理:
一、添加自定义机器人 首先新建一个群
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。完成必要的安全设置(至少选择一种),勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”即可。
(备注:安全设置方式,我选用的是加签,密钥要复制出来,后面要用到)
Java项目中集成钉钉机器人推送消息提醒
文章图片



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



二、代码部分 主要分为两部分进行处理:
首先在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*/ 7public static String dingHmacSHA256(String timestamp, String secret) { 8try { 9String stringToSign = timestamp + "\n" + secret; 10Mac mac = Mac.getInstance("HmacSHA256"); 11mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); 12byte[] signData = https://www.it610.com/article/mac.doFinal(stringToSign.getBytes("UTF-8")); 13String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8"); 14return sign; 15} catch (Exception e) { 16log.error("dingHmacSHA256加密失败", e); 17} 18return null; 19}

业务代码
1@Value("${ding.robot.token}") 2private String robotToken; 3@Value("${ding.robot.key}") 4private String robotKey; 5 6@Autowired 7private RestTemplate restTemplate; 8 9/** 10* 推送钉钉机器人消息 11* @param type 12* @return 13*/ 14public String sendDingMsg(String type, String orderId, String serviceName) { 15String timestamp = String.valueOf(System.currentTimeMillis()); 16String sign = HmacSha256Util.dingHmacSHA256(timestamp, robotKey); 17// 钉钉机器人地址(配置机器人的webhook) 18// https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX 19String dingUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + robotToken + "×tamp=" + timestamp + "&sign=" + sign; 20 21//是否通知所有人 22boolean isAtAll = true; 23 24//通知具体人的手机号码列表 25List mobileList = Lists.newArrayList(); 26//mobileList.add("填入手机号,可以具体@到某个人"); 27//mobileList.add("13411111111"); 28 29//钉钉机器人消息内容 30String content = "【提醒】有一笔新的[" + serviceName + "]服务订单,订单号为" + orderId + ",请及时查看!"; 31//组装请求内容 32Map reqStr = buildReqStr(content, isAtAll, mobileList); 33return invokeGeneralApi(dingUrl, reqStr); 34} 35 36/** 37* 组装请求报文 38* @param content 39* @return 40*/ 41private Map buildReqStr(String content, boolean isAtAll, List mobileList) { 42//消息内容 43Map contentMap = Maps.newHashMap(); 44contentMap.put("content", content); 45 46//通知人 47Map atMap = Maps.newHashMap(); 48//1.是否通知所有人 49atMap.put("isAtAll", isAtAll); 50//2.通知具体人的手机号码列表 51atMap.put("atMobiles", mobileList); 52 53Map reqMap = Maps.newHashMap(); 54reqMap.put("msgtype", "text"); 55reqMap.put("text", contentMap); 56reqMap.put("at", atMap); 57 58return reqMap; 59} 60 61@Override 62public String invokeGeneralApi(String url, Map params) { 63String body = ""; 64try { 65HttpHeaders headers = new HttpHeaders(); 66headers.setContentType(MediaType.APPLICATION_JSON); 67HttpEntity httpEntity = new HttpEntity<>(params, headers); 68ResponseEntity entity = restTemplate.postForEntity(url, httpEntity, String.class); 69body = entity.getBody(); 70LOGGER.info("invokeGeneralApi()>>>[{}]", body); 71} catch (RestClientException e) { 72LOGGER.error("API调用错误,接口地址:[{}],请求参数:[{}]", url, params, e); 73} 74return body; 75}

三、效果图 Java项目中集成钉钉机器人推送消息提醒
文章图片



官方链接:
添加自定义机器人
自定义机器人安全设置
【Java项目中集成钉钉机器人推送消息提醒】

    推荐阅读