最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java微信公眾平臺開發(fā)(2) 微信服務(wù)器post消息體的接收

 更新時間:2017年04月20日 10:37:53   作者:dapengniao  
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第二步,微信服務(wù)器post消息體的接收,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在上一篇的文章中我們詳細(xì)講述了如何將我們的應(yīng)用服務(wù)器和微信騰訊服務(wù)器之間的對接操作,最后接入成功,不知道你有沒有發(fā)現(xiàn)在上一篇的【controller】中我定義了一個get方法和一個post方法,但是在使用過程中我們就用了get方法,這里我們就來說說我們預(yù)留的post的方法的使用!

當(dāng)我們在完成了服務(wù)器驗(yàn)證之后,此后用戶每次向公眾號發(fā)送消息、或者產(chǎn)生自定義菜單點(diǎn)擊事件時,開發(fā)者填寫的服務(wù)器配置URL將得到微信服務(wù)器推送過來的消息和事件,然后開發(fā)者可以依據(jù)自身業(yè)務(wù)邏輯進(jìn)行響應(yīng),例如回復(fù)消息等!通過這句話我們能知道后面所有的微信服務(wù)器和我們應(yīng)用服務(wù)器之間的溝通都是通過post消息體來完成的,那么我們這里將講述如何接受微信post的消息體!

(一)消息類型和消息格式

上面有說道我們所有的和微信服務(wù)器之間進(jìn)行溝通基本都是通過post消息體完成的,首先我們了解下消息體的類型,大致類型有兩種:

普通消息類型:文本消息、圖片消息、語音消息、視頻消息、小視頻消息、地理位置消息、鏈接消息

事件消息類型:關(guān)注/取消關(guān)注事件、掃描帶參數(shù)二維碼事件、上報地理位置事件、自定義菜單事件、點(diǎn)擊菜單拉取消息時的事件推送、點(diǎn)擊菜單跳轉(zhuǎn)鏈接時的事件推送
消息類型:微信服務(wù)端推送的所有消息體的類型格式都是xml格式;

(二)消息重試機(jī)制

微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會斷掉連接,并且重新發(fā)起請求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會對此作任何處理,并且不會發(fā)起重試,但是這里后期可以使用【客服消息接口】去完成消息再次推送。

(三)消息接收處理

在前面我們有說道微信的消息體是采用xml格式,那么我在這里寫了一個MessageUtil去做消息格式的處理,大致代碼如下:

package com.cuiyongzhi.wechat.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.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;
  
/**
 * ClassName: MessageUtil
 * @Description: 消息工具類
 * @author dapengniao
 * @date 2016年3月7日 上午10:05:04
 */
public class MessageUtil { 
  
  /** 
   * 返回消息類型:文本 
   */ 
  public static final String RESP_MESSAGE_TYPE_TEXT = "text"; 
  
  /** 
   * 返回消息類型:音樂 
   */ 
  public static final String RESP_MESSAGE_TYPE_MUSIC = "music"; 
  
  /** 
   * 返回消息類型:圖文 
   */ 
  public static final String RESP_MESSAGE_TYPE_NEWS = "news"; 
  
  /** 
   * 請求消息類型:文本 
   */ 
  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_LINK = "link"; 
  
  /** 
   * 請求消息類型:地理位置 
   */ 
  public static final String REQ_MESSAGE_TYPE_LOCATION = "location"; 
  
  /** 
   * 請求消息類型:音頻 
   */ 
  public static final String REQ_MESSAGE_TYPE_VOICE = "voice"; 
  
  /** 
   * 請求消息類型:推送 
   */ 
  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"; 
  
  /** 
   * 事件類型:CLICK(自定義菜單點(diǎn)擊事件) 
   */ 
  public static final String EVENT_TYPE_CLICK = "CLICK"; 
  
  /**
   * @Description: 解析微信發(fā)來的請求(XML) 
   * @param @param request
   * @param @return
   * @param @throws Exception  
   * @author dapengniao
   * @date 2016年3月7日 上午10:04:02
   */
  @SuppressWarnings("unchecked")
  public static Map<String, String> parseXml(HttpServletRequest request) throws Exception { 
    // 將解析結(jié)果存儲在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(); 
    // 得到根元素的所有子節(jié)點(diǎn)  
    List<Element> elementList = root.elements(); 
  
    // 遍歷所有子節(jié)點(diǎn)  
    for (Element e : elementList) 
      map.put(e.getName(), e.getText()); 
  
    // 釋放資源  
    inputStream.close(); 
    inputStream = null; 
  
    return map; 
  } 
  
  @SuppressWarnings("unused")
  private static XStream xstream = new XStream(new XppDriver() { 
    public HierarchicalStreamWriter createWriter(Writer out) { 
      return new PrettyPrintWriter(out) { 
        // 對所有xml節(jié)點(diǎn)的轉(zhuǎn)換都增加CDATA標(biāo)記  
        boolean cdata = true; 
        @SuppressWarnings("rawtypes")
        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); 
          } 
        } 
      }; 
    } 
  }); 
}

在這個方法體里需要用到部分依賴,需要在pom文件加入如下部分:

<!-- xml -->
<dependency>
  <groupId>org.apache.directory.studio</groupId>
  <artifactId>org.dom4j.dom4j</artifactId>
  <version>1.6.1</version>
</dependency>
 
<dependency>
  <groupId>com.thoughtworks.xstream</groupId>
  <artifactId>xstream</artifactId>
  <version>1.4.8</version>
</dependency>

然后將我們的WechatSecurity Controller中的post方法修改為如下,用于做消息的接收和處理:

@RequestMapping(value = "security", method = RequestMethod.POST)
  // post方法用于接收微信服務(wù)端消息
  public void DoPost(HttpServletRequest request,HttpServletResponse response) {
    System.out.println("這是post方法!");
    try{
    Map<String, String> map=MessageUtil.parseXml(request);
    System.out.println("============================="+map.get("Content"));
    }catch(Exception e){
      logger.error(e,e);
    }
  }

因?yàn)榍懊嫖覀円呀?jīng)開啟了我們的開發(fā)者模式,那么當(dāng)我們在這里將我們代碼發(fā)布之后再公眾號上發(fā)送消息,在們的后臺就能看到我們的消息體進(jìn)入并解析成功了,這里我輸出的是微信的【原始ID】,截圖大致如下:

在這里我只是做了消息體的接收和轉(zhuǎn)換成Map,并沒有對消息做出來,那么下一篇我們將講述對消息的分類處理!感謝你的翻閱,如有疑問可以留言討論!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot整合JavaCV實(shí)現(xiàn)視頻截取第N幀并保存圖片

    springboot整合JavaCV實(shí)現(xiàn)視頻截取第N幀并保存圖片

    這篇文章主要為大家詳細(xì)介紹了springboot如何整合JavaCV實(shí)現(xiàn)視頻截取第N幀并保存為圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • 源碼解析帶你了解LinkedHashMap

    源碼解析帶你了解LinkedHashMap

    大多數(shù)情況下,只要不涉及線程安全問題,Map基本都可以使用HashMap,不過HashMap有一個問題,就是迭代HashMap的順序并不是HashMap放置的順序,也就是無序。HashMap的這一缺點(diǎn)往往會帶來困擾,所以LinkedHashMap就閃亮登場了,這篇文章通過源碼解析帶你了解LinkedHashMap
    2021-09-09
  • Scala之文件讀取、寫入、控制臺操作的方法示例

    Scala之文件讀取、寫入、控制臺操作的方法示例

    這篇文章主要介紹了Scala之文件讀取、寫入、控制臺操作的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java實(shí)現(xiàn)切圖并且判斷圖片是不是純色/彩色圖片

    java實(shí)現(xiàn)切圖并且判斷圖片是不是純色/彩色圖片

    本篇文章主要介紹了java實(shí)現(xiàn)切圖并且判斷圖片是否是純色/彩色圖片,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • springCloud中的Sidecar多語言支持詳解

    springCloud中的Sidecar多語言支持詳解

    這篇文章主要介紹了springCloud中的Sidecar多語言支持詳解,Sidecar是將一組緊密結(jié)合的任務(wù)與主應(yīng)用程序共同放在一臺主機(jī)Host中,但會將它們部署在各自的進(jìn)程或容器中,需要的朋友可以參考下
    2024-01-01
  • Spring @Profile注解詳解

    Spring @Profile注解詳解

    這篇文章主要介紹了Spring @Profile注解詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題

    解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題

    這篇文章主要介紹了解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突問題解決

    springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突問題解決

    這篇文章主要介紹了springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • SpringCloud使用AOP統(tǒng)一處理Web請求日志實(shí)現(xiàn)步驟

    SpringCloud使用AOP統(tǒng)一處理Web請求日志實(shí)現(xiàn)步驟

    這篇文章主要為大家介紹了SpringCloud使用AOP統(tǒng)一處理Web請求日志實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 淺述int與string類型轉(zhuǎn)換的兩種方法

    淺述int與string類型轉(zhuǎn)換的兩種方法

    這篇文章主要介紹了Java中int與string類型轉(zhuǎn)換的兩種方法的相關(guān)資料,需要的朋友可以參考下
    2016-05-05

最新評論

鲜城| 运城市| 奉化市| 彰化市| 司法| 峨眉山市| 广宗县| 股票| 佛学| 秦皇岛市| 白沙| 喀喇| 洪雅县| 东莞市| 遂平县| 双流县| 上思县| 余姚市| 拜城县| 大新县| 南昌县| 朝阳区| 义马市| 深州市| 隆安县| 崇仁县| 仁布县| 南京市| 剑阁县| 石楼县| 宜章县| 泾源县| 全南县| 鹤岗市| 新丰县| 晋州市| 涪陵区| 博客| 盘山县| 贡觉县| 长治县|