From 189bb924ab93652c9f0591e8957aac30dbd55146 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Apr 2026 07:43:25 +0000 Subject: [PATCH 1/4] Initial plan From 64a0990803e13bd3787a8c9282fe158f1da4706a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Apr 2026 07:50:38 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=99=9A=E6=8B=9F=E6=94=AF=E4=BB=98=20xpay=5Fcomplain?= =?UTF-8?q?t=5Fnotify=20=E6=8A=95=E8=AF=89=E6=8E=A8=E9=80=81=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/binarywang/WxJava/sessions/b157a484-8781-4f33-9556-a608aef37d78 Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../wx/miniapp/bean/WxMaMessage.java | 48 ++++++++++++- .../wx/miniapp/constant/WxMaConstants.java | 1 + .../miniapp/util/xml/XStreamTransformer.java | 2 + .../wx/miniapp/bean/WxMaMessageTest.java | 69 +++++++++++++++++++ 4 files changed, 119 insertions(+), 1 deletion(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java index 508bf9745..642191001 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMessage.java @@ -189,7 +189,7 @@ public class WxMaMessage implements Serializable { @XStreamConverter(value = XStreamCDataConverter.class) private String revokeInfo; - @SerializedName("OpenID") + @SerializedName(value = "OpenID", alternate = {"OpenId"}) @XStreamAlias("OpenID") @XStreamConverter(value = XStreamCDataConverter.class) private String openId; @@ -418,6 +418,52 @@ public class WxMaMessage implements Serializable { @XStreamAlias("TeamInfo") private WxMaXPayTeamInfo teamInfo; + // xpay_complaint_notify 用户投诉推送字段 + + /** + * 微信支付交易单号. + * xpay_complaint_notify + */ + @SerializedName("TransactionId") + @XStreamAlias("TransactionId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String complaintTransactionId; + + /** + * 投诉单号. + * xpay_complaint_notify + */ + @SerializedName("ComplaintId") + @XStreamAlias("ComplaintId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String complaintId; + + /** + * 投诉详情. + * xpay_complaint_notify + */ + @SerializedName("ComplaintDetail") + @XStreamAlias("ComplaintDetail") + @XStreamConverter(value = XStreamCDataConverter.class) + private String complaintDetail; + + /** + * 投诉时间,秒级时间戳. + * xpay_complaint_notify + */ + @SerializedName("ComplaintTime") + @XStreamAlias("ComplaintTime") + private Long complaintTime; + + /** + * 请求编号. + * xpay_complaint_notify + */ + @SerializedName("RequestId") + @XStreamAlias("RequestId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String requestId; + /** * 不要直接使用这个字段, * 这个字段只是为了适配 SubscribeMsgPopupEvent SubscribeMsgChangeEvent SubscribeMsgSentEvent diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java index eed700631..c9ab9d727 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java @@ -264,6 +264,7 @@ public static final class XPayNotifyEvent { public static String COIN_PAY = "xpay_coin_pay_notify"; public static String GOODS_DELIVER = "xpay_goods_deliver_notify"; public static String REFUND = "xpay_refund_notify"; + public static String COMPLAINT = "xpay_complaint_notify"; } @UtilityClass diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java index b9e80d734..6d4266ec8 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java @@ -101,6 +101,8 @@ private static void registerClass(Class clz) { if (clz.equals(WxMaMessage.class)) { // 操蛋的微信,模板消息推送成功的消息是MsgID,其他消息推送过来是MsgId xstream.aliasField("MsgID", WxMaMessage.class, "msgId"); + // xpay 事件推送使用 OpenId(小写d),但通用字段注解为 OpenID(大写D) + xstream.aliasField("OpenId", WxMaMessage.class, "openId"); } register(clz, xstream); diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java index 00821eb63..3f7e15426 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaMessageTest.java @@ -388,4 +388,73 @@ private void checkXPayRefundNotifyMessage(WxMaMessage msg) { assertEquals(teamInfo.getTeamType(), new Integer(1)); assertEquals(teamInfo.getTeamAction(), new Integer(0)); } + + /** + * 虚拟支付投诉推送事件 xpay_complaint_notify 测试用例(XML格式) + */ + @Test + public void testXPayComplaintNotifyFromXml() { + String xml = "\n" + + " \n" + + " \n" + + " 1700000100\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1700000050\n" + + " 0\n" + + " \n" + + ""; + + WxMaMessage msg = WxMaMessage.fromXml(xml); + checkXPayComplaintNotifyMessage(msg); + } + + /** + * 虚拟支付投诉推送事件 xpay_complaint_notify 测试用例(JSON格式) + */ + @Test + public void testXPayComplaintNotifyFromJson() { + String json = "{\n" + + " \"ToUserName\": \"gh_abcdefg\",\n" + + " \"FromUserName\": \"official_openid\",\n" + + " \"CreateTime\": 1700000100,\n" + + " \"MsgType\": \"event\",\n" + + " \"Event\": \"xpay_complaint_notify\",\n" + + " \"OpenId\": \"user_openid_abc\",\n" + + " \"WxOrderId\": \"wx_order_cmp_001\",\n" + + " \"MchOrderId\": \"mch_order_cmp_002\",\n" + + " \"TransactionId\": \"transaction_cmp_003\",\n" + + " \"ComplaintId\": \"complaint_004\",\n" + + " \"ComplaintDetail\": \"商品未收到\",\n" + + " \"ComplaintTime\": 1700000050,\n" + + " \"RetryTimes\": 0,\n" + + " \"RequestId\": \"req_005\"\n" + + "}"; + + WxMaMessage msg = WxMaMessage.fromJson(json); + checkXPayComplaintNotifyMessage(msg); + } + + private void checkXPayComplaintNotifyMessage(WxMaMessage msg) { + assertEquals(msg.getToUser(), "gh_abcdefg"); + assertEquals(msg.getFromUser(), "official_openid"); + assertEquals(msg.getCreateTime(), new Integer(1700000100)); + assertEquals(msg.getMsgType(), WxConsts.XmlMsgType.EVENT); + assertEquals(msg.getEvent(), "xpay_complaint_notify"); + assertEquals(msg.getOpenId(), "user_openid_abc"); + assertEquals(msg.getWxOrderId(), "wx_order_cmp_001"); + assertEquals(msg.getMchOrderId(), "mch_order_cmp_002"); + assertEquals(msg.getComplaintTransactionId(), "transaction_cmp_003"); + assertEquals(msg.getComplaintId(), "complaint_004"); + assertEquals(msg.getComplaintDetail(), "商品未收到"); + assertEquals(msg.getComplaintTime(), new Long(1700000050L)); + assertEquals(msg.getRetryTimes(), new Integer(0)); + assertEquals(msg.getRequestId(), "req_005"); + } } From 1fb84504b1d8504b260e5b3c2e037145f35f7d71 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Apr 2026 07:51:41 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20XStreamTransformer=20?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=B8=AD=E7=9A=84=E4=B8=AD=E6=96=87=E6=8E=92?= =?UTF-8?q?=E7=89=88=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/binarywang/WxJava/sessions/b157a484-8781-4f33-9556-a608aef37d78 Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java index 6d4266ec8..085a25f69 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java @@ -101,7 +101,7 @@ private static void registerClass(Class clz) { if (clz.equals(WxMaMessage.class)) { // 操蛋的微信,模板消息推送成功的消息是MsgID,其他消息推送过来是MsgId xstream.aliasField("MsgID", WxMaMessage.class, "msgId"); - // xpay 事件推送使用 OpenId(小写d),但通用字段注解为 OpenID(大写D) + // xpay 事件推送使用 OpenId(小写 d),但通用字段注解为 OpenID(大写 D) xstream.aliasField("OpenId", WxMaMessage.class, "openId"); } From 1b1631e79a2ce74fa5e29cf77bb33d2552589437 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 14 Apr 2026 17:16:44 +0800 Subject: [PATCH 4/4] Update weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../cn/binarywang/wx/miniapp/constant/WxMaConstants.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java index c9ab9d727..0fcf3b10f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java @@ -261,10 +261,10 @@ public static final class XPayOrderStatus { } @UtilityClass public static final class XPayNotifyEvent { - public static String COIN_PAY = "xpay_coin_pay_notify"; - public static String GOODS_DELIVER = "xpay_goods_deliver_notify"; - public static String REFUND = "xpay_refund_notify"; - public static String COMPLAINT = "xpay_complaint_notify"; + public static final String COIN_PAY = "xpay_coin_pay_notify"; + public static final String GOODS_DELIVER = "xpay_goods_deliver_notify"; + public static final String REFUND = "xpay_refund_notify"; + public static final String COMPLAINT = "xpay_complaint_notify"; } @UtilityClass