Skip to content

Commit

Permalink
🎨 #2477 【小程序】增加订阅消息通知事件的相关属性支持
Browse files Browse the repository at this point in the history
  • Loading branch information
dany1 authored Jan 3, 2022
1 parent 4b92f94 commit 76ea7fe
Show file tree
Hide file tree
Showing 5 changed files with 450 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import me.chanjar.weixin.common.error.WxRuntimeException;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.io.InputStream;
Expand Down Expand Up @@ -165,6 +166,39 @@ public class WxMaMessage implements Serializable {
@XStreamConverter(value = XStreamCDataConverter.class)
private String openPid;

@XStreamAlias("SubscribeMsgPopupEvent")
private WxMaSubscribeMsgEvent.SubscribeMsgPopupEvent subscribeMsgPopupEvent;

@XStreamAlias("SubscribeMsgChangeEvent")
private WxMaSubscribeMsgEvent.SubscribeMsgChangeEvent subscribeMsgChangeEvent;

@XStreamAlias("SubscribeMsgSentEvent")
private WxMaSubscribeMsgEvent.SubscribeMsgSentEvent subscribeMsgSentEvent;

/**
* 不要直接使用这个字段,
* 这个字段只是为了适配 SubscribeMsgPopupEvent SubscribeMsgChangeEvent SubscribeMsgSentEvent
* 在json里面名称都是List并且有时候是对象有时候是数组的问题
* 当List只有一个对象的时候,微信服务器推送过来的的List是对象而非数组,当有多个对象的时候推送过来的才是数组
* 当只有一个对象的时候
* "List": {
* "TemplateId": "hD-ixGOhYmUfjOnI8MCzQMPshzGVeux_2vzyvQu7O68",
* "SubscribeStatusString": "accept",
* "PopupScene": "0"
* }
* 当有多条数据的时候
* "List": [ {
* "TemplateId": "hD-ixGOhYmUfjOnI8MCzQMPshzGVeux_2vzyvQu7O68",
* "SubscribeStatusString": "accept",
* "PopupScene": "0"
* }, {
* "TemplateId": "hD-ixGOhYmUfjOnI8MCzQMPshzGVeux_2vzyvQu7O68",
* "SubscribeStatusString": "accept",
* "PopupScene": "0"
* }]
*/
@SerializedName("List")
private WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson uselessMsg;

public static WxMaMessage fromXml(String xml) {
return XStreamTransformer.fromXml(WxMaMessage.class, xml);
Expand Down Expand Up @@ -201,7 +235,19 @@ public static WxMaMessage fromEncryptedXml(InputStream is, WxMaConfig wxMaConfig
}

public static WxMaMessage fromJson(String json) {
return WxMaGsonBuilder.create().fromJson(json, WxMaMessage.class);
WxMaMessage message = WxMaGsonBuilder.create().fromJson(json, WxMaMessage.class);
// 在这里处理 event的json格式时候的 list 问题,让json和xml的程序接口可以保持一致, 详见 uselessMsg 字段的注释
if (message.getUselessMsg() != null) {
if (StringUtils.equals(message.getEvent(), "subscribe_msg_popup_event")) {
message.setSubscribeMsgPopupEvent(message.getUselessMsg().getPopupEvents());
} else if (StringUtils.equals(message.getEvent(), "subscribe_msg_change_event")) {
message.setSubscribeMsgChangeEvent(message.getUselessMsg().getChangeEvents());
} else if (StringUtils.equals(message.getEvent(), "subscribe_msg_sent_event")) {
message.setSubscribeMsgSentEvent(message.getUselessMsg().getSentEvent());
}
message.setUselessMsg(null);
}
return message;
}

public static WxMaMessage fromEncryptedJson(String encryptedJson, WxMaConfig config) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package cn.binarywang.wx.miniapp.bean;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import lombok.Data;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

/**
* WxMaSubscribeMsgEvent class
* 客户端订阅,服务端收到的通知
* @author dany
* @date 2021/12/31
*/
public class WxMaSubscribeMsgEvent {
/**
* https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
*/
@Data
@XStreamAlias("SubscribeMsgPopupEvent")
public static class SubscribeMsgPopupEvent implements Serializable {
private static final long serialVersionUID = 6319723189257161326L;
@XStreamImplicit(itemFieldName = "List")
private List<PopupEvent> list = new LinkedList<>();
}

@Data
@XStreamAlias("SubscribeMsgChangeEvent")
public static class SubscribeMsgChangeEvent implements Serializable {
private static final long serialVersionUID = 7705686111539437751L;
@XStreamImplicit(itemFieldName = "List")
private List<ChangeEvent> list = new LinkedList<>();
}

@Data
@XStreamAlias("SubscribeMsgSentEvent")
public static class SubscribeMsgSentEvent implements Serializable {
private static final long serialVersionUID = 7705686111539437751L;
@XStreamAlias("List")
private SentEvent list;
}


@Data
public static class PopupEvent implements Serializable {
private static final long serialVersionUID = 4934029303241387226L;
/**
* 模板id
*/
@XStreamAlias("TemplateId")
@XStreamConverter(value = XStreamCDataConverter.class)
private String templateId;
/**
* 订阅结果(accept接收;reject拒收)
*/
@XStreamAlias("SubscribeStatusString")
@XStreamConverter(value = XStreamCDataConverter.class)
private String subscribeStatusString;
/**
* 弹框场景,0代表在小程序页面内
*/
@XStreamAlias("PopupScene")
private String popupScene;
}

@Data
public static class ChangeEvent implements Serializable {
private static final long serialVersionUID = 1523634146232757624L;
/**
* 模板id
*/
@XStreamAlias("TemplateId")
@XStreamConverter(value = XStreamCDataConverter.class)
private String templateId;
/**
* 订阅结果(accept接收;reject拒收)
*/
@XStreamAlias("SubscribeStatusString")
@XStreamConverter(value = XStreamCDataConverter.class)
private String subscribeStatusString;
}

@Data
public static class SentEvent implements Serializable {
private static final long serialVersionUID = -8734478345463177940L;
/**
* 模板id
*/
@XStreamAlias("TemplateId")
@XStreamConverter(value = XStreamCDataConverter.class)
private String templateId;

@XStreamAlias("MsgID")
private String msgId;

@XStreamAlias("ErrorCode")
private String errorCode;

@XStreamAlias("ErrorStatus")
@XStreamConverter(value = XStreamCDataConverter.class)
private String errorStatus;
}

@Data
public static class WxMaSubscribeMsgEventJson implements Serializable {
private static final long serialVersionUID = -4820758280837190275L;

private SubscribeMsgPopupEvent popupEvents;

private SubscribeMsgChangeEvent changeEvents;

private SubscribeMsgSentEvent sentEvent;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cn.binarywang.wx.miniapp.json;

import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMsgEvent;
import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo;
import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait;
Expand All @@ -26,6 +27,7 @@ public class WxMaGsonBuilder {
INSTANCE.registerTypeAdapter(WxMaVisitDistribution.class, new WxMaVisitDistributionGsonAdapter());
INSTANCE.registerTypeAdapter(WxMaRetainInfo.class, new WxMaRetainInfoGsonAdapter());
INSTANCE.registerTypeAdapter(WxMaUserPortrait.class, new WxMaUserPortraitGsonAdapter());
INSTANCE.registerTypeAdapter(WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson.class, new WxMaSubscribeMsgEventJsonAdapter());
}

public static Gson create() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package cn.binarywang.wx.miniapp.json.adaptor;

import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMsgEvent;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Type;

/**
* WxMaSubscribeMsgEventJsonAdapter class
*
* @author dany
* @date 2021/12/31
*/
@Slf4j
public class WxMaSubscribeMsgEventJsonAdapter implements JsonDeserializer<WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson> {
@Override
public WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson result = new WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson();
if (json.isJsonArray()) {
JsonArray array = json.getAsJsonArray();
if (array.size() > 0) {
JsonObject obj = array.get(0).getAsJsonObject();
MsgEventTypeEnum eventType = detectMsgEventType(obj);
for (int i = 0; i < array.size(); ++i) {
obj = array.get(i).getAsJsonObject();
setField(result, eventType, obj);
}
}
} else {
JsonObject obj = json.getAsJsonObject();
MsgEventTypeEnum eventType = detectMsgEventType(obj);
setField(result, eventType, obj);
}
return result;
}

public enum MsgEventTypeEnum {
EVENT_POPUP,EVENT_CHANGE,EVENT_SENT;
}
private MsgEventTypeEnum detectMsgEventType(JsonObject obj) {
JsonElement popupScene = obj.get("PopupScene");
if (popupScene != null) {
return MsgEventTypeEnum.EVENT_POPUP;
}

JsonElement msgId = obj.get("MsgID");
if (msgId != null) {
return MsgEventTypeEnum.EVENT_SENT;
}
JsonElement errorCode = obj.get("ErrorCode");
if (errorCode != null) {
return MsgEventTypeEnum.EVENT_SENT;
}
JsonElement errorStatus = obj.get("ErrorStatus");
if (errorStatus != null) {
return MsgEventTypeEnum.EVENT_SENT;
}

return MsgEventTypeEnum.EVENT_CHANGE;
}

private WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson setField(WxMaSubscribeMsgEvent.WxMaSubscribeMsgEventJson target,
MsgEventTypeEnum eventType, JsonObject json) {
switch (eventType) {
case EVENT_POPUP:
if (target.getPopupEvents() == null) {
target.setPopupEvents(new WxMaSubscribeMsgEvent.SubscribeMsgPopupEvent());
}
WxMaSubscribeMsgEvent.PopupEvent popupEvent = new WxMaSubscribeMsgEvent.PopupEvent();
popupEvent.setTemplateId(json.get("TemplateId").getAsString());
popupEvent.setSubscribeStatusString(json.get("SubscribeStatusString").getAsString());
popupEvent.setPopupScene(json.get("PopupScene").getAsString());
target.getPopupEvents().getList().add(popupEvent);
break;
case EVENT_CHANGE:
if (target.getChangeEvents() == null) {
target.setChangeEvents(new WxMaSubscribeMsgEvent.SubscribeMsgChangeEvent());
}
WxMaSubscribeMsgEvent.ChangeEvent changeEvent = new WxMaSubscribeMsgEvent.ChangeEvent();
changeEvent.setTemplateId(json.get("TemplateId").getAsString());
changeEvent.setSubscribeStatusString(json.get("SubscribeStatusString").getAsString());
target.getChangeEvents().getList().add(changeEvent);
break;
case EVENT_SENT:
if (target.getSentEvent() == null) {
target.setSentEvent(new WxMaSubscribeMsgEvent.SubscribeMsgSentEvent());
}
WxMaSubscribeMsgEvent.SentEvent sentEvent = new WxMaSubscribeMsgEvent.SentEvent();
sentEvent.setTemplateId(json.get("TemplateId").getAsString());
sentEvent.setMsgId(json.get("MsgID").getAsString());
sentEvent.setErrorCode(json.get("ErrorCode").getAsString());
sentEvent.setErrorStatus(json.get("ErrorStatus").getAsString());
target.getSentEvent().setList(sentEvent);
break;
}
return target;
}
}
Loading

0 comments on commit 76ea7fe

Please sign in to comment.