• JAVA微信公众号通过openid发送模板消息~


    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层的一些来写就好。

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

     

  • 相关阅读:
    samba
    sed用法
    Jenkins流水线项目发布流程
    Jenkins
    CI/CD
    tomcat
    gitlab
    rsync
    HAPROXY
    基于LVS的web集群部署(http)
  • 原文地址:https://www.cnblogs.com/lxwt/p/10148422.html
Copyright © 2020-2023  润新知