歡迎加入群:114196246 進行討論相互交流 我的微信號:572839485
圖床:沒有服務器 拖拽圖片 外網即可訪問
http://2.crazyflower.duapp.com/home
前一篇文章里我們已經把微信公眾平台接口中消息及相關操作都進行了封裝,本章節將主要介紹如何接收微信服務器發送的消息並做出響應。
當用戶向公眾帳號發消息時,微信服務器會將消息通過POST方式提交給我們在接口配置信息中填寫的URL,而我們就需要在URL所指向的請求處理類的doPost方法中接收消息、處理消息和響應消息。
接收、處理、響應消息
1 package com.javen.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 com.javen.course.service.CrazyService; 12 import com.javen.course.util.SignUtil; 13 14 /** 15 * 核心請求處理類 16 * @author Javen 17 * @Email zyw205@gmail.com 18 * 19 */ 20 public class CrazyServlet extends HttpServlet { 21 22 private static final long serialVersionUID = -5021188348833856475L; 23 @Override 24 protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 25 // 微信加密簽名 26 String signature = request.getParameter("signature"); 27 // 時間戳 28 String timestamp = request.getParameter("timestamp"); 29 // 隨機數 30 String nonce = request.getParameter("nonce"); 31 // 隨機字符串 32 String echostr = request.getParameter("echostr"); 33 PrintWriter out = response.getWriter(); 34 // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗 35 if (SignUtil.checkSignature(signature, timestamp, nonce)) { 36 out.print(echostr); 37 } 38 out.close(); 39 out = null; 40 } 41 42 43 @Override 44 protected void doPost(HttpServletRequest request, HttpServletResponse response) 45 throws ServletException, IOException { 46 // 將請求、響應的編碼均設置為UTF-8(防止中文亂碼) 47 request.setCharacterEncoding("UTF-8"); 48 response.setCharacterEncoding("UTF-8"); 49 // 調用核心業務類接收消息、處理消息 50 String respMessage = CrazyService.processRequest(request); 51 52 // 響應消息 53 PrintWriter out = response.getWriter(); 54 out.print(respMessage); 55 out.close(); 56 } 57 }
注意:
1)第54行代碼:調用CrazyService類的processRequest方法接收、處理消息,並得到處理結果;
2)第53~55行:調用response.getWriter().write()方法將消息的處理結果(XML)返回給用戶
CrazyService.processRequest 類如下
1 public static String processRequest(HttpServletRequest request) { 2 String respMessage = null; 3 try { 4 // 默認返回的文本消息內容 5 String respContent = "請求處理異常,請稍候嘗試!"; 6 7 // xml請求解析 8 Map<String, String> requestMap = MessageUtil.parseXml(request); 9 10 // 發送方帳號(open_id) 11 String fromUserName = requestMap.get("FromUserName"); 12 // 公眾帳號 13 String toUserName = requestMap.get("ToUserName"); 14 // 消息類型 15 String msgType = requestMap.get("MsgType"); 16 17 // 回復文本消息 18 TextMessage textMessage = new TextMessage(); 19 textMessage.setToUserName(fromUserName); 20 textMessage.setFromUserName(toUserName); 21 textMessage.setCreateTime(new Date().getTime()); 22 textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); 23 textMessage.setFuncFlag(0); 24 25 // 文本消息 26 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { 27 respContent = "您發送的是文本消息!"; 28 } 29 // 圖片消息 30 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { 31 respContent = "您發送的是圖片消息!"; 32 } 33 // 地理位置消息 34 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { 35 respContent = "您發送的是地理位置消息!"; 36 } 37 // 鏈接消息 38 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { 39 respContent = "您發送的是鏈接消息!"; 40 } 41 // 音頻消息 42 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { 43 respContent = "您發送的是音頻消息!"; 44 } 45 // 事件推送 46 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { 47 // 事件類型 48 String eventType = requestMap.get("Event"); 49 // 訂閱 50 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { 51 respContent = "感謝您的關注!"; 52 } 53 // 取消訂閱 54 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { 55 // TODO 取消訂閱后用戶再收不到公眾號發送的消息,因此不需要回復消息 56 } 57 // 自定義菜單點擊事件 58 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) { 59 // TODO 自定義菜單權沒有開放,暫不處理該類消息 60 } 61 } 62 63 textMessage.setContent(respContent); 64 respMessage = MessageUtil.textMessageToXml(textMessage); 65 } catch (Exception e) { 66 e.printStackTrace(); 67 } 68 69 return respMessage; 70 }
我的微信公眾賬號 人臉識別、音樂點播、在線翻譯、天氣查詢、公交查詢、周公解夢、星座運勢、手機歸屬地查詢、聊天嘮嗑等
歡迎加入群:347245650 345531810 進行討論相互交流 我的微信號:572839485
我的微信公眾賬號 我的微社區歡迎關注
博客中所有關於微信源碼下載地址 http://download.csdn.net/detail/zyw_java/8633415