微信服务器post消息体的接收示例

发布时间:2021-01-21 14:07:18 作者:小新
来源:亿速云 阅读:330

这篇文章主要介绍了微信服务器post消息体的接收示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

微信服务器post消息体的接收

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

上面有说道我们所有的和微信服务器之间进行沟通基本都是通过post消息体完成的,首先我们了解下消息体的类型,大致类型有两种:

普通消息类型:文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息

事件消息类型:关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件、点击菜单拉取消息时的事件推送、点击菜单跳转链接时的事件推送
消息类型:微信服务端推送的所有消息体的类型格式都是xml格式;

(二)消息重试机制

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试,但是这里后期可以使用【客服消息接口】去完成消息再次推送。

(三)消息接收处理

在前面我们有说道微信的消息体是采用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: 解析微信发来的请求(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); 
          } 
        } 
      }; 
    } 
  }); 
}

在这个方法体里需要用到部分依赖,需要在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方法用于接收微信服务端消息
  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);
    }
  }

因为前面我们已经开启了我们的开发者模式,那么当我们在这里将我们代码发布之后再公众号上发送消息,在们的后台就能看到我们的消息体进入并解析成功了,这里我输出的是微信的【原始ID】,截图大致如下:

微信服务器post消息体的接收示例

感谢你能够认真阅读完这篇文章,希望小编分享的“微信服务器post消息体的接收示例”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. 通过Powershell 发送微信消息
  2. python实现微信机器人: 登录微信、消息接收、自动回复功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java 服务器 post消息体

上一篇:如何解决获取微信access_token引出的Java多线程并发问题

下一篇:小程序之JavaScript动态修改样式的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》