微信java开发程序员首页投稿(暂停使用,暂停投稿)

微信Java开发系列 二、接收并回复文本消息

2016-12-24  本文已影响610人  峡客

功能简介

开始开发

  1. 我们首先需要做的是解析XML,为了流程清晰,这里简单的封装一下,把解析XML数据包封装成一个方法(工具类WeixinUtils)。
/**
     * 解析微信请求并读取XML
     * @param request
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    public static Map<String,String> readWeixinXml(HttpServletRequest request) throws IOException, DocumentException{
        Map<String,String> map = new HashMap<String,String>();
        //获取输入流
        InputStream input = request.getInputStream();
        //使用dom4j的SAXReader读取(org.dom4j.io.SAXReader;)
        SAXReader sax = new SAXReader();
        Document doc = sax.read(input);
        //获取XML数据包根元素
        Element root = doc.getRootElement();
        //得到根元素的所有子节点
        @SuppressWarnings("unchecked")
        List<Element> elementList = root.elements();
        //遍历所有节点并将其放进map
        for(Element e : elementList){
            map.put(e.getName(), e.getText());
        }
        //释放资源
        input.close();
        input = null;
        return map;
        
    }
  1. 获取内容并回复文本内容。
package my.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.dom4j.DocumentException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import my.Util.WeixinUtils;
@Controller
@RequestMapping("/weixin")
public class WeixinMessage {

    private Logger log = Logger.getLogger(WeixinMessage.class);

    @RequestMapping("/test")
    public void replyTextMessage(HttpServletRequest request,HttpServletResponse response){
        Map<String,String> map = null;
        //从工具类中获取XML解析之后的map
        try {
            map =  WeixinUtils.readWeixinXml(request);
        } catch (IOException e) {
            log.error("获取输入流失败", e);
        } catch (DocumentException e) {
            log.error("读取XML失败", e);
        }
        //获取发送方账号
        String fromUserName = map.get("FromUserName");
        //接收方账号(开发者微信号)
        String toUserName = map.get("ToUserName");
        //消息类型
        String msgType = map.get("MsgType");
        //文本内容
        String content = map.get("Content");
        log.info("发送方账号:"+fromUserName+",接收方账号(开发者微信号):"+toUserName+",消息类型:"+msgType+",文本内容:"+content);
        //回复消息
        if(msgType.equals("text")){
            //根据开发文档要求构造XML字符串,本文为了让流程更加清晰,直接拼接
            //这里在开发的时候可以优化,将回复的文本内容构造成一个java类
            //然后使用XStream(com.thoughtworks.xstream.XStream)将java类转换成XML字符串,后面将会使用这个方法。
            //而且由于参数中没有任何特殊字符,为简单起见,没有添加<![CDATA[xxxxx]]>
            String replyMsg = "<xml>"+
                                "<ToUserName>"+fromUserName+"</ToUserName>"+
                                "<FromUserName>"+toUserName+"</FromUserName>"+
                                "<CreateTime>"+System.currentTimeMillis()/1000+"</CreateTime>"+
                                "<MsgType>"+msgType+"</MsgType>"+
                                "<Content>"+content+"</Content>"+
                             "</xml>";
            //响应消息
            log.info("响应消息:"+replyMsg);
            PrintWriter out = null;
            try {
                //设置回复内容编码方式为UTF-8,防止乱码
                response.setCharacterEncoding("UTF-8");
                out = response.getWriter();
                //我们这里将用户发送的消息原样返回
                out.print(replyMsg);
                log.info("==============响应成功==================");
            } catch (IOException e) {
                log.error("获取输出流失败",e);
            }finally {
                if(out != null){
                    out.close();
                    out = null;
                }
            }
        }
    }
}```  
3. 打包,部署,向自己的测试号发送消息,可看到如下:

![接收并回复文本消息](https://img.haomeiwen.com/i3727888/e153db10dccb31fd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![tomcat后台记录](https://img.haomeiwen.com/i3727888/99c607195c17fd29.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


*  到此,接收消息回复消息的功能就完成了,本文只是记录大概的后台流程,并没有涉及过多的细节,我们如果要回复其他类型的消息,只需要构造其他类型的XML字符串即可,需要注意的是**“图片消息”和“图文消息”两者对应的XML格式不同**。另外,本文没有排除重复消息,所以没有使用MsgId这个参数,如果两次消息的MsgId一样,那么就是重复发送的同一条消息。
上一篇 下一篇

猜你喜欢

热点阅读