事件消息的封装
订阅号.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;
}
网友评论