From 20c6842dbe6cc02b1030f831c17abe31700264cc Mon Sep 17 00:00:00 2001 From: LJY_SG <1501926076@qq.com> Date: Tue, 25 Aug 2026 15:15:29 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20#4114=E3=80=90=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E3=80=91=E4=BF=AE=E5=A4=8D=E7=94=B5=E5=95=86?= =?UTF-8?q?=E6=97=A7=E6=8E=A5=E5=8F=A3closePartnerTransactions=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1outTradeNo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/service/EcommerceService.java | 17 ++++++++++++++++- .../LegacyEcommerceApiCompatibilityTest.java | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java index d4e344993..997a6689d 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/EcommerceService.java @@ -109,7 +109,7 @@ default com.github.binarywang.wxpay.bean.ecommerce.PartnerTransactionsResult que /** @deprecated 从 4.8.5.B 起,请改用 {@link #closePartnerOrder(WxPayPartnerOrderCloseV3Request)};5.0 将移除。 */ @Deprecated default String closePartnerTransactions(com.github.binarywang.wxpay.bean.ecommerce.PartnerTransactionsCloseRequest request) throws WxPayException { - closePartnerOrder(LEGACY_ECOMMERCE_GSON.fromJson(LEGACY_ECOMMERCE_GSON.toJson(request), WxPayPartnerOrderCloseV3Request.class)); + closePartnerOrder(toUnifiedPartnerOrderCloseRequest(request)); return null; } @@ -122,6 +122,21 @@ static SignatureHeader toUnifiedSignatureHeader(com.github.binarywang.wxpay.bean .signature(header.getSigned()).serial(header.getSerialNo()).build(); } + /** + * 旧电商关闭请求转统一模型。 + *

{@code outTradeNo} 在两侧均为 path 参数({@code transient}),不能走 Gson 往返,否则会丢失。 + */ + static WxPayPartnerOrderCloseV3Request toUnifiedPartnerOrderCloseRequest( + com.github.binarywang.wxpay.bean.ecommerce.PartnerTransactionsCloseRequest request) { + if (request == null) { + return null; + } + return new WxPayPartnerOrderCloseV3Request() + .setSpMchId(request.getSpMchid()) + .setSubMchId(request.getSubMchid()) + .setOutTradeNo(request.getOutTradeNo()); + } + /** *

    * 二级商户进件API
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/LegacyEcommerceApiCompatibilityTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/LegacyEcommerceApiCompatibilityTest.java
index 21f371d12..f0b578341 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/LegacyEcommerceApiCompatibilityTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/LegacyEcommerceApiCompatibilityTest.java
@@ -1,7 +1,9 @@
 package com.github.binarywang.wxpay.service;
 
+import com.github.binarywang.wxpay.bean.ecommerce.PartnerTransactionsCloseRequest;
 import com.github.binarywang.wxpay.bean.ecommerce.TransactionsResult;
 import com.github.binarywang.wxpay.bean.ecommerce.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.bean.request.WxPayPartnerOrderCloseV3Request;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -68,6 +70,21 @@ public void shouldIncludeTimestampAndNonceInLegacyHeaderEquality() {
     Assert.assertNotEquals(first, second);
   }
 
+  @Test
+  public void shouldPreserveOutTradeNoWhenMappingLegacyCloseRequest() {
+    PartnerTransactionsCloseRequest legacyRequest = new PartnerTransactionsCloseRequest();
+    legacyRequest.setSpMchid("1230000109");
+    legacyRequest.setSubMchid("1900000109");
+    legacyRequest.setOutTradeNo("1217752501201407033233368018");
+
+    WxPayPartnerOrderCloseV3Request unifiedRequest =
+      EcommerceService.toUnifiedPartnerOrderCloseRequest(legacyRequest);
+
+    Assert.assertEquals(unifiedRequest.getSpMchId(), "1230000109");
+    Assert.assertEquals(unifiedRequest.getSubMchId(), "1900000109");
+    Assert.assertEquals(unifiedRequest.getOutTradeNo(), "1217752501201407033233368018");
+  }
+
   @Test
   public void shouldReadLegacySerializedHeaderFields() throws Exception {
     String legacySerializedHeader = "rO0ABXNyADpjb20uZ2l0aHViLmJpbmFyeXdhbmcud3hwYXkuYmVhbi5lY29tbWVyY2UuU2lnbmF0dXJlSGVhZGVyn3ApxLekv9MCAARMAAVub25jZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACHNlcmlhbE5vcQB+AAFMAAZzaWduZWRxAH4AAUwACXRpbWVTdGFtcHEAfgABeHB0AAVub25jZXQACXNlcmlhbC1ub3QABnNpZ25lZHQACXRpbWVzdGFtcA==";