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 }

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

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

原文地址:https://www.cnblogs.com/lxwt/p/10148422.html

时间: 2024-10-04 09:35:00

JAVA微信公众号通过openid发送模板消息~的相关文章

.NET微信公众号开发-6.0模板消息

一.前言 为了保证用户不受到骚扰,在开发者出现需要主动提醒.通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒.通知消息.这个意思也就是,我们作为微信商户,不能主动的给用户推送消息,如果这个功能完全开放,那么用户有可能会受到大量的垃圾信息,为了做一个很好的控制,微信那边给我们开放了一个模板消息,通过模板消息我们可以友好的给用户发送一些相关的消息提醒. 二.开发前的准备 1.0模板消息官方文档地址 2.0查看我们的模板消息是否申请成功

微信公众号助手如何设置模板消息推送?

说到运营微信服务号,其目的自然是广告推广,通过微信关注粉丝获取商业价值,而广告推广的主要途径是模块链接实现价值的核心在于模板消息. 你想想如果看到一条关于"投资策略,消息提醒,预约通知"的消息,引起了客户的注意,点击量就高,而且纷纷留言服务很周到! A君:这是什么消息提醒? B君:服务号具有模板消息功能,推送的这条是模板消息. A君:有什么优势? B君:模板消息群发能够让信息第一时间送达客户手机,保障信息的及时性以及安全性. 使用鱼塘软件的模板消息群发,能够很好地跟踪.回访客户,聆听他

Java 微信公众号上传永久素材的方法

Java 微信公众号上传永久素材的方法 学习了:http://blog.csdn.net/u013791374/article/details/53258275 膜拜一下,源码如下: @RequestMapping(value="create") public String create(@RequestParam MultipartFile file, HttpServletRequest request, HttpServletResponse response, HttpSess

微信公众号开发(2)---消息的接收发送

在微信公众号开发(1)中,我们进行了GET请求方法的开发编写,能够使微信与我们的服务器进行了关系的绑定,接下来我们进行开发接收用户消息与一些事件的回复:      开发必要了解:在我们微信与我们的服务器进行了关系的绑定后,微信会将用户所发过来的消息以及事件会以XML的格式以POST请求的方式发送给我们的服务器,所以我们需要开发POST请求的接口,接收用户的消息,我们可以根据用户的消息进行一些关键字回复,以及关注后的回复推送,微信事件里有很多功能,这里只进行开发关键字回复以及关注事件,其他的顺藤摸

Java微信公众号开发----关键字自动回复消息

在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有(如图): 附上解析xml类的依赖: 1 <!-- dom对象读取写入xml文件 --> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId>dom4j</artifactId>

Java微信公众号开发

微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个web平台.微信公众账号的种类可以分为3种,并且一旦选定不可更改.按照功能的限制从小到大依次为:订阅号.服务号.企业号.个人只能注册订阅号.注册地址:https://mp.weixin.qq.com/. 开发环境的准备 微信公众号 外网映射工具(开发调试) 与微信的对接的URL应该满足以下的条件: 在公网上能够访问 只支持80端口 映射工具有很多,例如花生壳,ngrok可以将内网映射到公网上面,这样就可以使用公网访问本机的网络服务.下

JAVA微信公众号网页开发——获取公众号关注的所有用户

package com.weixin.sendmessage; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.a

《初识Java微信公众号开发》 学习中遇到的困难

前一段时间无聊的时候,在慕课网上自学了一点点微信公众号开发(受学姐威胁). 慕课网教程的地址:http://www.imooc.com/learn/368 毕竟是免费的课程,不可能讲的那么详细.所以我吧我遇到的问题跟大家分享一下. 这是我照着课程敲的代码(IDE是Eclipse): https://github.com/Zuosy/WeiXin 发到github上面了. 为了这个,我还专门到廖大的网站上学了一遍Git. 廖大的Git教程传送们:https://www.liaoxuefeng.co

微信公众号菜单openid 点击菜单即可打开并登录微站

现在大部分微站都通过用户的微信openid来实现自动登录.在我之前的开发中,用户通过点击一个菜单,公众号返回一个图文,用户点击这个图文才可以自动登录微站.但是如果你拥有高级接口,就可以实现点击菜单,打开网页就能获取这个openid,实现自动登录. 这里已经提到,必须要拥有高级接口的权限(服务号.企业号),开启了开发者模式. 1.设置回调地址 在微信公众平台后台“开发者中心”中找到“高级接口”下的“OAuth2.0网页授权”,后面有一个“修改”,点击之后就会弹出填写回调地址的对话框.具体如何授权,