From 15578949545adcb40694bad97dacfd9c978ccc94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E4=B8=89=E5=B2=81?= <1794014950@qq.com> Date: Fri, 30 Dec 2022 09:19:38 +0000 Subject: [PATCH] =?UTF-8?q?:art:=20=E3=80=90=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E3=80=91=E8=A1=A5=E5=85=85=E5=AF=B9=E8=AE=A2=E9=98=85=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E7=B1=BB=E5=9E=8B=E7=9A=84=E6=B6=88=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bean/message/WxMpSubscribeMsgEvent.java | 144 ++++++++++++++++++ .../mp/bean/message/WxMpXmlMessage.java | 13 ++ .../mp/bean/message/WxMpXmlMessageTest.java | 81 ++++++++++ 3 files changed, 238 insertions(+) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpSubscribeMsgEvent.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpSubscribeMsgEvent.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpSubscribeMsgEvent.java new file mode 100644 index 000000000..d3def164b --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpSubscribeMsgEvent.java @@ -0,0 +1,144 @@ +package me.chanjar.weixin.mp.bean.message; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +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; + +/** + * WxMpSubscribeMsgEvent class + * 订阅通知事件推送,与小程序一致 + * @author liuxy + * created on 2022/12/30 + */ +public class WxMpSubscribeMsgEvent { + /** + * https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html + * */ + @Data + @XStreamAlias("SubscribeMsgPopupEvent") + @JacksonXmlRootElement(localName = "SubscribeMsgPopupEvent") + public static class SubscribeMsgPopupEvent implements Serializable { + private static final long serialVersionUID = 6329723189257161326L; + @XStreamImplicit(itemFieldName = "List") + @JacksonXmlElementWrapper(useWrapping = false) + @JacksonXmlProperty(localName = "List") + private List list = new LinkedList<>(); + } + + @Data + @XStreamAlias("SubscribeMsgChangeEvent") + @JacksonXmlRootElement(localName = "SubscribeMsgChangeEvent") + public static class SubscribeMsgChangeEvent implements Serializable { + private static final long serialVersionUID = 7205686111539437751L; + @XStreamImplicit(itemFieldName = "List") + @JacksonXmlElementWrapper(useWrapping = false) + @JacksonXmlProperty(localName = "List") + private List list = new LinkedList<>(); + } + + @Data + @XStreamAlias("SubscribeMsgSentEvent") + @JacksonXmlRootElement(localName = "SubscribeMsgSentEvent") + public static class SubscribeMsgSentEvent implements Serializable { + private static final long serialVersionUID = 7305686111539437752L; + @XStreamImplicit(itemFieldName = "List") + @JacksonXmlElementWrapper(useWrapping = false) + @JacksonXmlProperty(localName = "List") + private List list = new LinkedList<>(); + } + + + @Data + public static class PopupEvent implements Serializable { + private static final long serialVersionUID = 4934029303242387226L; + /** + * 模板id + */ + @XStreamAlias("TemplateId") + @XStreamConverter(value = XStreamCDataConverter.class) + @JacksonXmlProperty(localName = "TemplateId") + @JacksonXmlCData + private String templateId; + /** + * 订阅结果(accept接收;reject拒收) + */ + @XStreamAlias("SubscribeStatusString") + @XStreamConverter(value = XStreamCDataConverter.class) + @JacksonXmlProperty(localName = "SubscribeStatusString") + @JacksonXmlCData + private String subscribeStatusString; + /** + * 弹框场景,1代表弹窗来自 H5 页面, 2代表弹窗来自图文消息 + */ + @XStreamAlias("PopupScene") + @JacksonXmlProperty(localName = "PopupScene") + private String popupScene; + } + + @Data + public static class ChangeEvent implements Serializable { + private static final long serialVersionUID = 3523634146232757624L; + /** + * 模板id + */ + @XStreamAlias("TemplateId") + @XStreamConverter(value = XStreamCDataConverter.class) + @JacksonXmlProperty(localName = "TemplateId") + @JacksonXmlCData + private String templateId; + /** + * 订阅结果(accept接收;reject拒收) + */ + @XStreamAlias("SubscribeStatusString") + @XStreamConverter(value = XStreamCDataConverter.class) + @JacksonXmlProperty(localName = "SubscribeStatusString") + @JacksonXmlCData + private String subscribeStatusString; + } + + @Data + public static class SentEvent implements Serializable { + private static final long serialVersionUID = 1734478345463177940L; + /** + * 模板id + */ + @XStreamAlias("TemplateId") + @XStreamConverter(value = XStreamCDataConverter.class) + @JacksonXmlProperty(localName = "TemplateId") + @JacksonXmlCData + private String templateId; + + /** + * 消息id + */ + @XStreamAlias("MsgID") + @JacksonXmlProperty(localName = "MsgID") + private String msgId; + + /** + * 推送结果状态码(0表示成功) + */ + @XStreamAlias("ErrorCode") + @JacksonXmlProperty(localName = "ErrorCode") + private String errorCode; + + /** + * 推送结果状态码文字含义 + */ + @XStreamAlias("ErrorStatus") + @XStreamConverter(value = XStreamCDataConverter.class) + @JacksonXmlProperty(localName = "ErrorStatus") + @JacksonXmlCData + private String errorStatus; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java index 698187139..2c801f93e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java @@ -846,6 +846,19 @@ public class WxMpXmlMessage implements Serializable { @JacksonXmlProperty(localName = "Encrypt") private String encrypt; + @XStreamAlias("SubscribeMsgPopupEvent") + @JacksonXmlProperty(localName = "SubscribeMsgPopupEvent") + private WxMpSubscribeMsgEvent.SubscribeMsgPopupEvent subscribeMsgPopupEvent; + + @XStreamAlias("SubscribeMsgChangeEvent") + @JacksonXmlProperty(localName = "SubscribeMsgChangeEvent") + private WxMpSubscribeMsgEvent.SubscribeMsgChangeEvent subscribeMsgChangeEvent; + + @XStreamAlias("SubscribeMsgSentEvent") + @JacksonXmlProperty(localName = "SubscribeMsgSentEvent") + private WxMpSubscribeMsgEvent.SubscribeMsgSentEvent subscribeMsgSentEvent; + + public static WxMpXmlMessage fromXml(String xml) { //修改微信变态的消息内容格式,方便解析 xml = xml.replace("", ""); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java index b8d884362..ba8dd1b80 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessageTest.java @@ -276,4 +276,85 @@ public class WxMpXmlMessageTest { assertThat(resultList.get(1).get("NeedReplaceContent")).isEqualTo("1"); assertThat(resultList.get(1).get("NeedShowReprintSource")).isEqualTo("1"); } + + public void testSubMsgPopupFromXml() { + + String xml = "" + + "" + + "" + + "1610969440" + + "" + + "" + + "" + + "" + + "" + + "" + + "2" + + "" + + "" + + "" + + "" + + "2" + + "" + + "" + + ""; + + WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml); + WxMpSubscribeMsgEvent.PopupEvent popupEvent = wxMessage.getSubscribeMsgPopupEvent().getList().get(0); + assertEquals(popupEvent.getTemplateId(), "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc"); + assertEquals(popupEvent.getSubscribeStatusString(), "accept"); + assertEquals(popupEvent.getPopupScene(), "2"); + WxMpSubscribeMsgEvent.PopupEvent popupEvent2 = wxMessage.getSubscribeMsgPopupEvent().getList().get(1); + assertEquals(popupEvent2.getTemplateId(), "9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI"); + assertEquals(popupEvent2.getSubscribeStatusString(), "reject"); + assertEquals(popupEvent2.getPopupScene(), "2"); + } + + public void testSubMsgChangeFromXml() { + + String xml = "" + + "" + + "" + + "1610969440" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + + WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml); + WxMpSubscribeMsgEvent.ChangeEvent changeEvent = wxMessage.getSubscribeMsgChangeEvent().getList().get(0); + assertEquals(changeEvent.getTemplateId(), "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc"); + assertEquals(changeEvent.getSubscribeStatusString(), "reject"); + } + + public void testSubMsgSentFromXml() { + + String xml = "" + + "" + + "" + + "1610969440" + + "" + + "" + + "" + + "" + + "" + + "1700827132819554304" + + "0" + + "" + + "" + + "" + + ""; + + WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml); + WxMpSubscribeMsgEvent.SentEvent sentEvent = wxMessage.getSubscribeMsgSentEvent().getList().get(0); + assertEquals(sentEvent.getTemplateId(), "VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc"); + assertEquals(sentEvent.getMsgId(), "1700827132819554304"); + assertEquals(sentEvent.getErrorCode(), "0"); + assertEquals(sentEvent.getErrorStatus(), "success"); + } }