热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要为大家详细介绍了Java微信公众平台开发第二步,微信服务器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 parseXml(HttpServletRequest request) throws Exception { 
    // 将解析结果存储在HashMap中  
    Map map = new HashMap(); 
  
    // 从request中取得输入流  
    InputStream inputStream = request.getInputStream(); 
    // 读取输入流  
    SAXReader reader = new SAXReader(); 
    Document document = reader.read(inputStream); 
    // 得到xml根元素  
    Element root = document.getRootElement(); 
    // 得到根元素的所有子节点  
    List 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(""); 
          } else { 
            writer.write(text); 
          } 
        } 
      }; 
    } 
  }); 
}

在这个方法体里需要用到部分依赖,需要在pom文件加入如下部分:



  org.apache.directory.studio
  org.dom4j.dom4j
  1.6.1

 

  com.thoughtworks.xstream
  xstream
  1.4.8

然后将我们的WechatSecurity Controller中的post方法修改为如下,用于做消息的接收和处理:

@RequestMapping(value = "security", method = RequestMethod.POST)
  // post方法用于接收微信服务端消息
  public void DoPost(HttpServletRequest request,HttpServletResponse response) {
    System.out.println("这是post方法!");
    try{
    Map map=MessageUtil.parseXml(request);
    System.out.println("============================="+map.get("Content"));
    }catch(Exception e){
      logger.error(e,e);
    }
  }

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

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

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


推荐阅读
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 本文详细介绍Python编程的基础知识,涵盖从安装环境到编写简单程序的核心内容,并深入探讨网络编程的基本概念和实践。提供多种资源下载方式,帮助读者快速上手。 ... [详细]
author-avatar
sdr700724
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有