Skip to content

#2400 WxMaMessage 增加TemplateId、SubscribeStatusString等相关属性 #2477

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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