package com.dy.pipIrrGlobal.config; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiRobotSendRequest; import com.dingtalk.api.response.OapiRobotSendResponse; import com.taobao.api.ApiException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * @author ZhuBaoMin * @date 2024-07-31 9:20 * @LastEditTime 2024-07-31 9:20 * @Description 钉钉客户端工具类 */ @Slf4j @Component public class DingTalk { private static final String dingTalkConfigPriFix = "dingtalk"; private static final Map optionsMap = new HashMap(); class Option{ public Boolean enable ; public String robotUrl ; public String robotAccessToken ; public String secret ; public Boolean atAll ; public String mobile ; } /* @Value("${dingtalk.robot.url}") private String URL; @Value("${dingtalk.robot.access-token}") private String CUSTOM_ROBOT_TOKEN; @Value("${dingtalk.robot.secret}") private String SECRET; @Value("${dingtalk.at-all}") private Boolean AT_ALL; @Value("${dingtalk.mobile}") private String MOBILE; */ private Option getOptions(String orgTag, Environment env){ Option vo = null ; try{ vo = optionsMap.get(orgTag); if(vo == null){ vo = new Option(); String enableStr = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".enable"); if(enableStr != null && !enableStr.trim().equals("")){ vo.enable = Boolean.valueOf(enableStr); }else{ vo.enable = true ; } vo.robotUrl = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".robot.url"); vo.robotAccessToken = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".robot.access-token"); vo.secret = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".robot.secret"); String atAllStr = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".at-all"); if(atAllStr != null && !atAllStr.trim().equals("")){ vo.atAll = Boolean.valueOf(atAllStr); }else{ vo.atAll = true ; } vo.mobile = env.getProperty(dingTalkConfigPriFix + "." + orgTag + ".mobile"); optionsMap.put(orgTag, vo) ; } }catch (Exception e){ vo = null ; } return vo ; } /** * 向钉钉群发送消息 * @param orgTag * @param env * @param message */ public void sendMessage(String orgTag, Environment env, String message) { if(orgTag == null || orgTag.trim().equals("")){ log.error("钉钉发送消息异常,机构标签为空"); return; } if(env == null){ log.error("钉钉发送消息异常,Spring环境为空"); return; } if(message == null || message.trim().equals("")){ log.error("钉钉发送消息异常,消息为空"); return; } Option vo = this.getOptions(orgTag.trim(), env) ; if(vo == null){ log.error("钉钉发送消息异常,钉钉配置错误"); return; } if(vo.enable){ try { Long timestamp = System.currentTimeMillis() ; String stringToSign = timestamp + "\n" + vo.secret; Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(vo.secret.getBytes("UTF-8"), "HmacSHA256")); byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8"); //定义文本内容 OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); text.setContent(message); //定义 @对象 OapiRobotSendRequest.At at = new OapiRobotSendRequest.At(); if(vo.atAll) { at.setIsAtAll(true); }else { at.setAtMobiles(Collections.singletonList(vo.mobile)); } OapiRobotSendRequest req = new OapiRobotSendRequest(); //设置消息类型 req.setMsgtype("text"); req.setText(text); req.setAt(at); //sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 的错误信息 DingTalkClient client = new DefaultDingTalkClient( vo.robotUrl + "?sign=" + sign + "×tamp=" + timestamp); OapiRobotSendResponse rsp = client.execute(req, vo.robotAccessToken); log.info(rsp.getBody()); } catch (ApiException e) { log.error("钉钉发送消息异常", e); //e.printStackTrace(); } catch (UnsupportedEncodingException e) { log.error("钉钉发送消息异常", e); //e.printStackTrace(); } catch (NoSuchAlgorithmException e) { log.error("钉钉发送消息异常", e); //e.printStackTrace(); } catch (InvalidKeyException e) { log.error("钉钉发送消息异常", e); //e.printStackTrace(); } catch (Exception e){ log.error("钉钉发送消息异常", e); //e.printStackTrace(); } } } }