微信开发——4、处理各种消息推送

从微信开发文档中得出一个结论:在公众号上进行的任何操作,比如发送文本、图片、视频、语音消息等或者点击菜单某个按钮,微信服务器都会给绑定的URL发送一个带数据的request。

例如参考数据如下(因为我对map比较熟,所以格式已经从XML转化为map):

文本消息:
MsgId=6454514167540419126, FromUserName=xxxxxxxx, CreateTime=1502808688, Content=哈哈, ToUserName=xxxxxxxx, MsgType=text

点击带链接的菜单:
FromUserName=xxxxxxx, EventKey=http://www.baidu.com, Event=VIEW, CreateTime=1502808706, MenuId=435751363, ToUserName=xxxxx, MsgType=event

步骤总体来说有三步,如下:



1.数据格式从XML转化为map

所需jar包下载地址:
http://download.csdn.net/download/zhengyikuangge/9510313

代码如下:

/*
     * XML解析,把request参数传入,调用该方法即可
     */
    public static Map<String, String> parseXml(HttpServletRequest request)
            throws Exception {
        // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();
        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // document.selectSingleNode("//")
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 遍历所有子节点
        for (Element e : elementList)
            map.put(e.getName(), e.getText());
        // 释放资源
        inputStream.close();
        inputStream = null;
        System.out.println("XML获取的信息为:" + map.toString());
        return map;
    }

2. 判断是服务器接入还是推送

注意要将该过程放在绑定URL的接收范围内,即servlet的doget或dopost方法内。

if (map == null) {
    // 执行微信接入验证操作

    } else {
    // 执行消息处理操作
    doMsg(map, resp);
    // doMsg方法如下
}

3.结合获取的map判断

拿文本信息举例,代码如下

/*
     * 消息处理
     */
    public void doMsg(Map map, HttpServletResponse resp) throws IOException {

        // 根据消息的种类
        switch (map.get("MsgType").toString()) {
        // 文字信息
        case "text":
            String reText = "";
            if (map.get("Content").equals("你好")) {
                reText = "<xml><ToUserName>" + "<![CDATA["
                        + map.get("FromUserName") + "]]>"
                        +"</ToUserName>"
                        + "<FromUserName><![CDATA[" + Common.amdin_acount
                        + "]]>" + "</FromUserName>"
                        + "<CreateTime>12345678</CreateTime>"
                        + "<MsgType><![CDATA[text]]></MsgType>"
                        + "<Content><![CDATA[你好]]></Content></xml>";
            }

            resp.getWriter().print(reText);
            break;

        default:
            resp.getWriter().print("");
            break;
        }

    }

执行结果为:在公众号中输入 “你好”则公众号返回“你好”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值