美文网首页
【干货】订阅号开发[4] 事件消息封装与处理

【干货】订阅号开发[4] 事件消息封装与处理

作者: 5d44bc28b93d | 来源:发表于2018-11-22 23:01 被阅读12次

    事件消息的封装

    订阅号.png

    基类(与普通消息一样继承于BaseMessage)

    public class EventMessage extends BaseMessage {
        @XStreamAlias("MsgType")
        private final MsgType msgType = MsgType.event;
        @XStreamAlias("EventKey")
        private String eventKey;
        public enum Event {
            subscribe, unsubscribe, SCAN, LOCATION, CLICK, VIEW
        }
    
        public String getEventKey() {
            return eventKey;
        }
    
        public void setEventKey(String eventKey) {
            this.eventKey = eventKey;
        }
    
        public MsgType getMsgType() {
            return msgType;
        }
    }
    

    订阅与取消订阅消息

    用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。

    微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

    关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。

    假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

     <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[FromUser] ]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType>< ![CDATA[event] ]></MsgType>
        <Event>< ![CDATA[subscribe] ]></Event>
     </xml>
    
    • 订阅事件
    @XStreamAlias("xml")
    public class SubscribeEventMessage extends EventMessage{
        @XStreamAlias("Event")
        private final Event event = Event.subscribe;
    
        public Event getEvent() {
            return event;
        }
    }
    
    • 取消订阅事件
    @XStreamAlias("xml")
    public class UnSubscribeEventMessage extends EventMessage {
        @XStreamAlias("Event")
        private final Event event = Event.unsubscribe;
    
        public Event getEvent() {
            return event;
        }
    }
    

    扫描带参数二维码事件

    用户扫描带场景值二维码时,可能推送以下两种事件:

    如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
    如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。

    • 未关注关注后的事件推送
    <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[FromUser] ]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType>< ![CDATA[event] ]></MsgType>
        <Event>< ![CDATA[subscribe] ]></Event>
        <EventKey>< ![CDATA[qrscene_123123] ]></EventKey>
        <Ticket>< ![CDATA[TICKET] ]></Ticket>
    </xml>
    
    • 用户已经关注的事件推送
    <xml> 
        <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[FromUser] ]></FromUserName> <CreateTime>123456789</CreateTime>
        <MsgType>< ![CDATA[event] ]></MsgType> 
        <Event>< ![CDATA[SCAN] ]></Event> 
        <EventKey>< ![CDATA[SCENE_VALUE] ]></EventKey> 
        <Ticket>< ![CDATA[TICKET] ]></Ticket> 
    </xml>
    
    @XStreamAlias("xml")
    public class ScanEventMessage extends EventMessage {
        @XStreamAlias("Ticket")
        private String ticket;
        @XStreamAlias("Event")
        private Event event;
    
        public Event getEvent() {
            return event;
        }
    
        public void setEvent(Event event) {
            this.event = event;
        }
    
        public String getTicket() {
            return ticket;
        }
    
        public void setTicket(String ticket) {
            this.ticket = ticket;
        }
    
    }
    

    上报地理位置事件

    用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的URL。

    • 推送XML数据包示例:

      <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType>< ![CDATA[event] ]></MsgType>
        <Event>< ![CDATA[LOCATION] ]></Event>
        <Latitude>23.137466</Latitude>
        <Longitude>113.352425</Longitude>
        <Precision>119.385040</Precision>
      </xml>
      
    • java 封装

    @XStreamAlias("xml")
    public class LocationEventMessage extends EventMessage {
        @XStreamAlias("Event")
        private final Event event = Event.LOCATION;
        @XStreamAlias("Latitude")
        private String latitude;
        @XStreamAlias("Longitude")
        private String longitude;
        @XStreamAlias("Precision")
        private String precision;
    
        public Event getEvent() {
            return event;
        }
    
        public String getLatitude() {
            return latitude;
        }
    
        public void setLatitude(String latitude) {
            this.latitude = latitude;
        }
    
        public String getLongitude() {
            return longitude;
        }
    
        public void setLongitude(String longitude) {
            this.longitude = longitude;
        }
    
        public String getPrecision() {
            return precision;
        }
    
        public void setPrecision(String precision) {
            this.precision = precision;
        }
    }
    

    自定义菜单事件

    用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。
    点击菜单拉取消息时的事件推送

    • 推送XML数据包示例:
    <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[FromUser] ]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType>< ![CDATA[event] ]></MsgType>
        <Event>< ![CDATA[CLICK] ]></Event>
        <EventKey>< ![CDATA[EVENTKEY] ]></EventKey>
    </xml>
    

    点击菜单跳转链接时的事件推送

    • 推送XML数据包示例:
    <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[FromUser] ]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType>< ![CDATA[event] ]></MsgType>
        <Event>< ![CDATA[VIEW] ]></Event>
        <EventKey>< ![CDATA[www.qq.com] ]></EventKey>
    </xml>
    
    @XStreamAlias("xml")
    public class MenuEventMessage extends EventMessage {
        @XStreamAlias("Event")
        private Event event;
    
        public Event getEvent() {
            return event;
        }
    
        public void setEvent(Event event) {
            this.event = event;
        }
    
    }
    

    事件消息处理

    • 判断是普通消息还是事件消息
      public String responseMessage(HttpServletRequest request) {
            String replyMessage = "";
            try {
                String content = MessageUtil.requestToXml(request);
                logger.info(content);
                Map<String, String> requestMap = MessageUtil.parseXml(content);
                if (requestMap.containsKey("MsgType")) {
                    if ("event".equals(requestMap.get("MsgType"))) {
                        replyMessage = processEventMessage(requestMap, content);
                    } else {
                        replyMessage = processCommonMessage(requestMap, content);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return replyMessage;
        }
    
    • 事件消息处理函数
    private String processEventMessage(Map<String, String> requestMap, String reciveContent) {
            String eventName = requestMap.get("Event");
            String replyMessage = "";
            EventMessage.Event event = EventMessage.Event.valueOf(eventName);
            TextMessage replyTextMessage = new TextMessage();
            switch (event) {
    
                case unsubscribe:
                    break;
                case CLICK:
                    break;
                case LOCATION:
                    break;
                case SCAN:
                    break;
                case VIEW:
                    break;
                case subscribe:
                    break;
                default:
    
            }
            return replyMessage;
        }
    

    相关文章

      网友评论

          本文标题:【干货】订阅号开发[4] 事件消息封装与处理

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