刚开始做这个模板消息开发的时候参考了很多大神的博客,讲解的也是比较的详细,但是在工具类这一块都没有详细的说,因为开发的经验少,对这些常用的工具类不是很了解,所以走了很多的弯路,所以今天把整个的详细流程贴上来,给和我一样的初学者一个参考。
1 模板消息由于模板选取不同需要传入参数的名称、值、参数个数也不同首先要封装2个实体
package com.Model;
import java.util.List;
public class Template {
// 消息接收方
private String toUser;
// 模板id
private String templateId;
// 模板消息详情链接
private String url;
// 消息顶部的颜色
private String topColor;
// 参数列表
private List<TemplateParam> templateParamList;
public String getToUser() {
return toUser;
}
public void setToUser(String toUser) {
this.toUser = toUser;
}
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getTopColor() {
return topColor;
}
public void setTopColor(String topColor) {
this.topColor = topColor;
}
public String toJSON() {
StringBuffer buffer = new StringBuffer();
buffer.append("{");
buffer.append(String.format("\"touser\":\"%s\"", this.toUser)).append(",");
buffer.append(String.format("\"template_id\":\"%s\"", this.templateId)).append(",");
buffer.append(String.format("\"url\":\"%s\"", this.url)).append(",");
buffer.append(String.format("\"topcolor\":\"%s\"", this.topColor)).append(",");
buffer.append("\"data\":{");
TemplateParam param = null;
for (int i = 0; i < this.templateParamList.size(); i++) {
param = templateParamList.get(i);
// 判断是否追加逗号
if (i < this.templateParamList.size() - 1){
buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"},", param.getName(), param.getValue(), param.getColor()));
}else{
buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"}", param.getName(), param.getValue(), param.getColor()));
}
}
buffer.append("}");
buffer.append("}");
return buffer.toString();
}
public List<TemplateParam> getTemplateParamList() {
return templateParamList;
}
public void setTemplateParamList(List<TemplateParam> templateParamList) {
this.templateParamList = templateParamList;
}
}
这一块中最重要的是对数据的json处理,我也是完全拷贝的
package com.Model;
public class TemplateParam {
// 参数名称
private String name;
// 参数值
private String value;
// 颜色
private String color;
public TemplateParam(String name,String value,String color){
this.name=name;
this.value=value;
this.color=color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
2、这是消息发送的代码
public @ResponseBody Map<String, Object> classremind(HttpServletRequest request,Model model){
Map<String, Object> map=new HashMap<>();
Template tem=new Template();
tem.setTemplateId("");//消息模板的id
tem.setTopColor("#00DD00");
tem.setToUser(user.getOpenid());//接收人的openid
tem.setUrl("");
List<TemplateParam> paras=new ArrayList<TemplateParam>();
paras.add(new TemplateParam("first","消息内容","#FF3333"));
paras.add(new TemplateParam("keyword1","对应的模板中的消息","#0044BB"));
paras.add(new TemplateParam("keyword2","对应的模板的消息","#0044BB"));
paras.add(new TemplateParam("Remark","请准时收听直播课程!","#AAAAAA"));
tem.setTemplateParamList(paras);
String token=GlobalConstant.access_token;\\根据你们自己的方法获取token
String requestUrl="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
requestUrl=requestUrl.replace("ACCESS_TOKEN", token);
JSONObject jsonResult=Util.httpsRequest(requestUrl, "POST", tem.toJSON());
if(jsonResult!=null){
int errorCode=jsonResult.getInteger("errcode");
String errorMessage=jsonResult.getString("errmsg");
if(errorCode==0){
map.put("status",0);
}else{
log.info("模板消息发送失败:"+errorCode+","+errorMessage);
map.put("status", 1);
map.put("info", "提醒失败,请稍候再试!");
}
}
return map;
}
4、这一部分是我耗时最多的部分工具类
package com.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.yiwangjiankang.Controller.ZhiboController;
public class Util {
private static Logger log = LoggerFactory.getLogger(ZhiBoUtil.class);
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
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 conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当 outputStr 不为 null 时,向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = JSONObject.parseObject(buffer.toString());
} catch (ConnectException ce) {
log.error(" 连接超时:{}", ce);
} catch (Exception e) {
log.error("https 请求异常:{}", e);
}
return jsonObject;
}
}
\\这个MyX509TrustManager()是一个接口,自己必须添加一个实现类才可以直接使用,如下
class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
}
public X509Certificate[] getAcceptedIssuers()
{
return null;
}
}
完整的就是这样了,里面可能掺杂了一些我自己工程里面的代码,希望能对大家有所帮助!有问题也希望和大家多多交流