zhubaomin
2025-04-14 4a2deb11b819dd78a8c75e244ef67ec2e48cf5f5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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<String, Option> 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 + "&timestamp=" + 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();
            }
        }
    }
}