Anne Han

看见更大的世界,遇见更好的自己。

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&timestamp=XXX&sign=XXX
19         String dingUrl = "https://oapi.dingtalk.com/robot/send?access_token=" + robotToken + "&timestamp=" + 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     }    

      三、效果图

      

 

 

官方链接:

      添加自定义机器人

      自定义机器人安全设置

 

posted @ 2021-11-03 14:06  AnneHan  阅读(2328)  评论(0编辑  收藏  举报