Java項目中集成釘釘機器人推送消息提醒
- 2021 年 11 月 3 日
- 筆記
- Spring Boot, 釘釘
前言:
項目中有一個需求,當有新訂單產生的時候,希望能夠及時通知到業務相關人員進行處理,整體考慮了一下,選用了釘釘機器人提醒功能(公司內部主要也是使用釘釘進行通訊)。
操作:
主要分為兩部分進行處理:
一、添加自定義機器人
首先新建一個群
步驟一:【電腦釘釘 】-【群聊】-【群設置】-【智慧群助手】-【添加更多】-【添加機器人】-【自定義】-【添加】,編輯機器人名稱和選擇添加的群組。完成必要的安全設置(至少選擇一種),勾選 我已閱讀並同意《自定義機器人服務及免責條款》,點擊「完成」即可。
(備註:安全設置方式,我選用的是加簽,密鑰要複製出來,後面要用到)
步驟二:複製出機器人的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×tamp=XXX&sign=XXX 19 String dingUrl = "//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 }
三、效果圖
官方鏈接: