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