• 微信开发--入门(二)


    微信菜单自定义推送事件是一个post方式提交的请求, 该post的URL是进入“服务器配置(用于接收用户信息)”配置的URL中。

    在成为开发者时的验证URL有效性,是进入URL的get方式。 而菜单自定义推送事件是进入URL的POST方式。

    菜单的推送事件,发送的请求是xml格式的String, 在java端首先要把String转化成xml,读取里面的参数,然后对相应的逻辑,最后返回的也是xml格式的String,这样微信才知道要怎么显示消息。

    String 与xml的转化可以用dom4j

    /*
     * Copyright 2012-2012 imeiya.com All right reserved. This software is the
     * confidential and proprietary information of imeiya.com ("Confidential
     * Information"). You shall not disclose such Confidential Information and shall
     * use it only in accordance with the terms of the license agreement you entered
     * into with imeiya.com.
     */
    package com.lehuo.app.ju.weixin;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.lehuo.app.ju.tb.TbBaseAction;
    
    /**
     * 类IndexAction.java的实现描述:TODO 类实现描述 
     * @author chenyao 2014-1-17 上午10:43:33
     */
    @Controller
    public class IndexAction extends TbBaseAction{
    
        @RequestMapping(value="/index.html", method = RequestMethod.GET)
        public void doGet(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws IOException {
            String echostr = request.getParameter("echostr");
            response.getWriter().write(echostr);
        }
        
        @RequestMapping(value="/index.html", method = RequestMethod.POST)
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
            // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            // 调用核心业务类接收消息、处理消息
            String respMessage = processRequest(request);
            // 响应消息
            PrintWriter out;
            try {
                out = response.getWriter();
                out.write(respMessage);
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private String processRequest(HttpServletRequest request) {
            String respMessage = null;
            try {// 默认返回的文本消息内容
                String respContent = "请求处理异常,请稍候尝试!";
                Map<String, String> requestMap = parseXml(request);         
                // 发送方帐号(open_id)
                String fromUserName = requestMap.get("FromUserName");;
                // 公众帐号
                String toUserName =  requestMap.get("ToUserName");
                // 消息类型
                String msgType = requestMap.get("MsgType");
                // 回复文本消息
                TextMessage textMessage = new TextMessage();
                textMessage.setToUserName(fromUserName);
                textMessage.setFromUserName(toUserName);
                textMessage.setCreateTime(new Date());
                textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
                textMessage.setFuncFlag(0);
                // 文本消息
                if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
                    respContent = "您发送的是文本消息!";
                }
                // 图片消息
                else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
                    respContent = "您发送的是图片消息!";
                }
                // 地理位置消息
                else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
                    respContent = "您发送的是地理位置消息!";
                }
                // 链接消息
                else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
                    respContent = "您发送的是链接消息!";
                }
                // 音频消息
                else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
                    respContent = "您发送的是音频消息!";
                }
                // 事件推送
                else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
                    // 事件类型
                    String eventType = requestMap.get("Event");
                    // 订阅
                    if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
                        respContent = "谢谢您的关注!";
                    }
                    // 取消订阅
                    else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
                        // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
                    }
                    // 自定义菜单点击事件
                    else{
                        String eventKey = requestMap.get("EventKey");
                        respContent = "event"+eventKey==null?"":eventKey+"__eventType"+eventType;
                        // TODO 自定义菜单权没有开放,暂不处理该类消息 EventKey
                        /*
                        if(eventKey.equalsIgnoreCase("20_PROMANAGE")){
                            respContent = "项目管理";
                        }
                        else if(eventKey.equalsIgnoreCase("30_ORGANIZATION")){
                            respContent = "机构运作";
                        }
                        else if(eventKey.equalsIgnoreCase("01_WAITING")){
                            respContent = "待办工单";
                        }
                        else if(eventKey.equalsIgnoreCase("02_FINISH")){
                            respContent = "已办工单";
                        }
                        else if(eventKey.equalsIgnoreCase("03_MYJOB")){
                            respContent = "我的工单";
                        }
                        else if(eventKey.equalsIgnoreCase("04_MESSAGEBOX")){
                            respContent = "公告消息箱";
                        }
                        else if(eventKey.equalsIgnoreCase("05_SIGN")){
                            respContent = "签到";
                        }*/
                    }
                }
                textMessage.setContent(respContent);
                respMessage = Object2XmlString(textMessage);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return respMessage;
        }
        
        
        @SuppressWarnings("unchecked")
        private Map<String, String> parseXml(HttpServletRequest request) throws Exception {
            // 将解析结果存储在HashMap中
            Map<String, String> map = new HashMap<String, String>();
            InputStream is = request.getInputStream();
            SAXReader reader = new SAXReader();
            Document doc = reader.read(is);
            Element root = doc.getRootElement();
            List<Element> list = root.elements();
            // 遍历所有子节点
            for (Element el : list){
                map.put( el.getName(), el.getText());
            }
            // 释放资源
            is.close();
            is = null;
            return map;
        }
        
        
        /**
         * 将对象转换为xml字符串
         */
    
        public String Object2XmlString(Object object) {
          return "<xml><ToUserName><![CDATA[测试账号]]></ToUserName><FromUserName><![CDATA[测试账号]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[试试看效果]]></Content></xml>";
        }
        
    }
  • 相关阅读:
    UIWebView的使用
    ASP.NET自定义简单分页
    匿名方法、委托和Lambda表达式区分演示(图文解释)
    Windows Phone开发(11):常用控件(下)
    来自CodeCanyo的15个优秀移动应用和工具
    JDK、J2EE、J2SE、J2ME概念详解
    配置Eclipse 实现按任意键代码自动补全
    ASP.NET验证码
    asp.net 压缩解压缩zip文件
    HOOK使用:全局键盘钩子
  • 原文地址:https://www.cnblogs.com/chenyao/p/3528567.html
Copyright © 2020-2023  润新知