微信开发(02)之处理微信客户端发来的消息
在上一篇微信開發的博文中微信開發(01)之如何成為開發者,我們開啟了微信開發者模式,本篇博文我們簡單的處理微信關注者發給我們公眾號的消息。
在開啟微信開發者模式時,我們配置了一個URL地址,當我們提交開啟微信開發者模式,騰訊的微信服務器會向該URL地址發送一個get請求,并且攜帶一些參數,讓我們來驗證。說到get請求,就必須說到post請求,關注我們公眾號的微信粉絲發來的消息,觸發的事件,騰訊的微信服務器則會像該URL地址發送一個post請求,請求的內容就是以xml文檔形式的字符串。
所以該URL地址的get請求的處理方法,專門用于開啟微信開發者模式;而post請求則用于處理微信粉絲發給我們的消息,或者觸發的事件,所以我們后面的微信開發工作的起點就是該URL地址的post處理方法。
下面我們處理一個最簡單的例子:粉絲發送任意一個文本信息給我們,我們給他回復一個消息:“你好,+ 他微信的openId”
下面直接貼代碼:
URL對應的處理servlet:
public class CoreServlet extends HttpServlet {private static final long serialVersionUID = 4440739483644821986L;/*** 請求校驗(確認請求來自微信服務器)*/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();// 請求校驗,若校驗成功則原樣返回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 signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");PrintWriter out = response.getWriter();// 請求校驗if (SignUtil.checkSignature(signature, timestamp, nonce)) {Message msgObj = XMLUtil.getMessageObject(request); // 讀取微信客戶端發來的消息(xml字符串),并將其轉換為消息對象if(msgObj != null){String xml = "<xml>" +"<ToUserName><![CDATA[" + msgObj.getFromUserName() + "]]></ToUserName>" + // 接收方帳號(收到的OpenID)"<FromUserName><![CDATA[" + msgObj.getToUserName() + "]]></FromUserName>" + // 開發者微信號"<CreateTime>12345678</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[你好,"+ msgObj.getFromUserName() +"]]></Content>" +"</xml>";out.write(xml); // 回復微信客戶端的消息(xml字符串)out.close();return;}}out.write("");out.close();} }?xml字符串的處理工具類,實現xml消息到消息對象的轉換:
public class XMLUtil {/*** 從request中讀取用戶發給公眾號的消息內容* @param request* @return 用戶發給公眾號的消息內容* @throws IOException*/public static String readRequestContent(HttpServletRequest request) throws IOException{// 從輸入流讀取返回內容InputStream inputStream = request.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuilder buffer = new StringBuilder();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 釋放資源bufferedReader.close();inputStreamReader.close();inputStream.close();return buffer.toString();}/*** 將xml文檔的內容轉換成map* @param xmlDoc* @return map*/public static Map<String, String> xmlToMap(String xmlDoc){//創建一個新的字符串StringReader read = new StringReader(xmlDoc);//創建新的輸入源SAX 解析器將使用 InputSource 對象來確定如何讀取 XML 輸入InputSource source = new InputSource(read);//創建一個新的SAXBuilderSAXBuilder sb = new SAXBuilder();Map<String, String> xmlMap = new HashMap<String, String>();try {Document doc = sb.build(source); //通過輸入源構造一個DocumentElement root = doc.getRootElement(); //取的根元素List<Element> cNodes = root.getChildren(); //得到根元素所有子元素的集合(根元素的子節點,不包括孫子節點)Element et = null;for(int i=0;i<cNodes.size();i++){et = (Element) cNodes.get(i); //循環依次得到子元素xmlMap.put(et.getName(), et.getText());}} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return xmlMap;}/*** 將保存xml內容的map轉換成對象* @param map* @return*/public static Message getMessageObject(Map<String, String> map){if(map != null){String MsgType = map.get("MsgType");// 消息類型(文本消息:text, 圖片消息:image, 語音消息:voice, 視頻消息:video, // 地理位置消息:location, 鏈接消息:link)if("text".equals(MsgType)){TextMessage msg = new TextMessage();XMLUtil.initCommonMsg(msg, map);msg.setContent(map.get("Content"));return msg;}if("ImageMessage".equals(MsgType)){ImageMessage msg = new ImageMessage();XMLUtil.initCommonMsg(msg, map);msg.setPicUrl(map.get("PicUrl"));msg.setMediaId(map.get("MediaId"));return msg;}if("video".equals(MsgType)){VideoMessage msg = new VideoMessage();XMLUtil.initCommonMsg(msg, map);msg.setMediaId(map.get("MediaId"));msg.setThumbMediaId(map.get("ThumbMediaId"));return msg;}if("voice".equals(MsgType)){VoiceMessage msg = new VoiceMessage();XMLUtil.initCommonMsg(msg, map);msg.setMediaId(map.get("MediaId"));msg.setFormat(map.get("Format"));return msg;}if("location".equals(MsgType)){LocationMessage msg = new LocationMessage();msg.setLocation_X(map.get("Location_X"));msg.setLocation_Y(map.get("Location_Y"));msg.setScale(map.get("Scale"));msg.setLabel(map.get("Label"));return msg;}if("link".equals(MsgType)){LinkMessage msg = new LinkMessage();XMLUtil.initCommonMsg(msg, map);msg.setTitle(map.get("Title"));msg.setDescription(map.get("Description"));msg.setUrl(map.get("Url"));return msg;}}return null;}/*** 將保存xml內容的map轉換成對象* @param map* @return* @throws IOException */public static Message getMessageObject(HttpServletRequest request) throws IOException{String xmlDoc = XMLUtil.readRequestContent(request); // 讀取微信客戶端發了的消息(xml)Map<String, String> map = XMLUtil.xmlToMap(xmlDoc); // 將客戶端發來的xml轉換成Mapif(map != null){String MsgType = map.get("MsgType");// 消息類型(文本消息:text, 圖片消息:image, 語音消息:voice, 視頻消息:video, // 地理位置消息:location, 鏈接消息:link)if("text".equals(MsgType)){TextMessage msg = new TextMessage();XMLUtil.initCommonMsg(msg, map);msg.setContent(map.get("Content"));return msg;}/*if("ImageMessage".equals(MsgType)){ImageMessage msg = new ImageMessage();XMLUtil.initCommonMsg(msg, map);msg.setPicUrl(map.get("PicUrl"));msg.setMediaId(map.get("MediaId"));return msg;}if("video".equals(MsgType)){VideoMessage msg = new VideoMessage();XMLUtil.initCommonMsg(msg, map);msg.setMediaId(map.get("MediaId"));msg.setThumbMediaId(map.get("ThumbMediaId"));return msg;}if("voice".equals(MsgType)){VoiceMessage msg = new VoiceMessage();XMLUtil.initCommonMsg(msg, map);msg.setMediaId(map.get("MediaId"));msg.setFormat(map.get("Format"));return msg;}if("location".equals(MsgType)){LocationMessage msg = new LocationMessage();msg.setLocation_X(map.get("Location_X"));msg.setLocation_Y(map.get("Location_Y"));msg.setScale(map.get("Scale"));msg.setLabel(map.get("Label"));return msg;}if("link".equals(MsgType)){LinkMessage msg = new LinkMessage();XMLUtil.initCommonMsg(msg, map);msg.setTitle(map.get("Title"));msg.setDescription(map.get("Description"));msg.setUrl(map.get("Url"));return msg;}*/}return null;}public static void initCommonMsg(Message msg, Map<String, String> map){msg.setMsgId(map.get("MsgId"));msg.setMsgType(map.get("MsgType"));msg.setToUserName(map.get("ToUserName"));msg.setFromUserName(map.get("FromUserName"));msg.setCreateTime(map.get("CreateTime"));} }?粉絲發來的消息分為了6中類型(文本消息, 圖片消息, 語音消息, 視頻消息, 地理位置消息, 鏈接消息):
/*** 微信消息基類* @author yuanfang* @date 2015-03-23*/ public class Message {private String MsgId; // 消息id,64位整型private String MsgType; // 消息類型(文本消息:text, 圖片消息:image, 語音消息:voice, 視頻消息:video, 地理位置消息:location, 鏈接消息:link)private String ToUserName; //開發者微信號private String FromUserName; // 發送方帳號(一個OpenID)private String CreateTime; // 消息創建時間 (整型)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 String getCreateTime() {return CreateTime;}public void setCreateTime(String createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}public String getMsgId() {return MsgId;}public void setMsgId(String msgId) {MsgId = msgId;}}?文本消息類:
package com.sinaapp.wx.msg;public class TextMessage extends Message {private String Content; // 文本消息內容public String getContent() {return Content;}public void setContent(String content) {Content = content;}}?OK,對粉絲發送給我們公眾號的任意的文本消息的最簡單處理就完成,我們簡單的回復他:你好,然后加上他微信的openId,類似于:你好,orJydljfkg3-r0_dj3rkdfvjl
?
總結
以上是生活随笔為你收集整理的微信开发(02)之处理微信客户端发来的消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS 学习笔记 2015-03-22
- 下一篇: POI 使用替换字符方式进行模板生成wo