全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java微信公众平台开发(2) 微信服务器post消息体的接收

在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发现在上一篇的【controller】中我定义了一个get方法和一个post方法,但是在使用过程中我们就用了get方法,这里我们就来说说我们预留的post的方法的使用!

当我们在完成了服务器验证之后,此后用户每次向公众号发送消息、或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等!通过这句话我们能知道后面所有的微信服务器和我们应用服务器之间的沟通都是通过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】,截图大致如下:

在这里我只是做了消息体的接收和转换成Map,并没有对消息做出来,那么下一篇我们将讲述对消息的分类处理!感谢你的翻阅,如有疑问可以留言讨论!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java微信公众平台开发  # java微信服务器post消息体接收  # Java微信开发  # Java微信公众平台开发(1) 接入微信公众平台  # Java微信公众平台开发(9) 关键字回复以及客服接口实现  # Java微信公众平台开发(6) 微信开发中的token获取  # Java微信公众平台开发(10) 微信自定义菜单的创建实现  # Java微信公众平台开发(15) 微信JSSDK的使用  # Java微信公众平台开发(14) 微信web开发者工具使用  # Java微信公众平台开发(3) 接收消息的分类及实体的创建  # Java微信公众平台开发(7) 公众平台测试帐号的申请  # Java微信公众平台开发(12) 微信用户信息的获取  # Java微信公众平台之获取地理位置  # 都是  # 自定义  # 在这里  # 重试  # 当我们  # 在上  # 服务端  # 的是  # 发送消息  # 这是  # 上午  # 在这个  # 就能  # 客服  # 如有  # 遍历  # 腾讯  # 这句话  # 用了  # 去做 


相关文章: C++如何将C风格字符串(char*)转换为std::string?(代码示例)  高性能网站服务器部署指南:稳定运行与安全配置优化方案  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  制作证书网站有哪些,全国城建培训中心证书查询官网?  建站之星CMS五站合一模板配置与SEO优化指南  成都网站制作公司哪家好,四川省职工服务网是做什么用?  北京网站制作的公司有哪些,北京白云观官方网站?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  制作农业网站的软件,比较好的农业网站推荐一下?  济南网站制作的价格,历城一职专官方网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何正确选择百度移动适配建站域名?  香港服务器选型指南:免备案配置与高效建站方案解析  Android滚轮选择时间控件使用详解  如何基于云服务器快速搭建网站及云盘系统?  如何快速登录WAP自助建站平台?  如何选择服务器才能高效搭建专属网站?  制作门户网站的参考文献在哪,小说网站怎么建立?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  建站主机核心功能解析:服务器选择与网站搭建流程指南  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  广东企业建站网站优化与SEO营销核心策略指南  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  微课制作网站有哪些,微课网怎么进?  南平网站制作公司,2025年南平市事业单位报名时间?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  建站之星×万网:智能建站系统+自助建站平台一键生成  焦点电影公司作品,电影焦点结局是什么?  如何通过老薛主机一键快速建站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Android自定义listview布局实现上拉加载下拉刷新功能  如何快速生成高效建站系统源代码?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何使用Golang安装API文档生成工具_快速生成接口文档  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  北京网站制作公司哪家好一点,北京租房网站有哪些?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  建站之星安装模板失败:服务器环境不兼容?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何通过虚拟主机快速完成网站搭建?  如何确保FTP站点访问权限与数据传输安全?  如何通过远程VPS快速搭建个人网站?  代刷网站制作软件,别人代刷火车票靠谱吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。