上一篇文章中,我們學習了使用Java語言開發(fā)微信公眾平臺的第一部分——環(huán)境搭建與開發(fā)接入。那么,本篇文章,我們將在此基礎(chǔ)上,學習【消息的接收與響應(yīng)】。
喜歡本文,請點擊下方喜歡按鈕唄!??
當然,我們在后續(xù)的開發(fā)過程中肯定還是離不開微信提供的開發(fā)者文檔:http://mp.weixin.qq.com/wiki/home/,打開開發(fā)文檔,點擊左側(cè)的“消息管理”——“接受普通消息”,本節(jié)內(nèi)容,我們來學習普通消息的接收與響應(yīng)。
之前我們強調(diào)過,接入微信公眾平臺的時候,微信將發(fā)送Get請求給我們的校驗方法。那當我們接收消息的時候,微信將向我們發(fā)送Post請求,并以XML的格式發(fā)送與接收數(shù)據(jù)。并且在開發(fā)過程中,我們需要注意一點小細節(jié):
微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會斷掉連接,并且重新發(fā)起請求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會對此作任何處理,并且不會發(fā)起重試。
下面,我們來看一下微信發(fā)給我們的普通文本消息的XML包結(jié)構(gòu),各標簽所包裹的內(nèi)容,在官方文檔中說的很詳細:
了解了微信給我們推送的XML包結(jié)構(gòu),下面我們就通過創(chuàng)建文本消息,來實現(xiàn)消息的接收與響應(yīng):
繼續(xù)打開我們上次編寫的Servlet,即微信請求的Servlet地址。在Post方法中,接收微信發(fā)送的XML內(nèi)容,當然在此之前,為了方便我們的數(shù)據(jù)處理,我們需要新建兩個方法,將XML數(shù)據(jù)類型,轉(zhuǎn)成我們熟悉的集合類型。反之,能夠?qū)⑽覀兊膶ο箢愋停D(zhuǎn)成XML類型,并返回給微信公眾平臺:
1、將接收到的XML格式,轉(zhuǎn)為集合對象(Map)
這里,我們在我們的Util包下,新建一個Message工具類:
首先,新建一個方法,將我們接收到的XML格式,轉(zhuǎn)化為Map格式。在這個過程中,我們需要借助一個dom4j的jar包。并將其放置在Web-INF下的lib包中。這個jar包很容易下載,此處提供一個下載鏈接,如果下載遇到問題,可加入杰瑞教育技術(shù)交流群(452379712)下載。
好了,借助dom4j的jar包,我們可以編寫方法,將XML格式,轉(zhuǎn)化對Map對象格式,方法實現(xiàn)如下:
2、類似上述方法,我們需要編寫方法,將我們的消息對象,轉(zhuǎn)成XML。
此處,我們?nèi)孕杞柚粋€jar包:xstream-x.x.jar,導(dǎo)入方式同dom4j
當然,首先,我們需要新建一個實體類,用于承載消息對象,實體類中6個屬性,分別對應(yīng)上述微信給我們發(fā)送的XML文本的6個參數(shù),并提供對應(yīng)Get/Set方法以及空參/全參構(gòu)造,此處不做贅述:
接下來,我們編寫方法,來轉(zhuǎn)換此文本消息類的對象,將其轉(zhuǎn)換為XML格式返回:
3、寫完上述兩個處理方法后,我們來實現(xiàn)【消息的接收與響應(yīng)】,
回到我們最開始的Servlet中,在doPost方法中進行編寫操作:
這樣,我們就成功的完成了文本消息的接收與響應(yīng)。實現(xiàn)效果如下,用戶發(fā)送任何內(nèi)容,將會返回各種信息:
【附錄】相關(guān)代碼:
一、Servlet中的doPost方法:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String str = null;
try {
//將request請求,傳到Message工具類的轉(zhuǎn)換方法中,返回接收到的Map對象
Map map = Message.xmlToMap(request);
//從集合中,獲取XML各個節(jié)點的內(nèi)容
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String CreateTime = map.get("CreateTime");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String MsgId = map.get("MsgId");
if(MsgType.equals("text")){//判斷消息類型是否是文本消息(text)
TestMessage message = new TestMessage();
message.setFromUserName(ToUserName);//原來【接收消息用戶】變?yōu)榛貜?fù)時【發(fā)送消息用戶】
message.setToUserName(FromUserName);
message.setMsgType("text");
message.setCreateTime(new Date().getTime());//創(chuàng)建當前時間為消息時間
message.setContent("您好,"+FromUserName+"\n我是:"+ToUserName
+"\n您發(fā)送的消息類型為:"+MsgType+"\n您發(fā)送的時間為"+CreateTime
+"\n我回復(fù)的時間為:"+message.getCreateTime()+"您發(fā)送的內(nèi)容是"+Content);
str = Message.objectToXml(message); //調(diào)用Message工具類,將對象轉(zhuǎn)為XML字符串
}
二、Message處理工具類:
/**
* 新建方法,將接收到的XML格式,轉(zhuǎn)化為Map對象
* @param request 將request對象,通過參數(shù)傳入
* @return 返回轉(zhuǎn)換后的Map對象
*/
public static Map xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map map = new HashMap();
//從dom4j的jar包中,拿到SAXReader對象。
SAXReader reader = new SAXReader();
InputStream is = request.getInputStream();//從request中,獲取輸入流
Document doc = ?reader.read(is);//從reader對象中,讀取輸入流
Element root = doc.getRootElement();//獲取XML文檔的根元素
List list = root.elements();//獲得根元素下的所有子節(jié)點
for (Element e : list) {
map.put(e.getName(), e.getText());//遍歷list對象,并將結(jié)果保存到集合中
}
is.close();
return map;
}
/**
* 將文本消息對象轉(zhuǎn)化成XML格式
* @param message 文本消息對象
* @return 返回轉(zhuǎn)換后的XML格式
*/
public static String objectToXml(TestMessage message){
XStream xs = new XStream();
//由于轉(zhuǎn)換后xml根節(jié)點默認為class類,需轉(zhuǎn)化為
xs.alias("xml", message.getClass());
return xs.toXML(message);
}
三、TestMessage實體類:
//屬性如下private String ToUserName;
private String FromUserName;
private Long CreateTime;
private String MsgType;
private String Content;
private String MsgId;
//以及Get/Set方法
【版權(quán)聲明】
原創(chuàng)內(nèi)容,歡迎轉(zhuǎn)載!轉(zhuǎn)載請注明出處!需要源碼下載,請聯(lián)系博主!微博@小風飛魚