ホームページ  >  記事  >  WeChat アプレット  >  WeChat サーバーから投稿メッセージ本文を受信する Java コードの例

WeChat サーバーから投稿メッセージ本文を受信する Java コードの例

Y2J
Y2Jオリジナル
2017-05-04 09:07:431987ブラウズ

この記事では主に Java WeChat パブリック プラットフォーム開発の 2 番目のステップである WeChat サーバーの投稿メッセージ本文の受信について詳しく紹介します。興味のある方は前の記事を参照してください

その方法を詳しく説明しました。アプリケーション サーバーを WeChat サーバーと Tencent サーバーに接続します。前回の記事の [コントローラー] で get メソッドと post メソッドを使用したことに気づいたでしょうか。使用中のメソッド ここでは、予約した post メソッドの使用方法について説明します。

サーバーの検証が完了すると、ユーザーが公式アカウントにメッセージを送信するか、カスタムメニューのクリックイベントを生成するたびに、開発者が入力したサーバー構成URLは、WeChatサーバーによってプッシュされたメッセージとイベントを取得します。開発者は、メッセージへの返信など、独自のビジネス ロジックに従って応答できます。この文から、WeChat サーバーとアプリケーション サーバー間のその後のすべての通信は投稿メッセージ本文を通じて完了することがわかります。そこで、ここでは WeChat 投稿のメッセージ本文を受け入れる方法について説明します。

(1) メッセージの種類とメッセージの形式

WeChat サーバーとのすべての通信は基本的に投稿メッセージの本文を通じて完了することは前述しましたが、まず、メッセージ本文の種類が 2 つあることを理解します。タイプ:

一般的なメッセージ タイプ: テキスト メッセージ、画像メッセージ、音声メッセージ、ビデオ メッセージ、ショート ビデオ メッセージ、地理的位置メッセージ、リンク メッセージ

イベント メッセージ タイプ: イベントのフォロー/フォロー解除、パラメーターを使用して QR コード イベントをスキャンし、地理的位置イベントをレポートし、メニュー イベントをカスタマイズし、メニューをクリックしてメッセージをプルするときにイベントをプッシュし、メニューのジャンプ リンクをクリックしたときにイベントをプッシュします
メッセージ タイプ: WeChat サーバーによってプッシュされるすべてのメッセージ本文 タイプの形式

(2) メッセージ再試行メカニズム

WeChat サーバーが 5 秒以内に応答を受信しない場合、接続を切断してリクエストを再開始し、合計 3 回再試行します。サーバーが 5 秒以内に処理して応答することを保証できない場合は、空の文字列を直接応答することができます。WeChat サーバーはこれに対して何もせず、再試行を開始しません。ただし、[カスタマー サービス メッセージ インターフェイス] を使用することはできます。後でもう一度メッセージをプッシュします。

(3) メッセージの受信と処理

先ほど、WeChat のメッセージ本文は XML 形式であると述べましたので、メッセージ形式を処理するために MessageUtil をここに書きました。おおよそのコードは次のとおりです。このメソッド本体では、いくつかの依存関係を使用する必要があります。次の部分を pom ファイルに追加する必要があります:

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: 解析微信发来的请求(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 { 
    // 将解析结果存储在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; 
  } 
  
  @SuppressWarnings("unused")
  private static XStream xstream = new XStream(new XppDriver() { 
    public HierarchicalStreamWriter createWriter(Writer out) { 
      return new PrettyPrintWriter(out) { 
        // 对所有xml节点的转换都增加CDATA标记  
        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); 
          } 
        } 
      }; 
    } 
  }); 
}

次に、メッセージの受信と処理に使用される WechatSecurity コントローラーの post メソッドを次のように変更します。

<!-- 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>

先ほどやったので開発者モードがオンになっているので、ここでコードを公開してから公式アカウントにメッセージを送信すると、メッセージ本文が入力され、正常に解析されたことがバックグラウンドで確認できます。ここで出力したのは WeChat [オリジナル ID] で、スクリーンショットは大まかに次のとおりです:

ここでは、メッセージ本文を受信して​​マップに変換しただけですが、メッセージを作成していません。そのため、次の記事で説明します。メッセージの分類と処理について話しましょう。読んでいただきありがとうございます。ご質問がございましたら、メッセージを残してください。

以上がWeChat サーバーから投稿メッセージ本文を受信する Java コードの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。