微信公众帐号开发教程第4篇-消息及消息处理工具的封装_第1页
微信公众帐号开发教程第4篇-消息及消息处理工具的封装_第2页
微信公众帐号开发教程第4篇-消息及消息处理工具的封装_第3页
微信公众帐号开发教程第4篇-消息及消息处理工具的封装_第4页
微信公众帐号开发教程第4篇-消息及消息处理工具的封装_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微信公众帐号开发教程第4篇-消息及消息处理工具的封装导读 工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用。这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平台接收到,然后微信工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用。这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平台接收到,然后微信平台会将该消息转给你在开发模式接口配置中指定的URL地址。 微信公众平台消息接口要接收微信平台发送的消息,我们需要先熟悉微信公众平台API中消息接口部

2、分,点此进入,点击后将进入到消息接口指南部分,如下图所示:在上图左侧可以看到微信公众平台目前开放的接口有三种:消息接口、通用接口和自定义菜单接口。通用接口和自定义菜单接口只有拿到内测资格才能调用,而内测资格的申请也已经关闭了,我们只有期待将来某一天微信会对大众用户开放吧,所以没有内测资格的用户就不要再浪费时间在这两个接口上,只需要用好消息接口就可以了。 消息推送和消息回复下面将主要介绍消息接口。对于消息的接收、响应我们只需要关注上图中的“4 消息推送”和“5 消息回复”就足够了。我们先来了解接口中的“消息推送”指的是什么,点击“4 消息推送”,可以看到接口中的“消息推送”指的是“当普通用户向公

3、众帐号发消息时,微信服务器将POST该消息到填写的URL上”,即这里定义的是用户能够发送哪些类型的消息、消息有哪些字段、消息被微信服务器以什么方式转发给我们的公众帐号后台。消息推送中定义了我们将会接收到的消息类型有5种:文本消息、图片消息、地理位置消息、链接消息和事件推送,其实语音消息我们也能够接收到的,只不过拿不到具体的语音文件而以(需要内测资格才能够获取语音文件)。 接口中的“消息回复”定义了我们能回复给用户的消息类型、消息字段和消息格式,微信公众平台的接口指南中是这样描述的:上面说到我们能回复给用户的消息有5种,但目前在开发模式下能回复的消息只有3种:文本消息、音乐消息和图文消息,而语音

4、消息和视频消息目前只能在编辑模式下使用。 消息的封装接下来要做的就是将消息推送(请求)、消息回复(响应)中定义的消息进行封装,建立与之对应的Java类(Java是一门面向对象的编程语言,封装后使用起来更方便),下面的请求消息是指消息推送中定义的消息,响应消息指消息回复中定义的消息。请求消息的基类把消息推送中定义的所有消息都有的字段提取出来,封装成一个基类,这些公有的字段包括:ToUserName(开发者微信号)、FromUserName(发送方帐号,OPEN_ID)、CreateTime(消息的创建时间)、MsgType(消息类型)、MsgId(消息ID),封装后基类org.liufeng.c

5、ourse.message.req.BaseMessage的代码如下: view sourceprint?01.package org.liufeng.course.message.req;02. 03./*04.* 消息基类(普通用户 -> 公众帐号)05.*06.* author liufeng07.* date 2013-05-1908.*/09.public class BaseMessage 10./ 开发者微信号11.private String ToUserName;12./ 发送方帐号(一个OpenID)13.private String FromUserName;14.

6、/ 消息创建时间 (整型)15.private long CreateTime;16./ 消息类型(text/image/location/link)17.private String MsgType;18./ 消息id,64位整型19.private long MsgId;20. 21.public String getToUserName() 22.return ToUserName;23.24. 25.public void setToUserName(String toUserName) 26.ToUserName = toUserName;27.28. 29.public Strin

7、g getFromUserName() 30.return FromUserName;31.32. 33.public void setFromUserName(String fromUserName) 34.FromUserName = fromUserName;35.36. 37.public long getCreateTime() 38.return CreateTime;39.40. 41.public void setCreateTime(long createTime) 42.CreateTime = createTime;43.44. 45.public String getM

8、sgType() 46.return MsgType;47.48. 49.public void setMsgType(String msgType) 50.MsgType = msgType;51.52. 53.public long getMsgId() 54.return MsgId;55.56. 57.public void setMsgId(long msgId) 58.MsgId = msgId;59.60.请求消息之文本消息view sourceprint?01.package org.liufeng.course.message.req;02. 03./*04.* 文本消息05

9、.*06.* author liufeng07.* date 2013-05-1908.*/09.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.请求消息之图片消息 view sourceprint?01.package org.l

10、iufeng.course.message.req;02. 03./*04.* 图片消息05.*06.* author liufeng07.* date 2013-05-1908.*/09.public class ImageMessage extends BaseMessage 10./ 图片链接11.private String PicUrl;12. 13.public String getPicUrl() 14.return PicUrl;15.16. 17.public void setPicUrl(String picUrl) 18.PicUrl = picUrl;19.20.请求消

11、息之地理位置消息view sourceprint?01.package org.liufeng.course.message.req;02. 03./*04.* 地理位置消息05.*06.* author liufeng07.* date 2013-05-1908.*/09.public class LocationMessage extends BaseMessage 10./ 地理位置维度11.private String Location_X;12./ 地理位置经度13.private String Location_Y;14./ 地图缩放大小15.private String Scal

12、e;16./ 地理位置信息17.private String Label;18. 19.public String getLocation_X() 20.return Location_X;21.22. 23.public void setLocation_X(String location_X) 24.Location_X = location_X;25.26. 27.public String getLocation_Y() 28.return Location_Y;29.30. 31.public void setLocation_Y(String location_Y) 32.Loca

13、tion_Y = location_Y;33.34. 35.public String getScale() 36.return Scale;37.38. 39.public void setScale(String scale) 40.Scale = scale;41.42. 43.public String getLabel() 44.return Label;45.46. 47.public void setLabel(String label) 48.Label = label;49.50.请求消息之链接消息package org.liufeng.course.message.req;

14、 /* * 链接消息 * * author liufeng * date 2013-05-19 */ public class LinkMessage extends BaseMessage / 消息标题 private String Title; / 消息描述 private String Description; / 消息链接 private String Url; public String getTitle() return Title; public void setTitle(String title) Title = title; public String getDescrip

15、tion() return Description; public void setDescription(String description) Description = description; public String getUrl() return Url; public void setUrl(String url) Url url; 请求消息之语音消息view sourceprint?01.package org.liufeng.course.message.req;02. 03./*04.* 音频消息05.*06.* author liufeng07.* date 2013-

16、05-1908.*/09.public class VoiceMessage extends BaseMessage 10./ 媒体ID11.private String MediaId;12./ 语音格式13.private String Format;14. 15.public String getMediaId() 16.return MediaId;17.18. 19.public void setMediaId(String mediaId) 20.MediaId = mediaId;21.22. 23.public String getFormat() 24.return Form

17、at;25.26. 27.public void setFormat(String format) 28.Format = format;29.30.响应消息的基类同样,把消息回复中定义的所有消息都有的字段提取出来,封装成一个基类,这些公有的字段包括:ToUserName(接收方帐号,用户的OPEN_ID)、FromUserName(开发者的微信号)、CreateTime(消息的创建时间)、MsgType(消息类型)、FuncFlag(消息的星标标识),封装后基类org.liufeng.course.message.resp.BaseMessage的代码如下: view sourceprint

18、?01.package org.liufeng.course.message.resp;02. 03./*04.* 消息基类(公众帐号 -> 普通用户)05.*06.* author liufeng07.* date 2013-05-1908.*/09.public class BaseMessage 10./ 接收方帐号(收到的OpenID)11.private String ToUserName;12./ 开发者微信号13.private String FromUserName;14./ 消息创建时间 (整型)15.private long CreateTime;16./ 消息类型(

19、text/music/news)17.private String MsgType;18./ 位0x0001被标志时,星标刚收到的消息19.private int FuncFlag;20. 21.public String getToUserName() 22.return ToUserName;23.24. 25.public void setToUserName(String toUserName) 26.ToUserName = toUserName;27.28. 29.public String getFromUserName() 30.return FromUserName;31.3

20、2. 33.public void setFromUserName(String fromUserName) 34.FromUserName = fromUserName;35.36. 37.public long getCreateTime() 38.return CreateTime;39.40. 41.public void setCreateTime(long createTime) 42.CreateTime = createTime;43.44. 45.public String getMsgType() 46.return MsgType;47.48. 49.public voi

21、d setMsgType(String msgType) 50.MsgType = msgType;51.52. 53.public int getFuncFlag() 54.return FuncFlag;55.56. 57.public void setFuncFlag(int funcFlag) 58.FuncFlag = funcFlag;59.60.响应消息之文本消息 view sourceprint?01.package org.liufeng.course.message.resp;02. 03./*04.* 文本消息05.*06.* author liufeng07.* dat

22、e 2013-05-1908.*/09.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.响应消息之音乐消息view sourceprint?01.package org.liufeng.course.message.resp;

23、02. 03./*04.* 音乐消息05.*06.* author liufeng07.* date 2013-05-1908.*/09.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.响应消息之图文消息 view sourceprint?01.package org

24、.liufeng.course.message.resp;02. 03.import java.util.List;04. 05./*06.* 文本消息07.*08.* author liufeng09.* date 2013-05-1910.*/11.public class NewsMessage extends BaseMessage 12./ 图文消息个数,限制为10条以内13.private int ArticleCount;14./ 多条图文消息信息,默认第一个item为大图15.private List<Article> Articles;16. 17.public

25、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.图文消息中

26、Article类的定义 view sourceprint?01.package org.liufeng.course.message.resp;02. 03./*04.* 图文model05.*06.* author liufeng07.* date 2013-05-1908.*/09.public class Article 10./ 图文消息名称11.private String Title;12./ 图文消息描述13.private String Description;14./ 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开

27、发者填写的基本资料中的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.pub

28、lic 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

29、.46. 47.public void setUrl(String url) 48.Url = url;49.50. 51.全部消息封装完成后,Eclipse工程中关于消息部分的结构应该与下图保持一致,如果不一致的(类名、属性名称不一致的)请检查后调整一致,因为后面的章节还要介绍如何将微信开发中通用的类方法、与业务无关的工具类封装打成jar包,以后再做微信项目只需要引入该jar包即可,这种工作做一次就可以了。 如何解析请求消息?接下来解决请求消息的解析问题。微信服务器会将用户的请求通过doPost方法发送给我们,让我们再来回顾下上一章节已经写好的doPost方法的定义: view source

30、print?1./*2.* 处理微信服务器发来的消息3.*/ 4.public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 5./ TODO 消息的接收、处理、响应 6. 如何将响应消息转换成xml返回? 我们先前已经将响应消息封装成了Java类,方便我们在代码中使用。那么,请求接收成功、处理完成后,该如何将消息返回呢?这里就涉及到如何将响应消息转换成xml返回的问题,这里我们将采用开源框架xstream来实现Java类到xm

31、l的转换(这里使用的是xstream-1.3.1.jar),代码如下: view sourceprint?01./*02.* 文本消息对象转换成xml03.*04.* param textMessage 文本消息对象05.* return xml06.*/07.public static String textMessageToXml(TextMessage textMessage) 08.xstream.alias("xml", textMessage.getClass();09.return xstream.toXML(textMessage);10.11. 12./*

32、13.* 音乐消息对象转换成xml14.*15.* param musicMessage 音乐消息对象16.* return xml17.*/18.public static String musicMessageToXml(MusicMessage musicMessage) 19.xstream.alias("xml", musicMessage.getClass();20.return xstream.toXML(musicMessage);21.22. 23./*24.* 图文消息对象转换成xml25.*26.* param newsMessage 图文消息对象27

33、.* return xml28.*/29.public static String newsMessageToXml(NewsMessage newsMessage) 30.xstream.alias("xml", newsMessage.getClass();31.xstream.alias("item", new Article().getClass();32.return xstream.toXML(newsMessage);33.34. 35./*36.* 扩展xstream,使其支持CDATA块37.*38.* date 2013-05-193

34、9.*/40.private static XStream xstream = new XStream(new XppDriver() 41.public HierarchicalStreamWriter createWriter(Writer out) 42.return new PrettyPrintWriter(out) 43./ 对所有xml节点的转换都增加CDATA标记44.boolean cdata = true;45. 46.SuppressWarnings("unchecked")47.public void startNode(String name, C

35、lass clazz) 48.super.startNode(name, clazz);49.50. 51.protected void writeText(QuickWriter writer, String text) 52.if (cdata) 53.writer.write("<!CDATA");54.writer.write(text);55.writer.write(">");56. else 57.writer.write(text);58.59.60.;61.62.);说明:由于xstream框架本身并不支持CDATA块的生成

36、,4062行代码是对xtream做了扩展,使其支持在生成xml各元素值时添加CDATA块。消息处理工具的封装知道怎么解析请求消息,也知道如何将响应消息转化成xml了,接下来就是将消息相关的处理方法全部封装到工具类MessageUtil中,该类的完整代码如下: view sourceprint?001.package org.liufeng.course.util;002. 003.import java.io.InputStream;004.import java.io.Writer;005.import java.util.HashMap;006.import java.util.List;

37、007.import java.util.Map;008. 009.import javax.servlet.http.HttpServletRequest;010. 011.import org.dom4j.Document;012.import org.dom4j.Element;013.import org.dom4j.io.SAXReader;014.import org.liufeng.course.message.resp.Article;015.import org.liufeng.course.message.resp.MusicMessage;016.import org.l

38、iufeng.course.message.resp.NewsMessage;017.import org.liufeng.course.message.resp.TextMessage;018. 019.import com.thoughtworks.xstream.XStream;020.import com.thoughtworks.xstream.core.util.QuickWriter;021.import com.thoughtworks.xstream.io.HierarchicalStreamWriter;022.import com.thoughtworks.xstream

39、.io.xml.PrettyPrintWriter;023.import com.thoughtworks.xstream.io.xml.XppDriver;024. 025./*026.* 消息工具类027.*028.* author liufeng029.* date 2013-05-19030.*/031.public class MessageUtil 032. 033./*034.* 返回消息类型:文本035.*/036.public static final String RESP_MESSAGE_TYPE_TEXT = "text"037. 038./*039

40、.* 返回消息类型:音乐040.*/041.public static final String RESP_MESSAGE_TYPE_MUSIC = "music"042. 043./*044.* 返回消息类型:图文045.*/046.public static final String RESP_MESSAGE_TYPE_NEWS = "news"047. 048./*049.* 请求消息类型:文本050.*/051.public static final String REQ_MESSAGE_TYPE_TEXT = "text"0

41、52. 053./*054.* 请求消息类型:图片055.*/056.public static final String REQ_MESSAGE_TYPE_IMAGE = "image"057. 058./*059.* 请求消息类型:链接060.*/061.public static final String REQ_MESSAGE_TYPE_LINK = "link"062. 063./*064.* 请求消息类型:地理位置065.*/066.public static final String REQ_MESSAGE_TYPE_LOCATION =

42、"location"067. 068./*069.* 请求消息类型:音频070.*/071.public static final String REQ_MESSAGE_TYPE_VOICE = "voice"072. 073./*074.* 请求消息类型:推送075.*/076.public static final String REQ_MESSAGE_TYPE_EVENT = "event"077. 078./*079.* 事件类型:subscribe(订阅)080.*/081.public static final Strin

43、g EVENT_TYPE_SUBSCRIBE = "subscribe"082. 083./*084.* 事件类型:unsubscribe(取消订阅)085.*/086.public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"087. 088./*089.* 事件类型:CLICK(自定义菜单点击事件)090.*/091.public static final String EVENT_TYPE_CLICK = "CLICK"092. 093./*094.* 解析

44、微信发来的请求(XML)095.*096.* param request097.* return098.* throws Exception099.*/100.SuppressWarnings("unchecked")101.public static Map<String, String> parseXml(HttpServletRequest request) throws Exception 102./ 将解析结果存储在HashMap中103.Map<String, String> map = new HashMap<String, St

45、ring>();104. 105./ 从request中取得输入流106.InputStream inputStream = request.getInputStream();107./ 读取输入流108.SAXReader reader = new SAXReader();109.Document document = reader.read(inputStream);110./ 得到xml根元素111.Element root = document.getRootElement();112./ 得到根元素的所有子节点113.List<Element> elementList = root.elements();114. 115./ 遍历所有子节点116.for (Element e : elementList)117.map.put(e.getName(), e.getText();118. 119./ 释放资源120.inputStream.close();121.inputStream = null;122. 123.return map;124.125. 126./*127.* 文本消息对象转换成xml128.*129.* param textMessage 文本消息对象130.* return xml131

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论