用java开发微信公众号:接收和被动回复普通消息(三)

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

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

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

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

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

如何接收消息微信开发

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

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

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();
    }

如何被动回复消息this

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

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

<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

相关文章
相关标签/搜索