一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

微信公眾賬號開發(fā)教程第5篇-各種消息的接收與響應(yīng)

 fshell 2013-06-26

前一篇文章里我們已經(jīng)把微信公眾平臺接口中消息及相關(guān)操作都進行了封裝,本章節(jié)將主要介紹如何接收微信服務(wù)器發(fā)送的消息并做出響應(yīng)。


明確在哪接收消息

從微信公眾平臺接口消息指南中可以了解到,當(dāng)用戶向公眾賬號發(fā)消息時,微信服務(wù)器會將消息通過POST方式提交給我們在接口配置信息中填寫的URL,而我們就需要在URL所指向的請求處理類CoreServlet的doPost方法中接收消息、處理消息和響應(yīng)消息。


接收、處理、響應(yīng)消息

下面先來看我已經(jīng)寫好的CoreServlet的完整代碼:

  1. package org.liufeng.course.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import org.liufeng.course.service.CoreService;  
  12. import org.liufeng.course.util.SignUtil;  
  13.   
  14. /** 
  15.  * 核心請求處理類 
  16.  *  
  17.  * @author liufeng 
  18.  * @date 2013-05-18 
  19.  */  
  20. public class CoreServlet extends HttpServlet {  
  21.     private static final long serialVersionUID = 4440739483644821986L;  
  22.   
  23.     /** 
  24.      * 確認(rèn)請求來自微信服務(wù)器 
  25.      */  
  26.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  27.         // 微信加密簽名  
  28.         String signature = request.getParameter("signature");  
  29.         // 時間戳  
  30.         String timestamp = request.getParameter("timestamp");  
  31.         // 隨機數(shù)  
  32.         String nonce = request.getParameter("nonce");  
  33.         // 隨機字符串  
  34.         String echostr = request.getParameter("echostr");  
  35.   
  36.         PrintWriter out = response.getWriter();  
  37.         // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗  
  38.         if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
  39.             out.print(echostr);  
  40.         }  
  41.         out.close();  
  42.         out = null;  
  43.     }  
  44.   
  45.     /** 
  46.      * 處理微信服務(wù)器發(fā)來的消息 
  47.      */  
  48.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  49.         // 將請求、響應(yīng)的編碼均設(shè)置為UTF-8(防止中文亂碼)  
  50.         request.setCharacterEncoding("UTF-8");  
  51.         response.setCharacterEncoding("UTF-8");  
  52.   
  53.         // 調(diào)用核心業(yè)務(wù)類接收消息、處理消息  
  54.         String respMessage = CoreService.processRequest(request);  
  55.           
  56.         // 響應(yīng)消息  
  57.         PrintWriter out = response.getWriter();  
  58.         out.print(respMessage);  
  59.         out.close();  
  60.     }  
  61.   
  62. }  
代碼說明:

1)第51行代碼:微信服務(wù)器POST消息時用的是UTF-8編碼,在接收時也要用同樣的編碼,否則中文會亂碼;

2)第52行代碼:在響應(yīng)消息(回復(fù)消息給用戶)時,也將編碼方式設(shè)置為UTF-8,原理同上;

3)第54行代碼:調(diào)用CoreService類的processRequest方法接收、處理消息,并得到處理結(jié)果;

4)第57~59行:調(diào)用response.getWriter().write()方法將消息的處理結(jié)果返回給用戶

從doPost方法的實現(xiàn)可以看到,它是通過調(diào)用CoreService類的processRequest方法接收、處理消息的,這樣做的目的是為了解耦,即業(yè)務(wù)相關(guān)的操作都不在Servlet里處理,而是完全交由業(yè)務(wù)核心類CoreService去做。下面來看CoreService類的代碼實現(xiàn):

  1. package org.liufeng.course.service;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Map;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import org.liufeng.course.message.resp.TextMessage;  
  7. import org.liufeng.course.util.MessageUtil;  
  8.   
  9. /** 
  10.  * 核心服務(wù)類 
  11.  *  
  12.  * @author liufeng 
  13.  * @date 2013-05-20 
  14.  */  
  15. public class CoreService {  
  16.     /** 
  17.      * 處理微信發(fā)來的請求 
  18.      *  
  19.      * @param request 
  20.      * @return 
  21.      */  
  22.     public static String processRequest(HttpServletRequest request) {  
  23.         String respMessage = null;  
  24.         try {  
  25.             // 默認(rèn)返回的文本消息內(nèi)容  
  26.             String respContent = "請求處理異常,請稍候嘗試!";  
  27.   
  28.             // xml請求解析  
  29.             Map<String, String> requestMap = MessageUtil.parseXml(request);  
  30.   
  31.             // 發(fā)送方賬號(open_id)  
  32.             String fromUserName = requestMap.get("FromUserName");  
  33.             // 公眾賬號  
  34.             String toUserName = requestMap.get("ToUserName");  
  35.             // 消息類型  
  36.             String msgType = requestMap.get("MsgType");  
  37.   
  38.             // 回復(fù)文本消息  
  39.             TextMessage textMessage = new TextMessage();  
  40.             textMessage.setToUserName(fromUserName);  
  41.             textMessage.setFromUserName(toUserName);  
  42.             textMessage.setCreateTime(new Date().getTime());  
  43.             textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);  
  44.             textMessage.setFuncFlag(0);  
  45.   
  46.             // 文本消息  
  47.             if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {  
  48.                 respContent = "您發(fā)送的是文本消息!";  
  49.             }  
  50.             // 圖片消息  
  51.             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {  
  52.                 respContent = "您發(fā)送的是圖片消息!";  
  53.             }  
  54.             // 地理位置消息  
  55.             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {  
  56.                 respContent = "您發(fā)送的是地理位置消息!";  
  57.             }  
  58.             // 鏈接消息  
  59.             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {  
  60.                 respContent = "您發(fā)送的是鏈接消息!";  
  61.             }  
  62.             // 音頻消息  
  63.             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {  
  64.                 respContent = "您發(fā)送的是音頻消息!";  
  65.             }  
  66.             // 事件推送  
  67.             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {  
  68.                 // 事件類型  
  69.                 String eventType = requestMap.get("Event");  
  70.                 // 訂閱  
  71.                 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {  
  72.                     respContent = "謝謝您的關(guān)注!";  
  73.                 }  
  74.                 // 取消訂閱  
  75.                 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {  
  76.                     // TODO 取消訂閱后用戶再收不到公眾號發(fā)送的消息,因此不需要回復(fù)消息  
  77.                 }  
  78.                 // 自定義菜單點擊事件  
  79.                 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {  
  80.                     // TODO 自定義菜單權(quán)沒有開放,暫不處理該類消息  
  81.                 }  
  82.             }  
  83.   
  84.             textMessage.setContent(respContent);  
  85.             respMessage = MessageUtil.textMessageToXml(textMessage);  
  86.         } catch (Exception e) {  
  87.             e.printStackTrace();  
  88.         }  
  89.   
  90.         return respMessage;  
  91.     }  
  92. }  

代碼說明:

1)第29行:調(diào)用消息工具類MessageUtil解析微信發(fā)來的xml格式的消息,解析的結(jié)果放在HashMap里;

2)32~36行:從HashMap中取出消息中的字段;

3)39-44、84行:組裝要返回的文本消息對象;

4)47~82行:演示了如何接收微信發(fā)送的各類型的消息,根據(jù)MsgType判斷屬于哪種類型的消息;

5)85行:調(diào)用消息工具類MessageUtil將要返回的文本消息對象TextMessage轉(zhuǎn)化成xml格式的字符串;


關(guān)于事件推送(關(guān)注、取消關(guān)注、菜單點擊)

對于消息類型的判斷,像文本消息、圖片消息、地理位置消息、鏈接消息和語音消息都比較好理解,有很多剛接觸的朋友搞不懂事件推送消息有什么用,或者不清楚該如何判斷用戶關(guān)注的消息。那我們就專門來看下事件推送,下圖是官方消息接口文檔中關(guān)于事件推送的說明:

這里我們只要關(guān)心兩個參數(shù):MsgType和Event。當(dāng)MsgType=event時,就表示這是一條事件推送消息;而Event表示事件類型,包括訂閱、取消訂閱和自定義菜單點擊事件。也就是說,無論用戶是關(guān)注了公眾賬號、取消對公眾賬號的關(guān)注,還是在使用公眾賬號的菜單,微信服務(wù)器都會發(fā)送一條MsgType=event的消息給我們,而至于具體這條消息表示關(guān)注、取消關(guān)注,還是菜單的點擊事件,就需要通過Event的值來判斷了。(注意區(qū)分Event和event)


連載五篇教程總結(jié)

經(jīng)過5篇的講解,已經(jīng)把開發(fā)模式啟用,接口配置,消息相關(guān)工具類的封裝,消息的接收與響應(yīng)全部講解完了,而且貼上了完整的源代碼,相信有一定Java基礎(chǔ)的朋友可以看的明白,能夠通過系列文章基本掌握微信公眾平臺開發(fā)的相關(guān)技術(shù)知識。下面我把目前項目的完整結(jié)構(gòu)貼出,方便大家對照:

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美日韩精品人妻二区三区| 欧美多人疯狂性战派对| 久久精品国产99精品亚洲| 国产精品一区二区三区日韩av| 免费在线成人午夜视频| 黄片美女在线免费观看| 中文字幕日韩精品人一妻| 女人精品内射国产99| 国产又爽又猛又粗又色对黄| 国产欧美日韩不卡在线视频| 国产av熟女一区二区三区四区| 亚洲精品成人综合色在线| 成人日韩在线播放视频| 大香蕉伊人精品在线观看| 国产成人人人97超碰熟女| 欧美韩日在线观看一区| 精品人妻久久一品二品三品| 婷婷开心五月亚洲综合| 欧美成人欧美一级乱黄| 国产亚洲午夜高清国产拍精品| 亚洲av专区在线观看| 日本欧美在线一区二区三区| 欧美精品在线观看国产| 中文字幕欧美视频二区| 午夜精品在线观看视频午夜| 国产乱淫av一区二区三区| 东京热电东京热一区二区三区| 亚洲精品福利视频在线观看| 91亚洲国产—区=区a| 国产一级片内射视频免费播放| 国产超薄黑色肉色丝袜| 亚洲高清中文字幕一区二三区| 好吊日在线视频免费观看| 日本欧美视频在线观看免费 | 久久久精品日韩欧美丰满 | 欧美一级黄片免费视频| 99久久精品一区二区国产| 国产精品亚洲一区二区| 五月天综合网五月天综合网| 日韩午夜老司机免费视频| 国产午夜福利片在线观看|