JAVA微信公众号通过openid发送模板消息~ - 七号房子

时间:2024-01-22 13:49:05

1,问题产生

 在微信公众号开发过程中,我们有时候做不同权限的时候,比如在注册的时候,需要审核,然后我们要想办法让对方知道审核的结果。这时候我们可以通过模板消息来通知。

2,第一步,首先在微信公众号上获取模板消息

首先,登录微信公众平台,看有没有模板消息这一块,没有的话点击添加功能插件,去添加,这里就省略不说了,这个主要就是选择你公众号的行业对应的模板消息,然后通过审核之后就可以使用了,说是几个工作日

但是一般很快就审核通过的。

有模板消息之后点进来,对应自己所需要的模板消息进行添加,比如,我添加了一个审核的模板,在模板使用介绍上面其实也是没说的很清楚,我看了感觉完全就是不会用,就是给你个数据类型,数据样式查看

好了,这些大概百度下了解是什么意思,我们现在主要还是上代码部分吧。

3,用JAVA代码实现通过openid发送模板消息

(一)首先我们先上一个工具类

  

  1 import java.io.BufferedReader;
  2 import java.io.InputStream;
  3 import java.io.InputStreamReader;
  4 import java.io.OutputStream;
  5 import java.net.ConnectException;
  6 import java.net.URL;
  7 
  8 import javax.net.ssl.HttpsURLConnection;
  9 import javax.net.ssl.SSLContext;
 10 import javax.net.ssl.SSLSocketFactory;
 11 import javax.net.ssl.TrustManager;
 12 
 13 import net.sf.json.JSONException;
 14 import net.sf.json.JSONObject;
 15 
 16 import org.slf4j.Logger;
 17 import org.slf4j.LoggerFactory;
 18 
 19 import com.mj.agriculturalByProduct.templatemessage.pojo.Token;
 20 import com.mj.templatemessage.util.MyX509TrustManager;
 21 
 22 public class CommonUtil {
 23     
 24 private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
 25     
 26     // 凭证获取(GET)
 27     public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
 28     
 29     /**
 30      * 发送 https 请求
 31      * 
 32      * @param requestUrl 请求地址
 33      * @param requestMethod 请求方式(GET、POST)
 34      * @param outputStr 提交的数据
 35      * @return JSONObject(通过 JSONObject.get(key) 的方式获取 JSON 对象的属性值)
 36      */
 37     public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
 38         
 39         JSONObject jsonObject = null;
 40         
 41         try {
 42             // 创建 SSLContext 对象,并使用我们指定的信任管理器初始化
 43             TrustManager[] tm = { new MyX509TrustManager() };
 44             SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
 45             sslContext.init(null, tm, new java.security.SecureRandom());
 46             // 从上述 SSLContext 对象中得到 SSLSocketFactory 对象
 47             SSLSocketFactory ssf = sslContext.getSocketFactory();
 48             
 49             URL url = new URL(requestUrl);
 50             HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
 51             conn.setSSLSocketFactory(ssf);
 52             
 53             conn.setDoOutput(true);
 54             conn.setDoInput(true);
 55             conn.setUseCaches(false);
 56             
 57             // 设置请求方式(GET/POST)
 58             conn.setRequestMethod(requestMethod);
 59             
 60             // 当 outputStr 不为 null 时,向输出流写数据
 61             if (null != outputStr) {
 62                 OutputStream outputStream = conn.getOutputStream();
 63                 
 64                 // 注意编码格式
 65                 outputStream.write(outputStr.getBytes("UTF-8"));
 66                 outputStream.close();
 67             }
 68             
 69             // 从输入流读取返回内容
 70             InputStream inputStream = conn.getInputStream();
 71             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
 72             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 73             String str = null;
 74             StringBuffer buffer = new StringBuffer();
 75             
 76             while ((str = bufferedReader.readLine()) != null) {
 77                 buffer.append(str);
 78             }
 79             
 80             // 释放资源
 81             bufferedReader.close();
 82             inputStreamReader.close();
 83             inputStream.close();
 84             inputStream = null;
 85             conn.disconnect();
 86             jsonObject = JSONObject.fromObject(buffer.toString());
 87         } catch (ConnectException ce) {
 88             log.error(" 连接超时:{}", ce);
 89         } catch (Exception e) {
 90             log.error("https 请求异常:{}", e);
 91         }
 92         
 93         return jsonObject;
 94     }
 95 
 96     /**
 97      * 获取接口访问凭证
 98      * 
 99      * @param appid 凭证
100      * @param appsecret 密钥
101      * @return
102      */
103     public static Token getToken(String appid, String appsecret) {
104         Token token = null;
105         String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
106         // 发起GET请求获取凭证
107         JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
108 
109         if (null != jsonObject) {
110             try {
111                 token = new Token();
112                 token.setAccessToken(jsonObject.getString("access_token"));
113                 token.setExpiresIn(jsonObject.getInt("expires_in"));
114                 System.out.println(jsonObject.getString("access_token")+"=========");
115             } catch (JSONException e) {
116                 token = null;
117                 // 获取token失败
118                 log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
119             }
120         }
121         return token;
122     }
123 
124 }





public class Token {

//接口访问凭证
private String accessToken;
//接口有效期,单位:秒
private int expiresIn;

public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}

}

 

(二)一个模板消息类

  

 1 import java.text.SimpleDateFormat;
 2 import java.util.Date;
 3 
 4 import net.sf.json.JSONObject;
 5 
 6 import org.slf4j.Logger;
 7 import org.slf4j.LoggerFactory;
 8 import org.springframework.stereotype.Service;
 9 
10 import com.mj.agriculturalByProduct.templatemessage.pojo.Data;
11 import com.mj.agriculturalByProduct.templatemessage.pojo.Data_style;
12 import com.mj.agriculturalByProduct.templatemessage.pojo.NewOrdersTemplate;
13 import com.mj.agriculturalByProduct.templatemessage.pojo.Token;
14 import com.mj.basic.util.TTResult;
15 @Service
16 public class Template {
17     
18     private static Logger log = LoggerFactory.getLogger(Template.class);
19 
20        /**
21         * 发送模板消息
22         * appId 公众账号的唯一标识
23         * appSecret 公众账号的密钥
24         * openId 用户标识
25      * @return 
26         */
27        public TTResult send_template_message(String appId, String appSecret, String openId) {
28     //因为我申请的模板是需要填写当前时间戳的,所以在这里我获取了当前的时间
29           SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-HH-MM");
30           String format = simpleDateFormat.format(new Date());
31           Token token = CommonUtil.getToken(appId, appSecret);//这里要注意,如果你是申请的正式公众号的话,获取token的时候,一定要在后台加上你的ip,不然获取token的时候会报错
32           String access_token = token.getAccessToken();
33           String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+access_token;
34           String templateId = "填写你所使用的模板id";
35           String goUrl = "填写接收模板消息之后,你想要跳转的url页面。";
36 
37           Data_style first = new Data_style();
38           Data_style keyword1 = new Data_style();
39           Data_style keyword2 = new Data_style();
40           Data_style remark = new Data_style();
41 
42           NewOrdersTemplate temp = new NewOrdersTemplate();
43           Data data = new Data();
44 
45           first.setValue(format);
46           first.setColor("#173177");
47 
48           keyword1.setValue("您申请的审核已通过,请到PC端浏览器输入以下链接进行管理后台的设置:(这些都是自定义内容)"
49                   + "自定义内容");
50           keyword1.setColor("#173177");
51 
52           keyword2.setValue(format);
53           keyword2.setColor("#173177");
54 
55           remark.setValue("");
56           remark.setColor("#173177");
57 
58           data.setFirst(first);
59           data.setKeyword1(keyword1);
60           data.setKeyword2(keyword2);
61           data.setRemark(remark);
62 
63           temp.setTouser(openId);
64           temp.setTemplate_id(templateId);
65           temp.setUrl(goUrl);
66           temp.setTopcolor("#173177");
67           temp.setData(data);
68 
69           String jsonString = JSONObject.fromObject(temp).toString().replace("day", "Day");
70           JSONObject jsonObject = CommonUtil.httpsRequest(url, "POST", jsonString);
71           System.out.println(jsonObject);
72           int result = 0;
73           if (null != jsonObject) {  
74              if (0 != jsonObject.getInt("errcode")) {  
75                 result = jsonObject.getInt("errcode");  
76                 log.error("错误 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));  
77              }  
78           }
79           log.info("模板消息发送结果:"+result);
80         return TTResult.ok();
81        }
}
https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=1244423508&lang=zh_CN 这个是模板消息接口文档地址。
上面的
Data_style first = new Data_style();
Data_style keyword1 = new Data_style();
Data_style keyword2 = new Data_style();
Data_style remark = new Data_style();
根据你实际的模板消息的参数个数添加修改。我这里是两个参数的模板。

 

(三)controller层接口

 1 @Controller
 2 public class TemplateController {
 3     
 4     @Autowired
 5     private Template template;
 6     
 7     /**
 8      * @param openid
 9      * @param request
10      * @return
11      */
12     @RequestMapping("/template/adopt")
13     public @ResponseBody TTResult test(String openid,HttpServletRequest request){
14         try {
15             return template.send_template_message("你的APPID", "APPID对应的秘钥", openid);
16 //openid  你想发送给你公众号上的人    这个openid获取方法下次写,到这一步的话openid应该早就获取过了吧。
17         } catch (Exception e) {
18             // TODO: handle exception
19         }
20         return TTResult.fail();
21     }
22 这个TTresult的话就是一个返回值的一个参数说明  这个大家的定义都不一样,这个无所谓的  就是  200成功   500失败   之类的  自定义code

 (4)问我还是把我的TTresult贴出来吧

  1 import java.util.List;
  2 import com.fasterxml.jackson.databind.JsonNode;
  3 import com.fasterxml.jackson.databind.ObjectMapper;
  4 
  5 public class TTResult {
  6     // 定义jackson对象
  7     private static final ObjectMapper MAPPER = new ObjectMapper();
  8 
  9     // 响应业务状态
 10     private Integer status;  // 200 代表成功, 500 代表失败
 11 
 12     // 响应消息
 13     private String msg;
 14 
 15     // 响应中的数据
 16     private Object data;
 17 
 18     public static TTResult build(Integer status, String msg, Object data) {
 19         return new TTResult(status, msg, data);
 20     }
 21 
 22     public static TTResult ok(Object data) {
 23         return new TTResult(data);
 24     }
 25     
 26     
 27     public static TTResult ok() {
 28         return new TTResult(null);
 29     }
 30 
 31     public static TTResult fail(){
 32         return new TTResult(500,"fail",null);
 33     }
 34     
 35     public static TTResult fail(Object data){
 36         return new TTResult(500,"fail",data);
 37     }
 38     
 39     public TTResult() {
 40 
 41     }
 42 
 43     public static TTResult build(Integer status, String msg) {
 44         return new TTResult(status, msg, null);
 45     }
 46     
 47     public TTResult(Integer status, String msg, Object data) {
 48         this.status = status;
 49         this.msg = msg;
 50         this.data = data;
 51     }
 52 
 53     public TTResult(Object data) {
 54         this.status = 200;
 55         this.msg = "OK";
 56         this.data = data;
 57     }
 58     
 59 
 60     // public Boolean isOK() {
 61     // return this.status == 200;
 62     // }
 63 
 64     public Integer getStatus() {
 65         return status;
 66     }
 67 
 68     public void setStatus(Integer status) {
 69         this.status = status;
 70     }
 71 
 72     public String getMsg() {
 73         return msg;
 74     }
 75 
 76     public void setMsg(String msg) {
 77         this.msg = msg;
 78     }
 79 
 80     public Object getData() {
 81         return data;
 82     }
 83 
 84     public void setData(Object data) {
 85         this.data = data;
 86     }
 87 
 88     /**
 89      * 将json结果集转化为TTResult对象
 90      * 
 91      * @param jsonData
 92      *            json数据
 93      * @param clazz
 94      *            TTResult中的object类型
 95      * @return
 96      */
 97     public static TTResult formatToPojo(String jsonData, Class<?> clazz) {
 98         try {
 99             if (clazz == null) {
100                 return MAPPER.readValue(jsonData, TTResult.class);
101             }
102             JsonNode jsonNode = MAPPER.readTree(jsonData);
103             JsonNode data = jsonNode.get("data");
104             Object obj = null;
105             if (clazz != null) {
106                 if (data.isObject()) {
107                     obj = MAPPER.readValue(data.traverse(), clazz);
108                 } else if (data.isTextual() || data.isNumber()) {
109                     obj = MAPPER.readValue(data.asText(), clazz);
110                 }
111             }
112             return build(jsonNode.get("status").intValue(), jsonNode.get("msg")
113                     .asText(), obj);
114         } catch (Exception e) {
115             return null;
116         }
117     }
118 
119     /**
120      * 没有object对象的转化
121      * 
122      * @param json
123      * @return
124      */
125     public static TTResult format(String json) {
126         try {
127             return MAPPER.readValue(json, TTResult.class);
128         } catch (Exception e) {
129             e.printStackTrace();
130         }
131         return null;
132     }
133 
134     /**
135      * Object是集合转化
136      * 
137      * @param jsonData
138      *            json数据
139      * @param clazz
140      *            集合中的类型
141      * @return
142      */
143     public static TTResult formatToList(String jsonData, Class<?> clazz) {
144         try {
145             JsonNode jsonNode = MAPPER.readTree(jsonData);
146             JsonNode data = jsonNode.get("data");
147             Object obj = null;
148             if (data.isArray() && data.size() > 0) {
149                 obj = MAPPER.readValue(data.traverse(), MAPPER.getTypeFactory()
150                         .constructCollectionType(List.class, clazz));
151             }
152             return build(jsonNode.get("status").intValue(), jsonNode.get("msg")
153                     .asText(), obj);
154         } catch (Exception e) {
155             return null;
156         }
157     }
158 }

 

MyX509TrustManager 工具类

 

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

/** 
 * 信任管理器 
 * 
 */  
public class MyX509TrustManager implements X509TrustManager {  
  
    @Override  
    public void checkClientTrusted(X509Certificate[] arg0, String arg1)  
            throws CertificateException {  
  
    }  
  
    @Override  
    public void checkServerTrusted(X509Certificate[] arg0, String arg1)  
            throws CertificateException {  
  
    }  
  
    @Override  
    public X509Certificate[] getAcceptedIssuers() {  
        return null;  
    }  
  
}  

 

 还有上面所用到的一些类,接口

public class Data_style {
	
	private String value;

    private String color;

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

  

public class Data {
    
    private Data_style first;

    private Data_style keyword1;

    private Data_style keyword2;
    
    private Data_style remark;

   public Data_style getFirst() {
      return first;
   }

   public void setFirst(Data_style first) {
      this.first = first;
   }

   public Data_style getKeyword1() {
      return keyword1;
   }

   public void setKeyword1(Data_style keyword1) {
      this.keyword1 = keyword1;
   }

   public Data_style getKeyword2() {
      return keyword2;
   }

   public void setKeyword2(Data_style keyword2) {
      this.keyword2 = keyword2;
   }

   public Data_style getRemark() {
      return remark;
   }

   public void setRemark(Data_style remark) {
      this.remark = remark;
   }
}
public class NewOrdersTemplate {
    
    private String touser; //用户OpenID
    
    private String template_id; //模板消息ID
    
    private String url; //URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
    
    private String topcolor; //标题颜色
    
    private Data data; //详细内容

    public String getTouser() {
        return touser;
    }

    public void setTouser(String touser) {
        this.touser = touser;
    }

    public String getTemplate_id() {
        return template_id;
    }

    public void setTemplate_id(String templateId) {
        template_id = 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 Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

}
public class Token {
    
    //接口访问凭证
    private String accessToken;
    //接口有效期,单位:秒
    private int expiresIn;
    
    public String getAccessToken() {
        return accessToken;
    }
    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
    public int getExpiresIn() {
        return expiresIn;
    }
    public void setExpiresIn(int expiresIn) {
        this.expiresIn = expiresIn;
    }

}

 

4,测试结果

 

方法二:

不详细说明了,直接贴代码吧

import java.util.List;

public class Template {  
      
    // 消息接收方  
    private String toUser;  
    // 模板id  
    private String templateId;  
    // 模板消息详情链接  
    private String url;  
    // 消息顶部的颜色  
    private String topColor;  
    // 参数列表  
    private List<TemplateParam> templateParamList;  
    //省略getter、setter方法
    
    //按微信接口要求格式化模板
    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 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 List<TemplateParam> getTemplateParamList() {
        return templateParamList;
    }

    public void setTemplateParamList(List<TemplateParam> templateParamList) {
        this.templateParamList = templateParamList;
    }  
}
import java.io.BufferedReader;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.OutputStream;  
import java.io.UnsupportedEncodingException;  
import java.net.ConnectException;  
import java.net.HttpURLConnection;  
import java.net.URL;  
  
import javax.net.ssl.HttpsURLConnection;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.SSLSocketFactory;  
import javax.net.ssl.TrustManager;

import net.sf.json.JSONObject;  
  
public class CommonUtil {  
      
    public static JSONObject httpsRequest(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 ce) {    
            ce.printStackTrace();  
        } catch (Exception e) {    
            e.printStackTrace();  
        }    
        return jsonObject;    
    }  
      
    public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {   
          
          
        StringBuffer buffer = new StringBuffer();    
        try {    
            
    
            URL url = new URL(requestUrl);    
            HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();    
             
    
            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 ce) {    
            ce.printStackTrace();  
        } catch (Exception e) {    
            e.printStackTrace();  
        }    
        return buffer.toString();    
    }  
    public static String urlEncodeUTF8(String source){  
        String result = source;  
        try {  
            result = java.net.URLEncoder.encode(source,"utf-8");  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
        return result;  
    }  
      
    public static String httpsRequestForStr(String requestUrl, String requestMethod, String outputStr) {   
          
        String result="";  
        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();    
            result=buffer.toString();    
        } catch (ConnectException ce) {    
            ce.printStackTrace();  
        } catch (Exception e) {    
            e.printStackTrace();  
        }    
        return result;    
    }  
}  
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;  
    }  
      
      
  
}  
public interface TemplateMessageService {

    /**
     * 
     * @param inform
     * @param defeated
     * @param instructions
     * @param createds
     * @param request
     */
     boolean sendMessage(String openid,String title,String defeated,
                String instructions,HttpServletRequest request);
}
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Service;

import com.mj.agriculturalByProduct.templatemessage.pojo.Template;
import com.mj.agriculturalByProduct.templatemessage.pojo.TemplateParam;
import com.mj.templatemessage.util.CommonUtil;

import net.sf.json.JSONObject;
@Service
public class TemplateMessageServiceImpl implements TemplateMessageService{

    /**
     * 处理要通知的数据(完善模板消息)
     */
    @Override
    public boolean sendMessage(String openid,String title, String defeated, String instructions,
            HttpServletRequest request) {
        Template tem=new Template();  
        tem.setTemplateId("模板消息id");
        tem.setTopColor("#00DD00");//颜色
        tem.setToUser(openid);//接收方ID
        System.out.println(openid+"=====================");
        //设置超链接(点击模板可跳转相应链接中)
        tem.setUrl("你要跳转的链接");
        List<TemplateParam> paras=new ArrayList<TemplateParam>();//消息主体
        paras.add(new TemplateParam("first",title,"#333")); //标题 
        paras.add(new TemplateParam("keyword1",defeated,"#333"));//审核类型
        paras.add(new TemplateParam("keyword2",instructions,"#333"));//时间
//        paras.add(new TemplateParam("keyword3",createds,"#333"));
        paras.add(new TemplateParam("remark","点击此消息查看详情","#333"));  
        tem.setTemplateParamList(paras);  
        boolean result=sendTemplateMsg(tem);
        System.out.println(result);
        return result;
    }
    
    /**
     * 发送模板消息
     * @param template
     * @return
     */
     public static boolean sendTemplateMsg(Template template){  
           String token = getToken(template);
//           String token = "";
           boolean flag=false;   
            String requestUrl="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
                          
            requestUrl=requestUrl.replace("ACCESS_TOKEN", token);  
            String jsonString = template.toJSON();//把String拼接转为json类型
            JSONObject jsonResult=CommonUtil.httpsRequest(requestUrl, "POST", jsonString); 
            if(jsonResult!=null){  
                int errorCode=jsonResult.getInt("errcode");  
                String errorMessage=jsonResult.getString("errmsg");  
                if(errorCode==0){  
                    flag=true;  
                }else{  
                    System.out.println("模板消息发送失败:"+errorCode+","+errorMessage);
                    System.out.println(token+"================");
                    flag=false;  
                }  
            }
            return flag;          
        }  
     
     /**
         *获取token
         * @param template
         * @return
         */
        public static String getToken(Template template){  
            String requestUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid&secret=你的appid对应的秘钥";
            JSONObject jsonResult=CommonUtil.httpsRequest(requestUrl, "POST", template.toJSON());  
            if(jsonResult!=null){  
                String access_token=jsonResult.getString("access_token");
                return access_token;
            }else{  
                  return "";     
            }    
        }  
}

 

大概就是这样的,controller层根据上面方法一中类似的。这个自己根据service层的一些来写就好。

有啥不对的地方请指教,谢谢。

 

posted on 2018-12-20 11:40  七号房子  阅读(9690)  评论(4编辑  收藏  举报