封装消息模板
public class WechatPram {
private String touser; //接收者openid
private String templateId; // 模板ID
private String url; //模板跳转链接(海外帐号没有跳转能力)
private String first;
private String keyword1;
private String keyword2;
private String remark;
public String getJsonData() {
//微信data参数对象
Map<String, Object> dataMap = new HashMap<>();
Map<String, Object> firstMap = new HashMap<>();
firstMap.put("value", first);
firstMap.put("color","#173177");
Map<String, Object> key1Map = new HashMap<>();
key1Map.put("value", keyword1);
key1Map.put("color","#173177");
Map<String, Object> key2Map = new HashMap<>();
key2Map.put("value", keyword2);
key2Map.put("color", "#173177");
Map<String, Object> remarkMap = new HashMap<>();
remarkMap.put("value", remark);
remarkMap.put("color", "#173177");
dataMap.put("first", firstMap);
dataMap.put("keyword1", key1Map);
dataMap.put("keyword2", key2Map);
dataMap.put("remark", remarkMap);
Map<String, Object> jsonData = new HashMap<>();
//微信参数对象
jsonData.put("touser", touser);
jsonData.put("template_id", templateId);
jsonData.put("url",url);
jsonData.put("data", dataMap);
Gson gson = new Gson();
return gson.toJson(jsonData);
}
......省略get set方法
}
封装消息以及发送
//得到当前联系人的opedid
String openId = userWeixiGzhMapper.selectOpenId(str);
WechatPram wechatPram = new WechatPram();
wechatPram.setFirst("您好,");
wechatPram.setKeyword1(inquiryNo);
wechatPram.setKeyword2(matName);
wechatPram.setRemark("点击查看详情");
wechatPram.setTouser(openId); //用户的
if (MessageSendUtil.sendWechat(wechatPram, null, "inquiry")) {
return 500;
}
发送消息模板信息
/***
* 发送微信 模板信息
* @param pram
* @param wechatConfig
* @return
*/
public static boolean sendWechat(WechatPram pram, WechatConfig wechatConfig, String condition) {
//暂时默认走配置文件 开发 账号和密码
if (wechatConfig == null) wechatConfig = new WechatConfig();
wechatConfig.setAppid(ApplicationProperties.mt_wx_appid);//appid
wechatConfig.setSecret(ApplicationProperties.mt_wx_secret);//secret
if(StringUtils.isBlank(condition)){
pram.setTemplateId(ApplicationProperties.mt_wx_template);
}else{
pram.setTemplateId(ApplicationProperties.mt_wx_template_inquiry);
pram.setUrl(ApplicationProperties.inquiry_sup_feedback);
}
return WechatSendUtil.sendMsg(pram, wechatConfig);
}
发送微信消息
/**
* 发送模板信息接口
*/
private static final String SEND_MEG_TEMPLET = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
/***
* 发送微信消息
* @param pram 接口参数
* @param wechatConfig 微信配置对象
* @return
*/
public static boolean sendMsg(WechatPram pram, WechatConfig wechatConfig){
if(wechatConfig != null){
String token = WeixinUtil.getAccessTokenIsOverdue(wechatConfig.getAppid(),wechatConfig.getSecret());
if (token != null) {
JSONObject jsonObject = WeixinUtil.httpRequest(SEND_MEG_TEMPLET.replace("ACCESS_TOKEN", token), "POST", pram.getJsonData());
String data = pram.getJsonData();
if (0 == Integer.valueOf((String.valueOf(jsonObject.get("errcode"))))) {
return true;
}
logger.error("微信发送消息失败:" + jsonObject.toString());
}
return false;
}
logger.error("微信发送消息失败,没有配置微信 appid和Secret");
return false;
}
接收accessToken封装实体类
public class AccessToken {
//获得到的凭证
private String token;
//凭证有效期,单位:秒
private int expiresIn;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
获取accessToken
/**
* 获取accessToekn
*
* @param appid 凭证
* @param appsecret 密匙
* @return
*/
public static AccessToken getAccessToken(String appid, String appsecret) {
AccessToken accessToken = null;
String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);//获取Token的连接
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
// 如果请求成功
if (null != jsonObject) {
try {
accessToken = new AccessToken();
accessToken.setToken(jsonObject.getString("access_token"));
accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
} catch (JSONException e) {
accessToken = null;
// 获取token失败
String err = String.format("获取token失败 errcode: %s, errmsg: %s", jsonObject.getString("errcode"), jsonObject.getString("errmsg"));
//log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getString("errcode"), jsonObject.getString("errmsg"));
log.error(err);
//throw new IllegalArgumentException(err);
}
}
return accessToken;
}
把获取到的 token 存入redis
/**
* 把 token 存入redis
*
* @return
*/
public static String getAccessTokenIsOverdue(String appid, String secret) {
AccessToken accessToken = null;
String token = RedisUtil.getString(appid);
/* String token = redisTemplate.opsForValue().get(appid).toString();*/
if (token != null) {
return token;
} else {
accessToken = getAccessToken(appid, secret);
if (accessToken != null) {
token = accessToken.getToken();
RedisUtil.setString(appid, accessToken.getExpiresIn() - 5, token);
/*redisTemplate.opsForValue().set(appid, token, accessToken.getExpiresIn() - 5, TimeUnit.SECONDS);*/
}
}
return token;
}
发起https请求并获取结果
/**
* 发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(get、post)
* @param outputstr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
@SuppressWarnings("deprecation")
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputstr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
//创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
//从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
//设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod)) {
httpUrlConn.connect();
}
//当有数据提交时
if (null != outputstr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
//注意编码格式,防止中文乱码
outputStream.write(outputstr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
//释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException e) {
log.error("Weixin server connection timed out.");
} catch (Exception e) {
log.error("https request error:{}", e);
}
return jsonObject;
}