日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

微信开发(02)之处理微信客户端发来的消息

發(fā)布時(shí)間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信开发(02)之处理微信客户端发来的消息 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一篇微信開(kāi)發(fā)的博文中微信開(kāi)發(fā)(01)之如何成為開(kāi)發(fā)者,我們開(kāi)啟了微信開(kāi)發(fā)者模式,本篇博文我們簡(jiǎn)單的處理微信關(guān)注者發(fā)給我們公眾號(hào)的消息。

在開(kāi)啟微信開(kāi)發(fā)者模式時(shí),我們配置了一個(gè)URL地址,當(dāng)我們提交開(kāi)啟微信開(kāi)發(fā)者模式,騰訊的微信服務(wù)器會(huì)向該URL地址發(fā)送一個(gè)get請(qǐng)求,并且攜帶一些參數(shù),讓我們來(lái)驗(yàn)證。說(shuō)到get請(qǐng)求,就必須說(shuō)到post請(qǐng)求,關(guān)注我們公眾號(hào)的微信粉絲發(fā)來(lái)的消息,觸發(fā)的事件,騰訊的微信服務(wù)器則會(huì)像該URL地址發(fā)送一個(gè)post請(qǐng)求,請(qǐng)求的內(nèi)容就是以xml文檔形式的字符串。

所以該URL地址的get請(qǐng)求的處理方法,專門(mén)用于開(kāi)啟微信開(kāi)發(fā)者模式;而post請(qǐng)求則用于處理微信粉絲發(fā)給我們的消息,或者觸發(fā)的事件,所以我們后面的微信開(kāi)發(fā)工作的起點(diǎn)就是該URL地址的post處理方法。

下面我們處理一個(gè)最簡(jiǎn)單的例子:粉絲發(fā)送任意一個(gè)文本信息給我們,我們給他回復(fù)一個(gè)消息:“你好,+ 他微信的openId”

下面直接貼代碼:

URL對(duì)應(yīng)的處理servlet:

public class CoreServlet extends HttpServlet {private static final long serialVersionUID = 4440739483644821986L;/*** 請(qǐng)求校驗(yàn)(確認(rèn)請(qǐng)求來(lái)自微信服務(wù)器)*/public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 微信服務(wù)端發(fā)來(lái)的加密簽名String signature = request.getParameter("signature");// 時(shí)間戳String timestamp = request.getParameter("timestamp");// 隨機(jī)數(shù)String nonce = request.getParameter("nonce");// 隨機(jī)字符串String echostr = request.getParameter("echostr");PrintWriter out = response.getWriter();// 請(qǐng)求校驗(yàn),若校驗(yàn)成功則原樣返回echostr,表示接入成功,否則接入失敗if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}out.close();out = null;}/*** 請(qǐng)求校驗(yàn)與處理*/public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 將請(qǐng)求、響應(yīng)的編碼均設(shè)置為UTF-8(防止中文亂碼)request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");// 接收參數(shù)微信加密簽名、 時(shí)間戳、隨機(jī)數(shù)String signature = request.getParameter("signature");String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce");PrintWriter out = response.getWriter();// 請(qǐng)求校驗(yàn)if (SignUtil.checkSignature(signature, timestamp, nonce)) {Message msgObj = XMLUtil.getMessageObject(request); // 讀取微信客戶端發(fā)來(lái)的消息(xml字符串),并將其轉(zhuǎn)換為消息對(duì)象if(msgObj != null){String xml = "<xml>" +"<ToUserName><![CDATA[" + msgObj.getFromUserName() + "]]></ToUserName>" + // 接收方帳號(hào)(收到的OpenID)"<FromUserName><![CDATA[" + msgObj.getToUserName() + "]]></FromUserName>" + // 開(kāi)發(fā)者微信號(hào)"<CreateTime>12345678</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[你好,"+ msgObj.getFromUserName() +"]]></Content>" +"</xml>";out.write(xml); // 回復(fù)微信客戶端的消息(xml字符串)out.close();return;}}out.write("");out.close();} }

?xml字符串的處理工具類(lèi),實(shí)現(xiàn)xml消息到消息對(duì)象的轉(zhuǎn)換:

public class XMLUtil {/*** 從request中讀取用戶發(fā)給公眾號(hào)的消息內(nèi)容* @param request* @return 用戶發(fā)給公眾號(hào)的消息內(nèi)容* @throws IOException*/public static String readRequestContent(HttpServletRequest request) throws IOException{// 從輸入流讀取返回內(nèi)容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文檔的內(nèi)容轉(zhuǎn)換成map* @param xmlDoc* @return map*/public static Map<String, String> xmlToMap(String xmlDoc){//創(chuàng)建一個(gè)新的字符串StringReader read = new StringReader(xmlDoc);//創(chuàng)建新的輸入源SAX 解析器將使用 InputSource 對(duì)象來(lái)確定如何讀取 XML 輸入InputSource source = new InputSource(read);//創(chuàng)建一個(gè)新的SAXBuilderSAXBuilder sb = new SAXBuilder();Map<String, String> xmlMap = new HashMap<String, String>();try {Document doc = sb.build(source); //通過(guò)輸入源構(gòu)造一個(gè)DocumentElement root = doc.getRootElement(); //取的根元素List<Element> cNodes = root.getChildren(); //得到根元素所有子元素的集合(根元素的子節(jié)點(diǎn),不包括孫子節(jié)點(diǎn))Element et = null;for(int i=0;i<cNodes.size();i++){et = (Element) cNodes.get(i); //循環(huán)依次得到子元素xmlMap.put(et.getName(), et.getText());}} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return xmlMap;}/*** 將保存xml內(nèi)容的map轉(zhuǎn)換成對(duì)象* @param map* @return*/public static Message getMessageObject(Map<String, String> map){if(map != null){String MsgType = map.get("MsgType");// 消息類(lèi)型(文本消息:text, 圖片消息:image, 語(yǔ)音消息: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內(nèi)容的map轉(zhuǎn)換成對(duì)象* @param map* @return* @throws IOException */public static Message getMessageObject(HttpServletRequest request) throws IOException{String xmlDoc = XMLUtil.readRequestContent(request); // 讀取微信客戶端發(fā)了的消息(xml)Map<String, String> map = XMLUtil.xmlToMap(xmlDoc); // 將客戶端發(fā)來(lái)的xml轉(zhuǎn)換成Mapif(map != null){String MsgType = map.get("MsgType");// 消息類(lèi)型(文本消息:text, 圖片消息:image, 語(yǔ)音消息: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"));} }

?粉絲發(fā)來(lái)的消息分為了6中類(lèi)型(文本消息, 圖片消息, 語(yǔ)音消息, 視頻消息, 地理位置消息, 鏈接消息):

/*** 微信消息基類(lèi)* @author yuanfang* @date 2015-03-23*/ public class Message {private String MsgId; // 消息id,64位整型private String MsgType; // 消息類(lèi)型(文本消息:text, 圖片消息:image, 語(yǔ)音消息:voice, 視頻消息:video, 地理位置消息:location, 鏈接消息:link)private String ToUserName; //開(kāi)發(fā)者微信號(hào)private String FromUserName; // 發(fā)送方帳號(hào)(一個(gè)OpenID)private String CreateTime; // 消息創(chuàng)建時(shí)間 (整型)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;}}

?文本消息類(lèi):

package com.sinaapp.wx.msg;public class TextMessage extends Message {private String Content; // 文本消息內(nèi)容public String getContent() {return Content;}public void setContent(String content) {Content = content;}}

?OK,對(duì)粉絲發(fā)送給我們公眾號(hào)的任意的文本消息的最簡(jiǎn)單處理就完成,我們簡(jiǎn)單的回復(fù)他:你好,然后加上他微信的openId,類(lèi)似于:你好,orJydljfkg3-r0_dj3rkdfvjl

?

總結(jié)

以上是生活随笔為你收集整理的微信开发(02)之处理微信客户端发来的消息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。