From e6ce2f81a7c592b0d4fe91500ae7c941e6beb827 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 07:58:26 +0000 Subject: [PATCH 1/2] Initial plan From 7ee08b1e3653d058f222a2521344f7bd9b7a0d16 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Apr 2026 08:03:55 +0000 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E8=A1=A5=E5=85=85=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E6=94=AF=E4=BB=98iOS=E9=80=80=E6=AC=BE=E9=80=9A?= =?UTF-8?q?=E7=9F=A5xpay=5Fsubscribe=5Fios=5Frefund=5Fquery=5Fnotify?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=AD=97=E6=AE=B5=E5=92=8C=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=B8=B8=E9=87=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/bf33fa74-c952-4beb-ae60-2e66235e7fa5 Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../chanjar/weixin/common/api/WxConsts.java | 5 ++ .../wx/miniapp/bean/WxMaMessage.java | 74 +++++++++++++++++++ .../wx/miniapp/bean/WxMaMessageTest.java | 66 +++++++++++++++++ 3 files changed, 145 insertions(+) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index 4924682e5..512941099 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -499,6 +499,11 @@ public static class EventType { * 订单完成发货时、订单结算时 */ public static final String TRADE_MANAGE_ORDER_SETTLEMENT = "trade_manage_order_settlement"; + /** + * 虚拟支付 iOS 退款查询通知 + * 文档:https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/virtual-payment/ios.html + */ + public static final String XPAY_SUBSCRIBE_IOS_REFUND_QUERY_NOTIFY = "xpay_subscribe_ios_refund_query_notify"; } /** 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 642191001..83073850d 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 @@ -464,6 +464,80 @@ public class WxMaMessage implements Serializable { @XStreamConverter(value = XStreamCDataConverter.class) private String requestId; + // xpay_subscribe_ios_refund_query_notify iOS退款查询通知字段 + + /** + * 问询时间,Unix时间戳. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("refund_time") + @XStreamAlias("refund_time") + @XStreamConverter(value = XStreamCDataConverter.class) + private String refundTime; + + /** + * 该笔退款的订单时间(退款订单对应的交易时间),Unix时间戳. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("order_time") + @XStreamAlias("order_time") + @XStreamConverter(value = XStreamCDataConverter.class) + private String orderTime; + + /** + * Apple 支付票据号. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("channel_bill") + @XStreamAlias("channel_bill") + @XStreamConverter(value = XStreamCDataConverter.class) + private String channelBill; + + /** + * 应用的 Apple bundleid. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("bundleid") + @XStreamAlias("bundleid") + @XStreamConverter(value = XStreamCDataConverter.class) + private String bundleid; + + /** + * 道具 id. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("product_id") + @XStreamAlias("product_id") + @XStreamConverter(value = XStreamCDataConverter.class) + private String xpayProductId; + + /** + * 道具/代币数量. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("p_count") + @XStreamAlias("p_count") + @XStreamConverter(value = XStreamCDataConverter.class) + private String pCount; + + /** + * 用户请求退款的原因. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("refund_request_reason") + @XStreamAlias("refund_request_reason") + @XStreamConverter(value = XStreamCDataConverter.class) + private String refundRequestReason; + + /** + * 发货状态,0:未发货 1:已发货 2:发货中. + * xpay_subscribe_ios_refund_query_notify + */ + @SerializedName("provide_status") + @XStreamAlias("provide_status") + @XStreamConverter(value = XStreamCDataConverter.class) + private String provideStatus; + /** * 不要直接使用这个字段, * 这个字段只是为了适配 SubscribeMsgPopupEvent SubscribeMsgChangeEvent SubscribeMsgSentEvent 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 3f7e15426..922b5c37b 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 @@ -457,4 +457,70 @@ private void checkXPayComplaintNotifyMessage(WxMaMessage msg) { assertEquals(msg.getRetryTimes(), new Integer(0)); assertEquals(msg.getRequestId(), "req_005"); } + + /** + * 虚拟支付 iOS 退款查询通知事件 xpay_subscribe_ios_refund_query_notify 测试用例(XML格式) + */ + @Test + public void testXPaySubscribeIosRefundQueryNotifyFromXml() { + String xml = "\n" + + " \n" + + " \n" + + " 1700001000\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + WxMaMessage msg = WxMaMessage.fromXml(xml); + checkXPaySubscribeIosRefundQueryNotifyMessage(msg); + } + + /** + * 虚拟支付 iOS 退款查询通知事件 xpay_subscribe_ios_refund_query_notify 测试用例(JSON格式) + */ + @Test + public void testXPaySubscribeIosRefundQueryNotifyFromJson() { + String json = "{\n" + + " \"ToUserName\": \"gh_abcdefg\",\n" + + " \"FromUserName\": \"oABCDEFG\",\n" + + " \"CreateTime\": 1700001000,\n" + + " \"MsgType\": \"event\",\n" + + " \"Event\": \"xpay_subscribe_ios_refund_query_notify\",\n" + + " \"refund_time\": \"1700000900\",\n" + + " \"order_time\": \"1699990000\",\n" + + " \"channel_bill\": \"apple_bill_001\",\n" + + " \"bundleid\": \"com.example.app\",\n" + + " \"product_id\": \"product_xyz\",\n" + + " \"p_count\": \"1\",\n" + + " \"refund_request_reason\": \"不喜欢\",\n" + + " \"provide_status\": \"1\"\n" + + "}"; + + WxMaMessage msg = WxMaMessage.fromJson(json); + checkXPaySubscribeIosRefundQueryNotifyMessage(msg); + } + + private void checkXPaySubscribeIosRefundQueryNotifyMessage(WxMaMessage msg) { + assertEquals(msg.getToUser(), "gh_abcdefg"); + assertEquals(msg.getFromUser(), "oABCDEFG"); + assertEquals(msg.getCreateTime(), new Integer(1700001000)); + assertEquals(msg.getMsgType(), WxConsts.XmlMsgType.EVENT); + assertEquals(msg.getEvent(), WxConsts.EventType.XPAY_SUBSCRIBE_IOS_REFUND_QUERY_NOTIFY); + assertEquals(msg.getRefundTime(), "1700000900"); + assertEquals(msg.getOrderTime(), "1699990000"); + assertEquals(msg.getChannelBill(), "apple_bill_001"); + assertEquals(msg.getBundleid(), "com.example.app"); + assertEquals(msg.getXpayProductId(), "product_xyz"); + assertEquals(msg.getPCount(), "1"); + assertEquals(msg.getRefundRequestReason(), "不喜欢"); + assertEquals(msg.getProvideStatus(), "1"); + } }