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