美文网首页
【干货】订阅号开发[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] 事件消息封装与处理

    事件消息的封装 基类(与普通消息一样继承于BaseMessage) 订阅与取消订阅消息 用户在关注与取消关注公众号...

  • 【干货】订阅号开发[2]--消息的封装

    订阅号消息事件封装 消息事件的封装其实是比较细节的。后面会提到一些细节。 分析微信消息 消息类型分析 image ...

  • 飞书开放平台官方golang-sdk

    旨在让开发者便捷的调用飞书开放API、处理订阅的消息事件、处理服务端推送的卡片行为。 安装 API Client ...

  • channel

    1.使用场景 (1) 消息传递、消息过滤(2) 信号广播(3) 事件订阅与广播(4) 请求、相应转发(5) 任务分...

  • 微信订阅号消息API XML对象封装

    前言 这篇文章介绍微信订阅号消息接口中,XML对象的封装和解析。希望能给大家带来帮助,微信开发这块也不是很熟悉,只...

  • 订阅号和服务号的区别在哪里

    微信订阅号和服务号的区别? 推送频率 订阅号:每‘天’可推送1条消息 服务号:每‘月’能推送4条消息 自定义功能 ...

  • Kafka简介

    概念 基于发布/订阅模式的分布式消息队列 分布式 基于发布和订阅模式的消息队列本身最新定位:分布式流式事件处理平台...

  • 微信号

    订阅号与服务号的区别 订阅号:品牌推广宣传,订阅号文件夹里,每天发消息 服务号:服务会员,独立文件夹 运营规则 微...

  • 微信开发(一)

    微信开发 服务号功能 1、1个月(自然月)内仅可以发送4条群发消息。2、发给订阅用户(粉丝)的消息,会显示在对方的...

  • 【干货】订阅号开发[3] 微信服务端验证与消息接收

    微信服务接入 微信服务器传递signature、timestamp、nonce、echostr这四个参数。定义时需...

网友评论

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

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