当前位置: 代码迷 >> Java相关 >> 用java开发微信大众号:接收和被动回复普通消息(三)
  详细解决方案

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

热度:32   发布时间:2016-04-22 19:20:58.0
用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

1楼sheng.chao
程序员为什么苦逼?,别人尊重一个身怀绝技的大厨,都不会尊重你一个程序员,因为你做的事儿都是open的,免费的,所以你不值钱,也没人尊重你们。,身怀绝技的大厨会上网发个贴:用新鲜食材制作地道日式寿司吗?呵呵,人家可没你们那么傻逼。
  相关解决方案