前言:
项目中有一个需求,当有新订单产生的时候,希望能够及时通知到业务相关人员进行处理,整体考虑了一下,选用了钉钉机器人提醒功能(公司内部主要也是使用钉钉进行通讯)。
操作:
主要分为两部分进行处理:
一、添加自定义机器人
首先新建一个群
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。完成必要的安全设置(至少选择一种),勾选 我已阅读并同意《自定义机器人服务及免责条款》,点击“完成”即可。
(备注:安全设置方式,我选用的是加签,密钥要复制出来,后面要用到)
步骤二:复制出机器人的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×tamp=XXX&sign=XXX 19 String dingUrl = "https://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 }
三、效果图
官方链接:
添加自定义机器人
自定义机器人安全设置