本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用  官方文档

接下来要做的就是将消息请求、回复中定义的消息进行封装,建立与之对应的Java类(Java是一门面向对象的编程语言,封装后使用起来更方便),下面的请求消息是指消息推送中定义的消息,响应消息指消息回复中定义的消息。

消息的基类

把消息推送中定义的所有消息都有的字段提取出来,封装成一个基类,这些公有的字段包括:ToUserName(开发者微信号)、FromUserName(发送方帐号,OPEN_ID)、CreateTime(消息的创建时间)、MsgType(消息类型)、MsgId(消息ID),封装后基类

 1 package com.javen.course.message.resp;
 2
 3 /**
 4  * 响应消息的基类
 5  * 消息基类(公众帐号 -> 普通用户)
 6  * @author Javen
 7  * @Email zyw205@gmail.com
 8  *
 9  */
10 public class BaseMessage {
11     // 接收方帐号(收到的OpenID)
12     private String ToUserName;
13     // 开发者微信号
14     private String FromUserName;
15     // 消息创建时间 (整型)
16     private long CreateTime;
17     // 消息类型(text/music/news)
18     private String MsgType;
19     // 位0x0001被标志时,星标刚收到的消息
20     private int FuncFlag;
21
22     public String getToUserName() {
23         return ToUserName;
24     }
25
26     public void setToUserName(String toUserName) {
27         ToUserName = toUserName;
28     }
29
30     public String getFromUserName() {
31         return FromUserName;
32     }
33
34     public void setFromUserName(String fromUserName) {
35         FromUserName = fromUserName;
36     }
37
38     public long getCreateTime() {
39         return CreateTime;
40     }
41
42     public void setCreateTime(long createTime) {
43         CreateTime = createTime;
44     }
45
46     public String getMsgType() {
47         return MsgType;
48     }
49
50     public void setMsgType(String msgType) {
51         MsgType = msgType;
52     }
53
54     public int getFuncFlag() {
55         return FuncFlag;
56     }
57
58     public void setFuncFlag(int funcFlag) {
59         FuncFlag = funcFlag;
60     }
61 }

消息之文本消息

 1 package com.javen.course.message.resp;
 2
 3 /**
 4  * 文本消息
 5  * @author Javen
 6  * @Email zyw205@gmail.com
 7  *
 8  */
 9 public class TextMessage extends BaseMessage {
10     // 回复的消息内容
11     private String Content;
12
13     public String getContent() {
14         return Content;
15     }
16
17     public void setContent(String content) {
18         Content = content;
19     }
20 }

消息之地理位置消息

 1 package com.javen.course.message.resp;
 2
 3 /**
 4  * 响应消息的基类
 5  * 消息基类(公众帐号 -> 普通用户)
 6  * @author Javen
 7  * @Email zyw205@gmial.com
 8  *
 9  */
10 public class BaseMessage {
11     // 接收方帐号(收到的OpenID)
12     private String ToUserName;
13     // 开发者微信号
14     private String FromUserName;
15     // 消息创建时间 (整型)
16     private long CreateTime;
17     // 消息类型(text/music/news)
18     private String MsgType;
19     // 位0x0001被标志时,星标刚收到的消息
20     private int FuncFlag;
21
22     public String getToUserName() {
23         return ToUserName;
24     }
25
26     public void setToUserName(String toUserName) {
27         ToUserName = toUserName;
28     }
29
30     public String getFromUserName() {
31         return FromUserName;
32     }
33
34     public void setFromUserName(String fromUserName) {
35         FromUserName = fromUserName;
36     }
37
38     public long getCreateTime() {
39         return CreateTime;
40     }
41
42     public void setCreateTime(long createTime) {
43         CreateTime = createTime;
44     }
45
46     public String getMsgType() {
47         return MsgType;
48     }
49
50     public void setMsgType(String msgType) {
51         MsgType = msgType;
52     }
53
54     public int getFuncFlag() {
55         return FuncFlag;
56     }
57
58     public void setFuncFlag(int funcFlag) {
59         FuncFlag = funcFlag;
60     }
61 }

消息之图文消息

 1 package com.javen.course.message.resp;
 2
 3 import java.util.List;
 4
 5 /**
 6  * 图文消息
 7  * @author Javen
 8  * @Email zyw205@gmial.com
 9  *
10  */
11 public class NewsMessage extends BaseMessage {
12     // 图文消息个数,限制为10条以内
13     private int ArticleCount;
14     // 多条图文消息信息,默认第一个item为大图
15     private List<Article> Articles;
16
17     public int getArticleCount() {
18         return ArticleCount;
19     }
20
21     public void setArticleCount(int articleCount) {
22         ArticleCount = articleCount;
23     }
24
25     public List<Article> getArticles() {
26         return Articles;
27     }
28
29     public void setArticles(List<Article> articles) {
30         Articles = articles;
31     }
32 }

图文消息中Article类的实体

 1 package com.javen.course.message.resp;
 2
 3 /**
 4  * 图文消息中Article类的定义
 5  * @author Javen
 6  * @Email zyw205@gmial.com
 7  *
 8  */
 9 public class Article {
10     // 图文消息名称
11     private String Title;
12     // 图文消息描述
13     private String Description;
14     // 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致
15     private String PicUrl;
16     // 点击图文消息跳转链接
17     private String Url;
18
19     public String getTitle() {
20         return Title;
21     }
22
23     public void setTitle(String title) {
24         Title = title;
25     }
26
27     public String getDescription() {
28         return null == Description ? "" : Description;
29     }
30
31     public void setDescription(String description) {
32         Description = description;
33     }
34
35     public String getPicUrl() {
36         return null == PicUrl ? "" : PicUrl;
37     }
38
39     public void setPicUrl(String picUrl) {
40         PicUrl = picUrl;
41     }
42
43     public String getUrl() {
44         return null == Url ? "" : Url;
45     }
46
47     public void setUrl(String url) {
48         Url = url;
49     }
50
51 }

 消息之音乐消息

 1 package com.javen.course.message.resp;
 2
 3 /**
 4  * 音乐消息  响应消息之音乐消息
 5  * @author Javen
 6  * @Email zyw205@gmail.com
 7  *
 8  */
 9 public class MusicMessage extends BaseMessage {
10     // 音乐
11     private Music Music;
12
13     public Music getMusic() {
14         return Music;
15     }
16
17     public void setMusic(Music music) {
18         Music = music;
19     }
20 }

音乐消息中Music类的实体

package com.javen.course.message.resp;/***  音乐消息中Music类的定义* @author Javen* @Email zyw205@gmail.com**/
public class Music {// 音乐名称private String Title;// 音乐描述private String Description;// 音乐链接private String MusicUrl;// 高质量音乐链接,WIFI环境优先使用该链接播放音乐private String HQMusicUrl;public String getTitle() {return Title;}public void setTitle(String title) {Title = title;}public String getDescription() {return Description;}public void setDescription(String description) {Description = description;}public String getMusicUrl() {return MusicUrl;}public void setMusicUrl(String musicUrl) {MusicUrl = musicUrl;}public String getHQMusicUrl() {return HQMusicUrl;}public void setHQMusicUrl(String musicUrl) {HQMusicUrl = musicUrl;}}

 

 解析请求消息

微信服务器会将用户的请求通过doPost方法发送给我们,回顾接入成为开发者

微信公众帐号开发教程第4篇-----开发模式启用及接口配置Java

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO 消息的接收、处理、响应  }

 解析微信发来的请求(XML)

这里我们借助于开源框架dom4j去解析xml(这里使用的是dom4j-1.6.1.jar),然后将解析得到的结果存入HashMap

如何将响应消息转换成xml返回

这里我们将采用开源框架xstream来实现Java类到xml的转换(这里使用的是xstream-1.3.1.jar)

消息处理类型的封装

以上代码如下:

  1 package com.javen.course.util;
  2
  3 import java.io.InputStream;
  4 import java.io.Writer;
  5 import java.util.HashMap;
  6 import java.util.List;
  7 import java.util.Map;
  8
  9 import javax.servlet.http.HttpServletRequest;
 10
 11 import org.dom4j.Document;
 12 import org.dom4j.Element;
 13 import org.dom4j.io.SAXReader;
 14
 15
 16 import com.javen.course.message.resp.Article;
 17 import com.javen.course.message.resp.MusicMessage;
 18 import com.javen.course.message.resp.NewsMessage;
 19 import com.javen.course.message.resp.TextMessage;
 20 import com.thoughtworks.xstream.XStream;
 21 import com.thoughtworks.xstream.core.util.QuickWriter;
 22 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 23 import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
 24 import com.thoughtworks.xstream.io.xml.XppDriver;
 25
 26 /**
 27  * 消息工具类
 28  * @author Javen
 29  * @Email zyw205@gmail.com
 30  */
 31 public class MessageUtil {
 32     /**
 33      * 返回消息类型:文本
 34      */
 35     public static final String RESP_MESSAGE_TYPE_TEXT = "text";
 36
 37     /**
 38      * 返回消息类型:音乐
 39      */
 40     public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
 41
 42     /**
 43      * 返回消息类型:图文
 44      */
 45     public static final String RESP_MESSAGE_TYPE_NEWS = "news";
 46
 47     /**
 48      * 请求消息类型:文本
 49      */
 50     public static final String REQ_MESSAGE_TYPE_TEXT = "text";
 51
 52     /**
 53      * 请求消息类型:图片
 54      */
 55     public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
 56
 57     /**
 58      * 请求消息类型:链接
 59      */
 60     public static final String REQ_MESSAGE_TYPE_LINK = "link";
 61
 62     /**
 63      * 请求消息类型:地理位置
 64      */
 65     public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
 66
 67     /**
 68      * 请求消息类型:音频
 69      */
 70     public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
 71
 72     /**
 73      * 请求消息类型:推送
 74      */
 75     public static final String REQ_MESSAGE_TYPE_EVENT = "event";
 76
 77     /**
 78      * 事件类型:subscribe(订阅)
 79      */
 80     public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
 81
 82     /**
 83      * 事件类型:unsubscribe(取消订阅)
 84      */
 85     public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
 86
 87     /**
 88      * 事件类型:CLICK(自定义菜单点击事件)
 89      */
 90     public static final String EVENT_TYPE_CLICK = "CLICK";
 91
 92     /**
 93      * 事件类型:scan(用户已关注时的事件推送)
 94      */
 95     public static final String EVENT_TYPE_SCAN = "SCAN";
 96
 97     /**
 98      * 解析微信发来的请求(XML)
 99      *
100      * @param request
101      * @return
102      * @throws Exception
103      */
104     @SuppressWarnings("unchecked")
105     public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
106         // 将解析结果存储在HashMap中
107         Map<String, String> map = new HashMap<String, String>();
108
109         // 从request中取得输入流
110         InputStream inputStream = request.getInputStream();
111         // 读取输入流
112         SAXReader reader = new SAXReader();
113         Document document = reader.read(inputStream);
114         // 得到xml根元素
115         Element root = document.getRootElement();
116         // 得到根元素的所有子节点
117         List<Element> elementList = root.elements();
118
119         // 遍历所有子节点
120         for (Element e : elementList)
121             map.put(e.getName(), e.getText());
122
123         // 释放资源
124         inputStream.close();
125         inputStream = null;
126
127         return map;
128     }
129
130     /**
131      * 文本消息对象转换成xml
132      *
133      * @param textMessage 文本消息对象   XStream是一个Java对象和XML相互转换的工具
134      * @return xml
135      */
136     public static String textMessageToXml(TextMessage textMessage) {
137         xstream.alias("xml", textMessage.getClass());
138         return xstream.toXML(textMessage);
139     }
140
141     /**
142      * 音乐消息对象转换成xml
143      *
144      * @param musicMessage 音乐消息对象
145      * @return xml
146      */
147     public static String musicMessageToXml(MusicMessage musicMessage) {
148         xstream.alias("xml", musicMessage.getClass());
149         return xstream.toXML(musicMessage);
150     }
151
152     /**
153      * 图文消息对象转换成xml
154      *
155      * @param newsMessage 图文消息对象
156      * @return xml
157      */
158     public static String newsMessageToXml(NewsMessage newsMessage) {
159         xstream.alias("xml", newsMessage.getClass());
160         xstream.alias("item", new Article().getClass());
161         return xstream.toXML(newsMessage);
162     }
163
164     /**
165      * 扩展xstream,使其支持CDATA块
166      *
167      */
168     private static XStream xstream = new XStream(new XppDriver() {
169         public HierarchicalStreamWriter createWriter(Writer out) {
170             return new PrettyPrintWriter(out) {
171                 // 对所有xml节点的转换都增加CDATA标记
172                 boolean cdata = true;
173
174                 @SuppressWarnings("unchecked")
175                 public void startNode(String name, Class clazz) {
176                     super.startNode(name, clazz);
177                 }
178
179                 protected void writeText(QuickWriter writer, String text) {
180                     if (cdata) {
181                         writer.write("<![CDATA[");
182                         writer.write(text);
183                         writer.write("]]>");
184                     } else {
185                         writer.write(text);
186                     }
187                 }
188             };
189         }
190     });
191 }

到这里关于消息及消息处理工具的封装基本完成,其实就是对请求消息/响应消息建立了与之对应的Java类、对xml消息进行解析、将响应消息的Java对象转换成xml

我的微信公众账号 人脸识别、音乐点播、在线翻译、天气查询、公交查询、周公解梦、星座运势、手机归属地查询、聊天唠嗑等

欢迎加入群:347245650   345531810 进行讨论相互交流  我的微信号:572839485

我的微信公众账号  我的微社区欢迎关注 索取源码←请点击

微信公众帐号开发教程第6篇-消息及消息处理工具的封装相关推荐

  1. [028] 微信公众帐号开发教程第4篇-消息及消息处理工具的封装

    工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用.这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平台接收到,然后微信平台 ...

  2. 微信公众帐号开发教程第13篇-图文消息全攻略

    引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本 ...

  3. 微信公众帐号开发教程第13篇-图文消息全攻略 -- 转载

    引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本 ...

  4. [037] 微信公众帐号开发教程第13篇-图文消息全攻略

    引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本 ...

  5. 微信公众帐号开发教程第1篇-引言(转)

    接触微信公众帐号已经有两个多月的时间了,在这期间,除了陆续完好个人公众帐号xiaoqrobot以外,还带领团队为公司开发了两个企业应用:一个是普通类型的公众帐号,还有一个是会议类型的公众帐号.经过这3 ...

  6. [025] 微信公众帐号开发教程第1篇-引言

    接触微信公众帐号已经有两个多月的时间了,在这期间,除了陆续完善个人公众帐号xiaoqrobot以外,还带领团队为公司开发了两个企业应用:一个是普通类型的公众帐号,另一个是会议类型的公众帐号.经过这3个 ...

  7. 微信公众帐号开发教程第12篇-符号表情的发送(下)

    引言及文章概要 第11篇文章给出了Unified版本的符号表情(emoji表情)代码表,并且介绍了如何在微信公众帐号开发模式下发送emoji表情,还在文章结尾出,卖了个关子:"小q机器人中使 ...

  8. 微信公众帐号开发教程第11篇-符号表情的发送(上)

    题外话(可以略过) 相信这篇文章已经让大家等的太久了,不是我故弄玄虚.吊大家胃口,而是写一篇文章真的需要花太多的时间.也许一篇文章,你们花3-5分钟就看完了.就学会掌握了,而我却要花2-3个小时的时间 ...

  9. [11] 微信公众帐号开发教程第11篇-符号表情的发送(上)

    题外话(可以略过) 相信这篇文章已经让大家等的太久了,不是我故弄玄虚.吊大家胃口,而是写一篇文章真的需要花太多的时间.也许一篇文章,你们花3-5分钟就看完了.就学会掌握了,而我却要花2-3个小时的时间 ...

最新文章

  1. C#编程中的crc16校验
  2. mvn test BUILD FAILURE
  3. java中解决脏读_java并发编程学习之脏读代码示例及处理
  4. C#中的方法(上):
  5. 去除面部黑色素小妙招_面部黑色素沉着怎么去除 推荐几个去黑色素的方法
  6. 计算机组成原理补充实验,计算机组成原理实验补充实验指导-实.doc
  7. ddos攻击数据集_ddos攻击和cc攻击有什么区别?他们2个哪个更厉害?
  8. 剑指offer十八之二叉树的镜像
  9. Lesson 07 for Plotting in R for Biologists
  10. Solidworks介绍与 solidwords 2018安装过程
  11. python中用来返回序列的最大函数_Python内置函数____________用来返回序列中的最大元素。...
  12. 杨海朝 mysql_老男孩Mysql高级DBA 实战新浪首席DBA 老男孩教育杨海朝老师全程主讲 老男孩Mysql视频...
  13. elasticsearch基础知识
  14. 部署无鱼工时系统,超详细教程,并成功部署
  15. 什么是深度可分离卷积及深度可分离卷积的优势
  16. goland debug高级技巧
  17. 洛谷P2437 蜜蜂路线
  18. 【转载】8B/10B Encode/Decode详解
  19. php虚拟电话号码,虚拟运营商号码慎入! 七大你要想到的事【2】
  20. Linux Graphics 周刊(第 9 期)

热门文章

  1. 项目代码从GitHub上克隆到本地
  2. 风寒感冒与风热感冒的区分与治疗
  3. JAVA-单例模式的几种实现方式
  4. 小程序中使用threejs
  5. 47 单例模式 和装饰器
  6. 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
  7. jQuery自定义美化下拉框
  8. 2018ICPC-ACM XIAN Invitation Onsite
  9. javascript创建对象 1
  10. [转载]Java web应用中的常见字符编码问题的解决方法