この記事では主に 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 サーバーから投稿メッセージ本文を受信する Java コードの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。