美文网首页
微信开发之接收服务器推送普通消息

微信开发之接收服务器推送普通消息

作者: 喊我小王吧 | 来源:发表于2019-04-03 17:12 被阅读0次

    接收服务器推送普通消息

    接收普通消息

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

    服务器介入获取微信推送消息代码:

        /**
         * 此方法用于微信回复消息
         * @param request
         * @return
         */
        @PostMapping("getToken")
        @ResponseBody
        public String getUserMessage(HttpServletRequest request){
            String responseString = "";
            try {
                //处理消息与事件推送
                Map<String, String> xmlData = RequestParamType.getXmlData(request.getInputStream());
                logger.info(xmlData.toString());//接受到的消息
                 responseString = RequestParamType.dealBean2Xml(xmlData);
                 logger.info("消息回复ing..." + responseString);
                 return responseString;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    

    解析xml工具类

        /**
         * 解析xml 获取key-value
         * @param inputStream
         * @return
         */
        public static Map<String,String> getXmlData(InputStream inputStream){
            Map<String,String> map =  new HashMap<>();
            //截取xml
            SAXReader reader = new SAXReader();
            try {
                Document document = reader.read(inputStream);
                Element rootElement = document.getRootElement(); //获取根节点
                List<Element>  elements = rootElement.elements(); // h获取所有的节点
                for (Element e: elements) {
                    map.put(e.getName(),e.getStringValue());
                }
    
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            return map;
        }
    

    处理xml消息

        /**
         * 处理文本消息
         */
        public static String dealBean2Xml(Map<String,String> xmlData ){
    
            //获取 消息类型
            String msgType = xmlData.get("MsgType");
            BaseMsg baseMsg = null;
            switch (msgType){
                //普通文本消息
                case "text":
                    baseMsg = dealText(xmlData);
                    break;
    
                //图片消息
                case "image":
                    break;
    
                //语音消息
                case "voice":
                    break;
    
                //视频消息
                case "video":
                    break;
    
                //小视频消息
                case "shortvideo":
                    break;
    
                //地理位置消息
                case "location":
                    break;
                //链接消息
    
                case "link":
                    break;
    
                case "event":
                    baseMsg = dealTicket(xmlData);
                    break;
    
                default:
                    break;
            }
            //把消息对象处理为xml数据包
            String xml = bean2Xml(baseMsg);
            if(xml!=null){
                return xml;
            }
            return null;
        }
    

    处理文本工具类

        /**
         * 处理文本消息
         * @param xmlData
         * @return TextMsg
         */
        private static BaseMsg dealText(Map<String, String> xmlData) {
            //获取请求聊天信息
            String content = xmlData.get("Content");
            //回复文本消息
            BaseMsg bm = new TextMsg(xmlData,"欢迎访问公众号哟!");
            return bm;
        }
    

    将对象转为xml

        /**
         *  javaBean 转xml
         * @param baseMsg
         * @return  xml
         */
        public static String bean2Xml(BaseMsg baseMsg){
    
            XStream xStream = new XStream();
            //若没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
            xStream.processAnnotations(BaseMsg.class);
            xStream.processAnnotations(ImageMsg.class);
            xStream.processAnnotations(LinkMsg.class);
            xStream.processAnnotations(LocationMsg.class);
            xStream.processAnnotations(SmalleVideoMsg.class);
            xStream.processAnnotations(TextMsg.class);
            xStream.processAnnotations(VideoMsg.class);
            xStream.processAnnotations(VoiceMsg.class);
            xStream.processAnnotations(ScanTicket.class);
            String xml = xStream.toXML(baseMsg);
            return xml;
        }
    

    消息对象实体

    消息实体基类

    /**
     *  base模板实体类
     */
    @XStreamAlias("xml") //设置根节点名
    public class BaseMsg {
    
        //置顶别名首字母大写
        @XStreamAlias("ToUserName")
        private String toUserName;//开发者微信号
        private String FromUserName;//发送方帐号(一个OpenID)
        private String CreateTime;//消息创建时间 (整型)
        private String MsgType;//MsgType 文本类型
    
    
        public String getToUserName() {
            return toUserName;
        }
    
        public void setToUserName(String toUserName) {
            toUserName = toUserName;
        }
    
        public String getFromUserName() {
            return FromUserName;
        }
    
        public void setFromUserName(String fromUserName) {
            FromUserName = fromUserName;
        }
    
        public String getCreateTime() {
            return CreateTime;
        }
    
        public void setCreateTime(String createTime) {
            CreateTime = createTime;
        }
    
        public String getMsgType() {
            return MsgType;
        }
    
        public void setMsgType(String msgType) {
            MsgType = msgType;
        }
    
        public BaseMsg(){}
        public BaseMsg(Map<String,String> map){
            this.CreateTime=System.currentTimeMillis()/1000+"";
            this.FromUserName=map.get("ToUserName");
            this.toUserName=map.get("FromUserName");
        }
    
    }
    

    消息文本模板实体类

    /**
     *  消息文本模板实体类
     */
    @XStreamAlias("xml")
    public class TextMsg extends BaseMsg {
    
    
        private String Content;//文本消息内容
    
        public String getContent() {
            return Content;
        }
    
        public void setContent(String content) {
            Content = content;
        }
    
    
    
        public TextMsg(Map<String,String> map, String Content){
            super(map);
            this.Content=Content;
            this.setMsgType("text");
        }
    
    }
    

    maven 依赖

            <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.11.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.53</version>
            </dependency>
    

    相关文章

      网友评论

          本文标题:微信开发之接收服务器推送普通消息

          本文链接:https://www.haomeiwen.com/subject/jtgzbqtx.html