首页 > 微信公众帐号开发教程第6篇-消息及消息处理工具的封装

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

 

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

 

接下来要做的就是将消息请求、回复中定义的消息进行封装,建立与之对应的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 [email protected]
 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 [email protected]
 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 [email protected]
 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 [email protected]
 9  *
10  */
11 public class NewsMessage extends BaseMessage {
12     // 图文消息个数,限制为10条以内
13     private int ArticleCount;
14     // 多条图文消息信息,默认第一个item为大图
15     private List
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
getArticles() { 26 return Articles; 27 } 28 29 public void setArticles(List
articles) { 30 Articles = articles; 31 } 32 }

图文消息中Article类的实体

 

 1 package com.javen.course.message.resp;
 2 
 3 /**
 4  * 图文消息中Article类的定义
 5  * @author Javen
 6  * @Email [email protected]
 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 [email protected]
 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 [email protected]**/
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 [email protected]
 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 parseXml(HttpServletRequest request) throws Exception {
106         // 将解析结果存储在HashMap中
107         Map map = new HashMap();
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 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(");
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

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

 

更多相关:

  • 首先对微擎的工作原理做简单描述, 微擎使用规则和模块的机制来处理公众平台的请求数据并返回响应的结果.执行流程描述为: 粉丝用户与公众号码进行对话或交互, 而后公众平台将粉丝用户的请求消息(当前包括: 文本, 图片, 位置, 链接, 事件. 请参阅消息类型)传递给微擎系统, 微擎系统按照消息类型和对应的公众号所设定的规则列表匹配到合适的...

  • 消息队列的使用场景以下介绍消息队列在实际应用常用的使用场景。异步处理、应用解耦、流量削锋和消息通讯四个场景。1】异步处理:场景说明:用户注册后,需要发注册邮件和注册短信。引入消息队列后架构如下:用户的响应时间=注册信息写入数据库的时间,例如50毫秒。发注册邮箱、发注册短信写入消息队列后,直接返回客户端,因写入消息队列的速度很快,基...

  • 下面是我凭记忆想到的几个题目,有需要的同学就拿去吧,我也算做了点善事. 中体骏彩C++笔试题 2013-11-18 1.指针的含义是:B A.名字 B.地址 C.名称 D.符号 2.给出下面的程序输出: #include #include #include ...

  • 双端通信描述 利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递,而不需要server端进行消息转发。 同时消息队列的读阻塞和写阻塞特性(消息队列中已经写入数据,如果再不读出来,则无法再次写入)让消息队列的实现过程只能如下: 客户端1的父进程用来处理类型1的消息写,子进程处理类型2的消息读客户端2的父进程处理类型...

  • 文章目录基本介绍编程接口代码实例消息队列的发送和接收消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用链表方式进行消息管理。进程之间的通信角色为:发送者和接受者 发送者: a. 获取消息队列的ID(key或者msgid) b. 将数据放入...

  • 在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用json格式的配置文件,那么在.net core中该如何读取json文件呢?1、在Startup类中读取json配置文件1、使用Confi...

  •   1 public class FrameSubject extends JFrame {   2    3   …………..   4    5   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个   6    7   //java.util.Observerable对象了。   8    9   DateSub...

  • 本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client  1、运行WebApi项目  URL http://yourserver/swagger 然后...

  •   在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性.   ModelState 在ApiController中一个ModelState属性用来获取参数验证结果.   public abstract class ApiController : IHttpController,...

  • 1# 引用  C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.dll C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.Applicati...

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...