




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、微信公眾帳號開發(fā)教程第4篇-消息及消息處理工具的封裝導讀 工欲善其事必先利其器!本篇內(nèi)容主要講解如何將微信公眾平臺定義的消息及消息相關(guān)的操作封裝成工具類,方面后期的使用。這里需要明確的是消息其實是由用戶發(fā)給你的公眾帳號的,消息先被微信平臺接收到,然后微信工欲善其事必先利其器!本篇內(nèi)容主要講解如何將微信公眾平臺定義的消息及消息相關(guān)的操作封裝成工具類,方面后期的使用。這里需要明確的是消息其實是由用戶發(fā)給你的公眾帳號的,消息先被微信平臺接收到,然后微信平臺會將該消息轉(zhuǎn)給你在開發(fā)模式接口配置中指定的URL地址。 微信公眾平臺消息接口要接收微信平臺發(fā)送的消息,我們需要先熟悉微信公眾平臺API中消息接口部
2、分,點此進入,點擊后將進入到消息接口指南部分,如下圖所示:在上圖左側(cè)可以看到微信公眾平臺目前開放的接口有三種:消息接口、通用接口和自定義菜單接口。通用接口和自定義菜單接口只有拿到內(nèi)測資格才能調(diào)用,而內(nèi)測資格的申請也已經(jīng)關(guān)閉了,我們只有期待將來某一天微信會對大眾用戶開放吧,所以沒有內(nèi)測資格的用戶就不要再浪費時間在這兩個接口上,只需要用好消息接口就可以了。 消息推送和消息回復下面將主要介紹消息接口。對于消息的接收、響應我們只需要關(guān)注上圖中的“4 消息推送”和“5 消息回復”就足夠了。我們先來了解接口中的“消息推送”指的是什么,點擊“4 消息推送”,可以看到接口中的“消息推送”指的是“當普通用戶向公
3、眾帳號發(fā)消息時,微信服務(wù)器將POST該消息到填寫的URL上”,即這里定義的是用戶能夠發(fā)送哪些類型的消息、消息有哪些字段、消息被微信服務(wù)器以什么方式轉(zhuǎn)發(fā)給我們的公眾帳號后臺。消息推送中定義了我們將會接收到的消息類型有5種:文本消息、圖片消息、地理位置消息、鏈接消息和事件推送,其實語音消息我們也能夠接收到的,只不過拿不到具體的語音文件而以(需要內(nèi)測資格才能夠獲取語音文件)。 接口中的“消息回復”定義了我們能回復給用戶的消息類型、消息字段和消息格式,微信公眾平臺的接口指南中是這樣描述的:上面說到我們能回復給用戶的消息有5種,但目前在開發(fā)模式下能回復的消息只有3種:文本消息、音樂消息和圖文消息,而語音
4、消息和視頻消息目前只能在編輯模式下使用。 消息的封裝接下來要做的就是將消息推送(請求)、消息回復(響應)中定義的消息進行封裝,建立與之對應的Java類(Java是一門面向?qū)ο蟮木幊陶Z言,封裝后使用起來更方便),下面的請求消息是指消息推送中定義的消息,響應消息指消息回復中定義的消息。請求消息的基類把消息推送中定義的所有消息都有的字段提取出來,封裝成一個基類,這些公有的字段包括:ToUserName(開發(fā)者微信號)、FromUserName(發(fā)送方帳號,OPEN_ID)、CreateTime(消息的創(chuàng)建時間)、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./ 開發(fā)者微信號11.private String ToUserName;12./ 發(fā)送方帳號(一個OpenID)13.private String FromUserName;14.
6、/ 消息創(chuàng)建時間 (整型)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./ 消息內(nèi)容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./ 地理位置經(jīng)度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(開發(fā)者的微信號)、CreateTime(消息的創(chuàng)建時間)、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./ 開發(fā)者微信號13.private String FromUserName;14./ 消息創(chuàng)建時間 (整型)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./ 回復的消息內(nèi)容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./ 圖文消息個數(shù),限制為10條以內(nèi)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、發(fā)者填寫的基本資料中的Url一致15.private String PicUrl;16./ 點擊圖文消息跳轉(zhuǎn)鏈接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工程中關(guān)于消息部分的結(jié)構(gòu)應該與下圖保持一致,如果不一致的(類名、屬性名稱不一致的)請檢查后調(diào)整一致,因為后面的章節(jié)還要介紹如何將微信開發(fā)中通用的類方法、與業(yè)務(wù)無關(guān)的工具類封裝打成jar包,以后再做微信項目只需要引入該jar包即可,這種工作做一次就可以了。 如何解析請求消息?接下來解決請求消息的解析問題。微信服務(wù)器會將用戶的請求通過doPost方法發(fā)送給我們,讓我們再來回顧下上一章節(jié)已經(jīng)寫好的doPost方法的定義: view source
30、print?1./*2.* 處理微信服務(wù)器發(fā)來的消息3.*/ 4.public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 5./ TODO 消息的接收、處理、響應 6. 如何將響應消息轉(zhuǎn)換成xml返回? 我們先前已經(jīng)將響應消息封裝成了Java類,方便我們在代碼中使用。那么,請求接收成功、處理完成后,該如何將消息返回呢?這里就涉及到如何將響應消息轉(zhuǎn)換成xml返回的問題,這里我們將采用開源框架xstream來實現(xiàn)Java類到xm
31、l的轉(zhuǎn)換(這里使用的是xstream-1.3.1.jar),代碼如下: view sourceprint?01./*02.* 文本消息對象轉(zhuǎn)換成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.* 音樂消息對象轉(zhuǎn)換成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.* 圖文消息對象轉(zhuǎn)換成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節(jié)點的轉(zhuǎn)換都增加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塊。消息處理工具的封裝知道怎么解析請求消息,也知道如何將響應消息轉(zhuǎn)化成xml了,接下來就是將消息相關(guān)的處理方法全部封裝到工具類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、微信發(fā)來的請求(XML)095.*096.* param request097.* return098.* throws Exception099.*/100.SuppressWarnings("unchecked")101.public static Map<String, String> parseXml(HttpServletRequest request) throws Exception 102./ 將解析結(jié)果存儲在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./ 得到根元素的所有子節(jié)點113.List<Element> elementList = root.elements();114. 115./ 遍歷所有子節(jié)點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.* 文本消息對象轉(zhuǎn)換成xml128.*129.* param textMessage 文本消息對象130.* return xml131
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 排水涵管施工方案
- 珠江啤酒公司財務(wù)管理模式的改進方案5400字
- 粉刷警示柱施工方案
- 照明專項施工方案
- 廣東鍋爐管道防腐施工方案
- 削竹式隧道明洞施工方案
- 灰土基層施工方案
- 鋁合金欄桿施工方案
- 拆除道牙和生態(tài)磚施工方案
- 室外壁掛式充電樁施工方案
- 項目部成立文件示例1
- 強直性脊柱炎患者功能鍛煉組圖
- 新課程標準2022版綜合實踐
- 40篇英語短文搞定高考3500個單詞
- 【企業(yè)會計信息化存在的問題及解決對策開題報告】
- 痘痘肌膚的各種類型
- 衛(wèi)生事業(yè)管理 第十八章 衛(wèi)生應急管理
- 皮膚性病學 14皮炎和濕疹
- GB/T 3403.2-2013塑料粉狀脲-甲醛和脲/三聚氰胺-甲醛模塑料(UF-和UF/MF-PMCs)第2部分:試樣制備和性能測定
- GB/T 21835-2008焊接鋼管尺寸及單位長度重量
- 知識管理控制程序
評論
0/150
提交評論