使用Java開發微信公衆平臺(四)——消息的接收與響應

上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,咱們學習了使用Java語言開發微信公衆平臺的第一部分——環境搭建與開發接入。那麼,本篇文章,咱們將在此基礎上,學習【消息的接收與響應】。服務器

固然,咱們在後續的開發過程當中確定仍是離不開微信提供的開發者文檔:http://mp.weixin.qq.com/wiki/home/ ,打開開發文檔,點擊左側的「消息管理」——「接受普通消息」,本節內容,咱們來學習普通消息的接收與響應。微信

 

以前咱們強調過,接入微信公衆平臺的時候,微信將發送Get請求給咱們的校驗方法。那當咱們接收消息的時候,微信將向咱們發送Post請求,並以XML的格式發送與接收數據。而且在開發過程當中,咱們須要注意一點小細節:微信公衆平臺

微信服務器在五秒內收不到響應會斷掉鏈接,而且從新發起請求,總共重試三次。假如服務器沒法保證在五秒內處理並回復,能夠直接回復空串,微信服務器不會對此做任何處理,而且不會發起重試。dom

下面,咱們來看一下微信發給咱們的普通文本消息的XML包結構:工具

<xml>學習

        <ToUserName><![CDATA[toUser]]></ToUserName>this

 <FromUserName><![CDATA[fromUser]]></FromUserName>spa

 <CreateTime>1348831860</CreateTime>xml

 <MsgType><![CDATA[text]]></MsgType>htm

 <Content><![CDATA[this is a test]]></Content>

 <MsgId>1234567890123456</MsgId>

 </xml>

其中,各標籤所包裹的內容,在官方文檔中說的很詳細:

 

瞭解了微信給咱們推送的XML包結構,下面咱們就經過建立文本消息,來實現消息的接收與響應:

繼續打開咱們上次編寫的Servlet,即微信請求的Servlet地址。在Post方法中,接收微信發送的XML內容,固然在此以前,爲了方便咱們的數據處理,咱們須要新建兩個方法,將XML數據類型,轉成咱們熟悉的集合類型。反之,可以將咱們的對象類型,轉成XML類型,並返回給微信公衆平臺:

一、 將接收到的XML格式,轉爲集合對象(Map)

這裏,咱們在咱們的Util包下,新建一個Message工具類:

 

首先,新建一個方法,將咱們接收到的XML格式,轉化爲Map格式。在這個過程當中,咱們須要藉助一個dom4j的jar包。並將其放置在Web-INF下的lib包中。這個jar包很容易下載,此處提供一個下載連接,若是下載遇到問題,可加入傑瑞教育技術交流羣(452379712)下載。 

 

好了,藉助dom4j的jar包,咱們能夠編寫方法,將XML格式,轉化對Map對象格式,方法實現以下:

 

二、 相似上述方法,咱們須要編寫方法,將咱們的消息對象,轉成XML。

此處,咱們仍需藉助一個jar包:xstream-x.x.jar,導入方式同dom4j

 

固然,首先,咱們須要新建一個實體類,用於承載消息對象,實體類中6個屬性,分別對應上述微信給咱們發送的XML文本的6個參數,並提供對應Get/Set方法以及空參/全參構造,此處不作贅述:

 

接下來,咱們編寫方法,來轉換此文本消息類的對象,將其轉換爲XML格式返回:

 

三、 寫完上述兩個處理方法後,咱們來實現【消息的接收與響應】,

回到咱們最開始的Servlet中,在doPost方法中進行編寫操做:

 

這樣,咱們就成功的完成了文本消息的接收與響應。實現效果以下,用戶發送任何內容,將會返回各類信息:

 

【附錄】 相關代碼:

1、 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工具類的轉換方法中,返回接收到的Map對象

Map<String, String> map = Message.xmlToMap(request);

//從集合中,獲取XML各個節點的內容

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);//原來【接收消息用戶】變爲回覆時【發送消息用戶】

message.setToUserName(FromUserName);

message.setMsgType("text");

message.setCreateTime(new Date().getTime());//建立當前時間爲消息時間

message.setContent("您好,"+FromUserName+"\n我是:"+ToUserName

+"\n您發送的消息類型爲:"+MsgType+"\n您發送的時間爲"+CreateTime

+"\n我回復的時間爲:"+message.getCreateTime()+"您發送的內容是"+Content);

str = Message.objectToXml(message); //調用Message工具類,將對象轉爲XML字符串

}

} catch (DocumentException e) {

e.printStackTrace();

}

out.print(str); //返回轉換後的XML字符串

out.close();

}

2、 Message處理工具類:

/**

 * 新建方法,將接收到的XML格式,轉化爲Map對象

 * @param request 將request對象,經過參數傳入

 * @return 返回轉換後的Map對象

 */

public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{

Map<String, String> map = new HashMap<String, String>();

//從dom4j的jar包中,拿到SAXReader對象。

SAXReader reader = new SAXReader();

 

InputStream is = request.getInputStream();//從request中,獲取輸入流

Document doc =  reader.read(is);//從reader對象中,讀取輸入流

Element root = doc.getRootElement();//獲取XML文檔的根元素

List<Element> list = root.elements();//得到根元素下的全部子節點

for (Element e : list) {

map.put(e.getName(), e.getText());//遍歷list對象,並將結果保存到集合中

}

 

is.close();

return map;

}

 

/**

 * 將文本消息對象轉化成XML格式

 * @param message 文本消息對象

 * @return 返回轉換後的XML格式

 */

public static String objectToXml(TestMessage message){

XStream xs = new XStream();

//因爲轉換後xml根節點默認爲class類,需轉化爲<xml>

xs.alias("xml", message.getClass());

return xs.toXML(message);

}

3、 TestMessage實體類:

package com.jredu.entity;

 

public class TestMessage {

 

private String ToUserName;

private String FromUserName;

private Long CreateTime;

private String MsgType;

private String Content;

private String MsgId;

 

public String getToUserName() {

return ToUserName;

}

public void setToUserName(String toUserName) {

ToUserName = toUserName;

}

public String getFromUserName() {

return FromUserName;

}

public void setFromUserName(String fromUserName) {

FromUserName = fromUserName;

}

public Long getCreateTime() {

return CreateTime;

}

public void setCreateTime(long l) {

CreateTime = l;

}

public String getMsgType() {

return MsgType;

}

public void setMsgType(String msgType) {

MsgType = msgType;

}

public String getContent() {

return Content;

}

public void setContent(String content) {

Content = content;

}

public String getMsgId() {

return MsgId;

}

public void setMsgId(String msgId) {

MsgId = msgId;

}

public TestMessage(String toUserName, String fromUserName,

Long createTime, String msgType, String content, String msgId) {

super();

ToUserName = toUserName;

FromUserName = fromUserName;

CreateTime = createTime;

MsgType = msgType;

Content = content;

MsgId = msgId;

}

public TestMessage() {

super();

}

}

相關文章
相關標籤/搜索