sgj
17 小时以前 024dc397e65ed55d7addbaf6fb153ce3f2548a6c
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.fzzy.igds.utils;
 
import com.alibaba.fastjson.JSONObject;
import com.fzzy.igds.data.ConfigData;
import com.fzzy.igds.data.Template;
import com.fzzy.igds.data.TemplateParam;
import com.ruoyi.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
 
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
 
 
@Slf4j
@Component
public class WxUtil {
 
    /**
     * 公众号调用全局接口的标识ACCESS_TOKEN缓存key
     */
    public static final String ACCESS_TOKEN = "ACCESS_TOKEN";
 
    /**
     * 模板消息发送url
     */
    public static final String TEMPLATE_URL =
            "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
 
    /**
     * 获取access_token的接口地址(GET , 2000次/天)
     */
    public static final String ACCESS_TOKEN_URL =
            "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
 
    @Autowired
    private RestTemplate restTemplate;
 
    @Autowired
    private ConfigData configData;
 
    @Resource
    private RedisCache redisCache;
 
 
 
    /**
     * 发送模板消息
     * @param openid    用户openid
     * @param warnId    警告id
     * @param companyId 组织id
     * @param title     警告标题
     * @param keyword1  警告对象
     * @param keyword2  警告类型
     * @param keyword3  警告时间
     * @param keyword4  警告内容
     * @param remark    警告详情
     * @return
     */
    public boolean sendMessage(String openid, String warnId, String companyId, String title,
                               String keyword1, String keyword2, String keyword3,
                               String keyword4,String remark, String userName){
 
        Template tem = new Template();
        tem.setTemplate_id(configData.getWxTempId());
        tem.setTopcolor("#FF0000");
 
        tem.setTouser(openid);
        tem.setUrl(configData.getWxServeUrl() + "/wx/view-gateway?state=warn-detail1&id=" + warnId + "&companyId=" + companyId + "&userName=" + userName);
 
        Map<String, TemplateParam> params = new HashMap<>();
        params.put("first",new TemplateParam(title,"#173177"));
        //警告对象
        params.put("keyword1",new TemplateParam( keyword1, "#173177"));
        //警告类型
        params.put("keyword2",new TemplateParam( keyword2, "#173177"));
        //警告时间
        params.put("keyword3",new TemplateParam( keyword3, "#173177"));
        //警告内容
        params.put("keyword4",new TemplateParam( keyword4, "#173177"));
        params.put("remark",new TemplateParam( remark, "#173177"));
 
        tem.setData(params);
        log.debug("------微信通知开始推送------");
        //推送消息
        return sendTemplateMsg(tem);
    }
 
 
 
    /**
     * 推送模板消息
     *
     * @param template
     * @return
     */
    public boolean sendTemplateMsg(Template template) {
        //获取AccessToken
        String accessToken = getAccessToken();
        if(StringUtils.isEmpty(accessToken)){
            log.debug("------获取AccessToken失败------");
            return false;
        }
 
        boolean flag = false;
        String url = WxUtil.TEMPLATE_URL.replace("ACCESS_TOKEN",accessToken);
        String str = JSONObject.toJSONString(template);
        JSONObject jsonObject = doPost(url, str);
        if (jsonObject != null) {
            int errorCode = jsonObject.getIntValue("errcode");
            String errorMessage = jsonObject.getString("errmsg");
            if (errorCode == 0) {
                log.debug("推送微信消息成功:" + str);
                flag = true;
            } else {
                log.info("模板消息发送失败{},{}", errorCode, errorMessage);
                log.error("ACCESS_TOKEN:" + accessToken);
                flag = false;
            }
        }
 
        log.debug("推送微信消息失败!" );
        return flag;
    }
 
    /**
     * 获取全局AccessToken
     *
     * @return
     */
    public String getAccessToken() {
 
        //先从缓存获取,若不存在则通过接口获取
        String accessToken = (String)redisCache.getCacheObject(WxUtil.ACCESS_TOKEN);
        if(StringUtils.isNotEmpty(accessToken)){
            return accessToken;
        }
 
        //请求获取AccessToken的微信接口
        String resp = doGet(WxUtil.ACCESS_TOKEN_URL.replace("APPID",
                configData.getWxAppId()).replace("APPSECRET", configData.getWxSecret()));
        JSONObject json = JSONObject.parseObject(resp);
        if (json != null) {
            //获取accessToken
            accessToken = json.getString("access_token");
            //获取accessToken有效时长,为7200s
            int expiresIn = json.getIntValue("expires_in");
            //将accessToken存入缓存,有效时长为expiresIn,即2小时
            redisCache.setCacheObject(WxUtil.ACCESS_TOKEN, accessToken,expiresIn, TimeUnit.SECONDS);
            return accessToken;
        }
        log.error("获取access_token失败");
        return null;
    }
    /**
     * post请求
     * @param url
     * @param data
     * @return
     */
    public JSONObject doPost(String url, String data){
        ResponseEntity<JSONObject> jsonObject = restTemplate.postForEntity(url, data, JSONObject.class);
        return jsonObject.getBody();
    }
 
    /**
     * get请求
     *
     * @param url
     * @return
     */
    public String doGet(String url) {
        return restTemplate.getForObject(url, String.class);
    }
}