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 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 = restTemplate.postForEntity(url, data, JSONObject.class); return jsonObject.getBody(); } /** * get请求 * * @param url * @return */ public String doGet(String url) { return restTemplate.getForObject(url, String.class); } }