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

      三、效果圖

      

 

 

官方鏈接:

      添加自定義機器人

      自定義機器人安全設置