亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

第四篇:微信公眾平臺開發實戰Java版之完成消息接受與相應以及消息的處理

2019-11-14 15:31:54
字體:
來源:轉載
供稿:網友

溫馨提示:

     這篇文章是依賴前幾篇的文章的。

     第一篇:微信公眾平臺開發實戰之了解微信公眾平臺基礎知識以及資料準備

     第二篇 :微信公眾平臺開發實戰之開啟開發者模式,接入微信公眾平臺開發

     第三篇 :微信公眾平臺開發實戰之請求消息,響應消息以及事件消息類的封裝

 

 

首先,我們看看原來寫的dopost方法:

 

/**     * 處理微信服務器發來的消息     */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // TODO 消息的接收、處理、響應    }

 

doPost方法有兩個參數:

   1.request中封裝了請求相關的所有內容,可以從request中取出微信服務器發來的消息;

   2.response我們可以對接收到的消息進行響應,即發送消息。

 

一、解析微信服務器傳來的消息

因為微信服務器發送過來的是xml格式的消息,所以我們可以采用 開源框架dom4j去解析xml 。

所用到的jar 包是:dom4j-1.6.1.jar  

官網下載地址:http://www.dom4j.org/dom4j-1.6.1/

網盤下載地址:http://yunpan.cn/cQyR8KkIXxHXn  訪問密碼 0f2e

 

二、將響應消息轉換成xml返回給微信服務器

 

如何將響應消息轉換成xml返回的問題,這里我們將  采用開源框架xstream來實現java類到xml的轉換

所用到的jar包為:xstream-1.3.1.jar

網盤下載地址:http://yunpan.cn/cQyBU2vTYAe2f  訪問密碼 ad36

 

封裝消息處理工具:

 

package com.souvc.weixin.util;import java.io.InputStream;import java.io.Writer;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;import com.souvc.weixin.message.resp.Article;import com.souvc.weixin.message.resp.ImageMessage;import com.souvc.weixin.message.resp.MusicMessage;import com.souvc.weixin.message.resp.NewsMessage;import com.souvc.weixin.message.resp.TextMessage;import com.souvc.weixin.message.resp.VideoMessage;import com.souvc.weixin.message.resp.VoiceMessage;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.core.util.QuickWriter;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import com.thoughtworks.xstream.io.xml.PRettyPrintWriter;import com.thoughtworks.xstream.io.xml.XppDriver;/*** 類名: MessageUtil </br>* 描述: 消息處理工具類</br>* 開發人員: souvc </br>* 創建時間:  2015-9-30 </br>* 發布版本:V1.0  </br> */public class MessageUtil {    // 請求消息類型:文本    public static final String REQ_MESSAGE_TYPE_TEXT = "text";    // 請求消息類型:圖片    public static final String REQ_MESSAGE_TYPE_IMAGE = "image";    // 請求消息類型:語音    public static final String REQ_MESSAGE_TYPE_VOICE = "voice";    // 請求消息類型:視頻    public static final String REQ_MESSAGE_TYPE_VIDEO = "video";    // 請求消息類型:小視頻    public static final String REQ_MESSAGE_TYPE_SHORTVIDEO = "shortvideo";    // 請求消息類型:地理位置    public static final String REQ_MESSAGE_TYPE_LOCATION = "location";    // 請求消息類型:鏈接    public static final String REQ_MESSAGE_TYPE_LINK = "link";    // 請求消息類型:事件推送    public static final String REQ_MESSAGE_TYPE_EVENT = "event";    // 事件類型:subscribe(訂閱)    public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";    // 事件類型:unsubscribe(取消訂閱)    public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";    // 事件類型:scan(用戶已關注時的掃描帶參數二維碼)    public static final String EVENT_TYPE_SCAN = "scan";    // 事件類型:LOCATION(上報地理位置)    public static final String EVENT_TYPE_LOCATION = "LOCATION";    // 事件類型:CLICK(自定義菜單)    public static final String EVENT_TYPE_CLICK = "CLICK";    // 響應消息類型:文本    public static final String RESP_MESSAGE_TYPE_TEXT = "text";    // 響應消息類型:圖片    public static final String RESP_MESSAGE_TYPE_IMAGE = "image";    // 響應消息類型:語音    public static final String RESP_MESSAGE_TYPE_VOICE = "voice";    // 響應消息類型:視頻    public static final String RESP_MESSAGE_TYPE_VIDEO = "video";    // 響應消息類型:音樂    public static final String RESP_MESSAGE_TYPE_MUSIC = "music";    // 響應消息類型:圖文    public static final String RESP_MESSAGE_TYPE_NEWS = "news";    /**     * 解析微信發來的請求(XML)     *      * @param request     * @return Map<String, String>     * @throws Exception     */    @SuppressWarnings("unchecked")    public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {        // 將解析結果存儲在HashMap中        Map<String, String> map = new HashMap<String, String>();        // 從request中取得輸入流        InputStream inputStream = request.getInputStream();        // 讀取輸入流        SAXReader reader = new SAXReader();        Document document = reader.read(inputStream);        // 得到xml根元素        Element root = document.getRootElement();        // 得到根元素的所有子節點        List<Element> elementList = root.elements();        // 遍歷所有子節點        for (Element e : elementList)            map.put(e.getName(), e.getText());        // 釋放資源        inputStream.close();        inputStream = null;        return map;    }    /**     * 擴展xstream使其支持CDATA     */    private static XStream xstream = new XStream(new XppDriver() {        public HierarchicalStreamWriter createWriter(Writer out) {            return new PrettyPrintWriter(out) {                // 對所有xml節點的轉換都增加CDATA標記                boolean cdata = true;                @SuppressWarnings("unchecked")                public void startNode(String name, Class clazz) {                    super.startNode(name, clazz);                }                protected void writeText(QuickWriter writer, String text) {                    if (cdata) {                        writer.write("<![CDATA[");                        writer.write(text);                        writer.write("]]>");                    } else {                        writer.write(text);                    }                }            };        }    });    /**     * 文本消息對象轉換成xml     *      * @param textMessage 文本消息對象     * @return xml     */    public static String messageToXml(TextMessage textMessage) {        xstream.alias("xml", textMessage.getClass());        return xstream.toXML(textMessage);    }    /**     * 圖片消息對象轉換成xml     *      * @param imageMessage 圖片消息對象     * @return xml     */    public static String messageToXml(ImageMessage imageMessage) {        xstream.alias("xml", imageMessage.getClass());        return xstream.toXML(imageMessage);    }    /**     * 語音消息對象轉換成xml     *      * @param voiceMessage 語音消息對象     * @return xml     */    public static String messageToXml(VoiceMessage voiceMessage) {        xstream.alias("xml", voiceMessage.getClass());        return xstream.toXML(voiceMessage);    }    /**     * 視頻消息對象轉換成xml     *      * @param videoMessage 視頻消息對象     * @return xml     */    public static String messageToXml(VideoMessage videoMessage) {        xstream.alias("xml", videoMessage.getClass());        return xstream.toXML(videoMessage);    }    /**     * 音樂消息對象轉換成xml     *      * @param musicMessage 音樂消息對象     * @return xml     */    public static String messageToXml(MusicMessage musicMessage) {        xstream.alias("xml", musicMessage.getClass());        return xstream.toXML(musicMessage);    }    /**     * 圖文消息對象轉換成xml     *      * @param newsMessage 圖文消息對象     * @return xml     */    public static String messageToXml(NewsMessage newsMessage) {        xstream.alias("xml", newsMessage.getClass());        xstream.alias("item", new Article().getClass());        return xstream.toXML(newsMessage);    }}

 

使用CoreServlet 類完成消息的接受與響應:

 

package com.souvc.weixin.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.souvc.weixin.service.CoreService;import com.souvc.weixin.util.SignUtil;/** * 類名: CoreServlet </br>  * 描述: 來接收微信服務器傳來信息 </br>  * 開發人員: souvc</br>  * 創建時間:2015-9-29 </br>  * 發布版本:V1.0 </br> */public class CoreServlet extends HttpServlet {    private static final long serialVersionUID = 4323197796926899691L;    /**     * 確認請求來自微信服務器     */    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {                // 微信加密簽名        String signature = request.getParameter("signature");        // 時間戳        String timestamp = request.getParameter("timestamp");        // 隨機數        String nonce = request.getParameter("nonce");        // 隨機字符串        String echostr = request.getParameter("echostr");        PrintWriter out = response.getWriter();                // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗        if (SignUtil.checkSignature(signature, timestamp, nonce)) {            out.print(echostr);        }                out.close();        out = null;    }    /**     * 處理微信服務器發來的消息     */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // 消息的接收、處理、響應        // 將請求、響應的編碼均設置為UTF-8(防止中文亂碼)        request.setCharacterEncoding("UTF-8");        response.setCharacterEncoding("UTF-8");        // 調用核心業務類接收消息、處理消息        String respXml = CoreService.processRequest(request);        // 響應消息        PrintWriter out = response.getWriter();        out.print(respXml);        out.close();    }}

 

使用CoreService類完成消息的處理:

 

package com.souvc.weixin.service;import java.util.Date;import java.util.Map;import javax.servlet.http.HttpServletRequest;import com.souvc.weixin.message.resp.TextMessage;import com.souvc.weixin.util.MessageUtil;/*** 類名: CoreService </br>* 描述: 核心服務類 </br>* 開發人員: souvc </br>* 創建時間:  2015-9-30 </br>* 發布版本:V1.0  </br> */public class CoreService {    /**     * 處理微信發來的請求     * @param request     * @return xml     */    public static String processRequest(HttpServletRequest request) {        // xml格式的消息數據        String respXml = null;        // 默認返回的文本消息內容        String respContent = "未知的消息類型!";        try {            // 調用parseXml方法解析請求消息            Map<String, String> requestMap = MessageUtil.parseXml(request);            // 發送方帳號            String fromUserName = requestMap.get("FromUserName");            // 開發者微信號            String toUserName = requestMap.get("ToUserName");            // 消息類型            String msgType = requestMap.get("MsgType");            // 回復文本消息            TextMessage textMessage = new TextMessage();            textMessage.setToUserName(fromUserName);            textMessage.setFromUserName(toUserName);            textMessage.setCreateTime(new Date().getTime());            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);            // 文本消息            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {                respContent = "您發送的是文本消息!";            }            // 圖片消息            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {                respContent = "您發送的是圖片消息!";            }            // 語音消息            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {                respContent = "您發送的是語音消息!";            }            // 視頻消息            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) {                respContent = "您發送的是視頻消息!";            }            // 視頻消息            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_SHORTVIDEO)) {                respContent = "您發送的是小視頻消息!";            }            // 地理位置消息            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {                respContent = "您發送的是地理位置消息!";            }            // 鏈接消息            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {                respContent = "您發送的是鏈接消息!";            }            // 事件推送            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {                // 事件類型                String eventType = requestMap.get("Event");                // 關注                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {                    respContent = "謝謝您的關注!";                }                // 取消關注                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {                    // TODO 取消訂閱后用戶不會再收到公眾賬號發送的消息,因此不需要回復                }                // 掃描帶參數二維碼                else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {                    // TODO 處理掃描帶參數二維碼事件                }                // 上報地理位置                else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {                    // TODO 處理上報地理位置事件                }                // 自定義菜單                else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {                    // TODO 處理菜單點擊事件                }            }            // 設置文本消息的內容            textMessage.setContent(respContent);            // 將文本消息對象轉換成xml            respXml = MessageUtil.messageToXml(textMessage);        } catch (Exception e) {            e.printStackTrace();        }        return respXml;    }}

 

然后部署到我們的BAE上面,體驗一下。(部署方法請參照 第二篇 :微信公眾平臺開發實戰之開啟開發者模式,接入微信公眾平臺開發)。

 

效果如下:

 

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产ts人妖一区二区三区| 中文字幕精品一区久久久久| 午夜精品国产精品大乳美女| 亚洲午夜精品久久久久久久久久久久| 在线播放国产精品| 国内久久久精品| 欧美日韩xxx| 欧美理论电影在线观看| 亚洲免费av网址| 一区二区国产精品视频| 国产精品久久久久久久美男| 这里只有精品视频在线| 国产亚洲精品91在线| 日韩电影中文字幕一区| 日韩va亚洲va欧洲va国产| 精品国产精品自拍| 在线观看中文字幕亚洲| 欧美精品在线免费| 欧美日韩成人在线视频| 日韩av最新在线观看| 亚洲成人激情图| 中文字幕欧美精品在线| 久久精品国产亚洲一区二区| 久久成年人视频| 超碰91人人草人人干| www.久久久久久.com| 亚洲久久久久久久久久| 欧美一级片久久久久久久| 欧美在线视频免费| 深夜福利国产精品| 自拍偷拍免费精品| 一区二区三区美女xx视频| 欧美激情第99页| 国产福利精品av综合导导航| 亚洲精品国产suv| 91精品久久久久久久久久久久久久| 色久欧美在线视频观看| 情事1991在线| 91精品国产综合久久香蕉| 岛国av午夜精品| 亚洲第一福利在线观看| 国产精品久久久久久久久久久不卡| 日本中文字幕不卡免费| 亚洲图片欧美午夜| 欧美激情国产精品| 国产视频精品va久久久久久| 欧美巨大黑人极品精男| 亚洲国产成人在线播放| 欧美成人亚洲成人日韩成人| 国产91露脸中文字幕在线| 国产91精品久久久| 日本电影亚洲天堂| 国产精品久久久久久久app| 国产免费久久av| 午夜精品久久久久久久99黑人| 九九九久久国产免费| 日韩在线观看免费av| 精品久久久久久久久久久久| 欧美资源在线观看| 亚洲国产精品久久久久秋霞蜜臀| 成人网在线免费看| 国产在线视频91| 日韩欧美国产中文字幕| 欧美尤物巨大精品爽| 国产精品激情av电影在线观看| 尤物tv国产一区| 成人黄色在线免费| 欧美激情网站在线观看| 国产精品美女www| 热99精品只有里视频精品| 91精品国产精品| 欧美性xxxx极品hd欧美风情| 日本不卡高字幕在线2019| 亚洲精品永久免费| 亚洲黄色片网站| 成人在线激情视频| 成人免费看片视频| 欧美久久精品一级黑人c片| 亚洲欧美一区二区精品久久久| 在线观看欧美视频| 欧美日韩综合视频网址| 国产深夜精品福利| 久久久久久久久久久91| 欧美精品在线播放| 欧美在线观看网址综合| 亚洲国产精品久久久久久| 亚洲精品久久久久中文字幕欢迎你| 欧美二区在线播放| 亚洲国产私拍精品国模在线观看| 九九热这里只有精品6| 亚洲xxxx在线| 久久久久久久久久久免费| 欧美日韩在线免费| 欧美性受xxxx白人性爽| 日韩欧亚中文在线| 欧美性猛交视频| 亚洲欧美日韩天堂一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美高清电影在线看| 日韩精品在线免费观看视频| 91精品在线播放| 午夜剧场成人观在线视频免费观看| 日韩黄色av网站| 91亚洲一区精品| 2019av中文字幕| 最近2019年日本中文免费字幕| 成人免费观看网址| 日韩高清中文字幕| 国产aⅴ夜夜欢一区二区三区| 国产精品福利久久久| 97精品视频在线观看| 久久精品国产久精国产思思| 91网站免费观看| 久久久久久国产精品久久| 日韩欧美福利视频| 亚洲va欧美va国产综合久久| 精品视频中文字幕| 欧美精品做受xxx性少妇| 久久天天躁日日躁| 久久久精品视频在线观看| 国产精品欧美一区二区| 久久精品国产99国产精品澳门| 国产精品久久视频| 久久久精品视频成人| 在线精品国产成人综合| 川上优av一区二区线观看| 国产亚洲精品美女久久久久| 91在线无精精品一区二区| 日韩欧美国产一区二区| 欧美裸体xxxx| 国产999精品| 国产精品视频自拍| 欧美夫妻性生活xx| 国产日韩综合一区二区性色av| 成人免费视频97| 亚洲精品日韩欧美| 亚洲在线观看视频网站| 国内偷自视频区视频综合| 日韩精品视频中文在线观看| 91人人爽人人爽人人精88v| 亚洲精品suv精品一区二区| 久久久精品中文字幕| 日韩欧美成人网| 国产一区二区精品丝袜| 4k岛国日韩精品**专区| 国产成人亚洲综合青青| 欧美大成色www永久网站婷| 色综合久久精品亚洲国产| 欧美日韩国产va另类| 亚洲三级 欧美三级| 国产精品91视频| 亚洲欧美国产日韩天堂区| 亚洲电影成人av99爱色| 97超碰蝌蚪网人人做人人爽| 欧美日韩国内自拍| 成人黄色免费看| 久久中文字幕一区| 亚洲精品资源在线| 欧美激情精品久久久久久久变态| 欧美日韩久久久久| 精品亚洲一区二区三区四区五区| 久久人人爽人人爽人人片av高清| 91在线视频九色| 在线亚洲男人天堂|