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);
|
}
|
}
|