zoukankan      html  css  js  c++  java
  • 用java开发微信公众号:接收和被动回复普通消息(三)

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复。说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类:

    1.文本消息
    2.图片消息
    3.语音消息
    4.视频消息
    5.小视频消息
    6.地理位置消息
    7.链接消息(被动回复的消息)

    被动回复的普通消息包括:

    1.回复文本消息
    2.回复图片消息
    3.回复语音消息
    4.回复视频消息
    5.回复音乐消息
    6.回复图文消息

    其实接收消息和被动回复消息这两个动作是不分家的,这本来就是一个交互场景,一般情况就是公众号通过分析接收到的消息,会给出对应的回复。当然也不能排除一些特殊业务了。

    如何接收消息

    要接收的这7中消息的xml格式这里就不列出了,请到官方文档查看,有具体的格式定义和属性说明。格式很简单,基本共有属性包括ToUserName、FromUserName、CreateTime、MsgType、MsgId,并且每种类型有自己特殊的属性。

    看到这里,其实就很明白了,接收消息的过程其实就是获取post请求的这个xml,然后对这个xml进行分析的过程。post请求的入口还是之前提到的微信公众号接入的那个地址,整个公众号的所有请求都会走这个入口,只是接入时是get请求,其它情况下是post请求。处理xml这里用了dom4j,xml处理代码如下,在servlet的post方法中调用parseXml方法即可:

    public static Map parseXml(HttpServletRequest request) throws Exception {
            // 将解析结果存储在HashMap中
            Map map = new HashMap();
    
            // 从request中取得输入流
            InputStream inputStream = request.getInputStream();
            /*
             * 读取request的body内容 此方法会导致流读取问题 Premature end of file. Nested exception:
    		 * Premature end of file String requestBody =
    		 * inputStream2String(inputStream); System.out.println(requestBody);
    		 */
            // 读取输入流
            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;
        }
    
        private static String inputStream2String(InputStream is) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int i = -1;
            while ((i = is.read()) != -1) {
                baos.write(i);
            }
            return baos.toString();
        }
    

    如何被动回复消息

    下面我基于这样一个逻辑来演示构造回复的消息,接收到文本消息"文本",回复文本消息;接收到“图片”,回复图片消息;接收到“语音”,回复语音消息;接收到“视频”,回复视频消息;接收到“音乐”,回复音乐消息;接收到“图文”,回复图文消息。

    以回复文本消息作为说明:

    <xml>
    <ToUserName><![CDATA[发消息的人,即订阅者]]></ToUserName>
    <FromUserName><![CDATA[微信公众号本身]]></FromUserName>
    <CreateTime>消息创建时间(整形)</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[消息内容]]></Content>
    </xml>
    

    前两个属性可以从接收的消息中获取,接收的消息格式如下:

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName> 
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[this is a text]]></Content>
     <MsgId>1234567890123456</MsgId>
     </xml>
    

    其中接收消息格式中的ToUserName便是回复消息的FromUserName,接收消息格式中的FromUserName便是回复消息的ToUserName。

    CreateTime为消息发送的时间戳。MsgType为消息类型,文本为text。Content为消息内容。

    具体每一种类型消息的回复,就是构造此种类型的xml格式内容,格式大同小异,只是音乐、视频、语音、图文格式相对于文本消息构造的xml内容稍微复杂一点。具体可参考官方文档。这里不做赘述,相信各位一看便明白。

    同样,接收消息可以参看这里

    代码已更新到github

  • 相关阅读:
    Docker学习笔记07_网络配置
    Docker学习笔记06_部署appache+tomcat+redis+mongo+python
    Docker学习笔记05_部署nginx+php+mysql+phpmyadmin
    Docker学习笔记04_镜像管理
    Docker学习笔记03_容器的简单应用
    Docker学习笔记02_基本操作
    Docker学习笔记01_CentOS 7安装Docker
    Cisco Ironport ESA配置拒收黑名单
    CentOS 7安装Cobra
    jvm内存模型、常见参数及调优
  • 原文地址:https://www.cnblogs.com/fengzheng/p/5055388.html
Copyright © 2011-2022 走看看