微信公眾帳號開發教程第7篇-各種消息的接收與響應------- 此項目的源碼在文章的末尾


歡迎加入群: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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM