应用系统在碰到运行异常等情况时,发送预警消息@群内相关人员,可以及时发出问题,观察对问题的响应情况
1. 创建一个群(可以是公司内部群)
2. 添加机器人
自定义机器人安全设置: https://open.dingtalk.com/document/robots/customize-robot-security-settings
设置说明:https://open.dingtalk.com/document/org/application-types
{ "at": { "atMobiles":[ "手机号" ], "atUserIds":[ "" ], "isAtAll": false }, "text": { "content":"【业务报警】接口发生异常,请及时处理,如果加了自定义关键词,内容必须包括关键词,消息才能发出" }, "msgtype":"text" }
https://open.dingtalk.com/document/robots/push-message
https://open.dingtalk.com/document/group/custom-robot-access
https://open.dingtalk.com/document/resourcedownload/download-server-sdk
DT研究院 https://gitee.com/dt_research_institute
代码实现:
package com.vipsoft.dingtalk.rpc; import com.vipsoft.dingtalk.entity.dingtalk.request.RobotMessage; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; import java.util.Map; /** * 需要在启动项中添加 @EnableFeignClients(basePackages = {"com.vipsoft"}) */ @FeignClient(name = "vipsoft-dingtalk", url = "${dingtalk.rebot-url}") public interface IDingtalkService { /** * 发送预警信息 * SendSmsInfo.TemplateParam = 文本 * @return */ @PostMapping(value = "/robot/send") String sendMessage(@RequestParam Map<String, Object> headerParam, @RequestBody RobotMessage param); }
RobotMessage
package com.vipsoft.dingtalk.entity.dingtalk.request; import java.io.Serializable; public class RobotMessage implements Serializable { private String msgtype; private RobotAtInfo at; private RobotContentInfo text; public String getMsgtype() { return msgtype; } public void setMsgtype(String msgtype) { this.msgtype = msgtype; } public RobotAtInfo getAt() { return at; } public void setAt(RobotAtInfo at) { this.at = at; } public RobotContentInfo getText() { return text; } public void setText(RobotContentInfo text) { this.text = text; } }
RobotAtInfo
package com.vipsoft.dingtalk.entity.dingtalk.request; import java.io.Serializable; import java.util.List; public class RobotAtInfo implements Serializable { private List<String> atMobiles; public List<String> getAtMobiles() { return atMobiles; } public void setAtMobiles(List<String> atMobiles) { this.atMobiles = atMobiles; } }
RobotContentInfo
package com.vipsoft.dingtalk.entity.dingtalk.request; import java.io.Serializable; public class RobotContentInfo implements Serializable { private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
Test
@SpringBootTest class VipsoftDingTalkTests { Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired IDingtalkService dingtalkService; @Test void sendMessage() { String result = ""; Long timestamp = System.currentTimeMillis(); List<String> phoneNoList = new ArrayList<>(); String[] phoneNoStr = "25988888888,35988888888".split(","); for (String phoneNo : phoneNoStr) { phoneNoList.add(phoneNo); } String content = "【业务预警】 调用开放平台,推送消息接口异常"; if (ObjectUtil.isNotEmpty(phoneNoList)) { Map<String, Object> map = new HashMap<>(); map.put("access_token", "2471310a60b56329c47c0e5f202af16b89XXXXXXXXXXXXXXXXXX"); map.put("timestamp", timestamp); map.put("sign", sign(timestamp)); RobotAtInfo atInfo=new RobotAtInfo(); atInfo.setAtMobiles(phoneNoList); RobotContentInfo contentInfo=new RobotContentInfo(); contentInfo.setContent(content); RobotMessage param=new RobotMessage(); param.setMsgtype("text"); param.setAt(atInfo); param.setText(contentInfo); result = dingtalkService.sendMessage(map, param); } logger.info(result); } public String sign(Long timestamp) { try { String appSecret = "SECfd5138XXXXXXXXXXXXXXXXXXXXXXXX"; String stringToSign = timestamp + "\n" + appSecret; Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(appSecret.getBytes("UTF-8"), "HmacSHA256")); byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); return new String(Base64.encodeBase64(signData)); } catch (Exception ex) { return ""; } } }