国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程式 微信開發(fā) 接收微信伺服器post訊息體的java程式碼範(fàn)例

接收微信伺服器post訊息體的java程式碼範(fàn)例

May 04, 2017 am 09:07 AM

這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第二步,微信伺服器post消息體的接收,具有一定的參考價值,有興趣的小夥伴們可以參考一下

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

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

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

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

普通訊息類型:文字訊息、圖片訊息、語音訊息、視訊訊息、小視頻訊息、地理位置訊息、連結(jié)訊息

事件訊息類型:追蹤/取消追蹤事件、掃描帶參數(shù)二維碼事件、回報地理位置事件、自訂選單事件、點選選單拉取訊息時的事件推播、點選選單跳轉(zhuǎn)連結(jié)時的事件推播
訊息類型:微信服務(wù)端推送的所有訊息體的類型格式都是xml格式;

(二)訊息重試機制

微信伺服器在五秒鐘內(nèi)收不到回應(yīng)會斷掉連接,並且重新發(fā)起請求,總共重試三次。假如伺服器無法保證在五秒內(nèi)處理並回復(fù),可以直接回復(fù)空串,微信伺服器不會對此作任何處理,並且不會發(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(自定義菜單點擊事件) 
   */ 
  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é)點  
    List<Element> elementList = root.elements(); 
  
    // 遍歷所有子節(jié)點  
    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é)點的轉(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);
    }
  }

因為前面我們已經(jīng)開啟了我們的開發(fā)者模式,那麼當(dāng)我們在這裡將我們程式碼發(fā)布之後再公眾號上發(fā)送訊息,在們的後臺就能看到我們的訊息體進(jìn)入並解析成功了,這裡我輸出的是微信的【原始ID】,截圖大致如下:

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

以上是接收微信伺服器post訊息體的java程式碼範(fàn)例的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點實現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(JVM)內(nèi)部 了解Java虛擬機(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達(dá)對象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險。 1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達(dá)性,無法到達(dá)的對像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對象,清除未標(biāo)記對象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按後進(jìn)先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles