From bec6109edac3ea96a9f6be29bad9110d369cd2bb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:12:12 +0000 Subject: [PATCH 1/4] Initial plan From 0dfd466edec6a9883c85a2046bf0ff241a5a5efe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:18:12 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8DV3=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E9=A2=84=E6=94=AF=E4=BB=98=E5=8F=82=E6=95=B0packageValue?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8E=E5=BE=AE=E4=BF=A1=E5=AE=98=E6=96=B9?= =?UTF-8?q?API=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0@SerializedName("package")=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/binarywang/WxJava/sessions/4f76043e-c058-4838-8d60-a43a1c878544 Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../bean/ecommerce/TransactionsResult.java | 8 +++ .../result/CombineTransactionsResult.java | 8 +++ .../result/WxPayUnifiedOrderV3Result.java | 8 +++ .../result/WxPayUnifiedOrderV3ResultTest.java | 51 ++++++++++++++++++- 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java index 818bc5ec99..8e11d859b6 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java @@ -65,6 +65,10 @@ public static class JsapiResult implements Serializable { private String appId; private String timeStamp; private String nonceStr; + /** + * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 + */ + @SerializedName("package") private String packageValue; private String signType; private String paySign; @@ -80,6 +84,10 @@ public static class AppResult implements Serializable { private String appid; private String partnerid; private String prepayid; + /** + * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 + */ + @SerializedName("package") private String packageValue; private String noncestr; private String timestamp; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java index 34512a4d05..2ff718b81a 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java @@ -73,6 +73,10 @@ public static class JsapiResult implements Serializable { private String appId; private String timeStamp; private String nonceStr; + /** + * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 + */ + @SerializedName("package") private String packageValue; private String signType; private String paySign; @@ -89,6 +93,10 @@ public static class AppResult implements Serializable { private String appid; private String partnerid; private String prepayid; + /** + * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 + */ + @SerializedName("package") private String packageValue; private String noncestr; private String timestamp; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java index 5b60f3b520..00b72864c9 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java @@ -78,6 +78,10 @@ public static class JsapiResult implements Serializable { private String appId; private String timeStamp; private String nonceStr; + /** + * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 + */ + @SerializedName("package") private String packageValue; private String signType; private String paySign; @@ -108,6 +112,10 @@ public static class AppResult implements Serializable { private String appid; private String partnerId; private String prepayId; + /** + * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 + */ + @SerializedName("package") private String packageValue; private String noncestr; private String timestamp; diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java index 2e824b0e00..b2b214ab86 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java @@ -2,6 +2,8 @@ import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; import com.github.binarywang.wxpay.v3.util.SignUtils; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import org.testng.Assert; import org.testng.annotations.Test; @@ -200,8 +202,55 @@ public void testAppResultWithPrepayId() throws Exception { } /** - * 测试getJsapiPayInfo方法的空值验证 + * 测试JsapiResult序列化为JSON时,packageValue字段名应为package(兼容微信官方API要求) */ + @Test + public void testJsapiResultJsonSerializationPackageFieldName() throws Exception { + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = + WxPayUnifiedOrderV3Result.getJsapiPayInfo(testPrepayId, testAppId, privateKey); + + // 验证Java字段名仍为packageValue + Assert.assertEquals(jsapiResult.getPackageValue(), "prepay_id=" + testPrepayId); + + // 验证JSON序列化后字段名为package(微信官方要求) + Gson gson = new Gson(); + JsonObject jsonObject = gson.toJsonTree(jsapiResult).getAsJsonObject(); + Assert.assertTrue(jsonObject.has("package"), "JSON中应该包含package字段"); + Assert.assertFalse(jsonObject.has("packageValue"), "JSON中不应该包含packageValue字段"); + Assert.assertEquals(jsonObject.get("package").getAsString(), "prepay_id=" + testPrepayId); + } + + /** + * 测试AppResult序列化为JSON时,packageValue字段名应为package(兼容微信官方API要求) + */ + @Test + public void testAppResultJsonSerializationPackageFieldName() throws Exception { + String testPrepayId = "wx201410272009395522657a690389285100"; + String testAppId = "wx8888888888888888"; + String testMchId = "1900000109"; + KeyPair keyPair = generateKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + + WxPayUnifiedOrderV3Result.AppResult appResult = + WxPayUnifiedOrderV3Result.getAppPayInfo(testPrepayId, testAppId, testMchId, privateKey); + + // 验证Java字段名仍为packageValue + Assert.assertEquals(appResult.getPackageValue(), "Sign=WXPay"); + + // 验证JSON序列化后字段名为package(微信官方要求) + Gson gson = new Gson(); + JsonObject jsonObject = gson.toJsonTree(appResult).getAsJsonObject(); + Assert.assertTrue(jsonObject.has("package"), "JSON中应该包含package字段"); + Assert.assertFalse(jsonObject.has("packageValue"), "JSON中不应该包含packageValue字段"); + Assert.assertEquals(jsonObject.get("package").getAsString(), "Sign=WXPay"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "prepayId, appId 和 privateKey 不能为空") public void testGetJsapiPayInfoWithNullPrepayId() { From dd6d48ea15dc703b0ec1d6391fcf9630a33d75b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:19:09 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E5=A4=9A=E4=BD=99=E7=9A=84=E7=A9=BA?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/binarywang/WxJava/sessions/4f76043e-c058-4838-8d60-a43a1c878544 Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java index b2b214ab86..c3e2a62ca1 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java @@ -250,8 +250,7 @@ public void testAppResultJsonSerializationPackageFieldName() throws Exception { Assert.assertEquals(jsonObject.get("package").getAsString(), "Sign=WXPay"); } - - @Test(expectedExceptions = IllegalArgumentException.class, + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "prepayId, appId 和 privateKey 不能为空") public void testGetJsapiPayInfoWithNullPrepayId() { WxPayUnifiedOrderV3Result.getJsapiPayInfo(null, "appId", null); From 49c1559a7af95cf8d9d3e8afce46c41ff0b3bbc5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 7 Apr 2026 13:35:34 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=E4=B8=BAWxPayUnifiedOrderV3Result.AppResul?= =?UTF-8?q?t=E7=9A=84partnerId=E5=92=8CprepayId=E6=B7=BB=E5=8A=A0@Serializ?= =?UTF-8?q?edName=E6=B3=A8=E8=A7=A3=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=B8=8E?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=AE=98=E6=96=B9API=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/binarywang/WxJava/sessions/099513d0-4cde-45a3-850c-1afec934741c Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../wxpay/bean/result/WxPayUnifiedOrderV3Result.java | 2 ++ .../wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java index 00b72864c9..e832f4c02b 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java @@ -110,7 +110,9 @@ public static class AppResult implements Serializable { private static final long serialVersionUID = 5465773025172875110L; private String appid; + @SerializedName("partnerid") private String partnerId; + @SerializedName("prepayid") private String prepayId; /** * 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名 diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java index c3e2a62ca1..15775ed701 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java @@ -248,6 +248,13 @@ public void testAppResultJsonSerializationPackageFieldName() throws Exception { Assert.assertTrue(jsonObject.has("package"), "JSON中应该包含package字段"); Assert.assertFalse(jsonObject.has("packageValue"), "JSON中不应该包含packageValue字段"); Assert.assertEquals(jsonObject.get("package").getAsString(), "Sign=WXPay"); + // 验证JSON序列化后partnerid和prepayid字段名为全小写(微信官方要求) + Assert.assertTrue(jsonObject.has("partnerid"), "JSON中应该包含partnerid字段"); + Assert.assertFalse(jsonObject.has("partnerId"), "JSON中不应该包含驼峰的partnerId字段"); + Assert.assertEquals(jsonObject.get("partnerid").getAsString(), testMchId); + Assert.assertTrue(jsonObject.has("prepayid"), "JSON中应该包含prepayid字段"); + Assert.assertFalse(jsonObject.has("prepayId"), "JSON中不应该包含驼峰的prepayId字段"); + Assert.assertEquals(jsonObject.get("prepayid").getAsString(), testPrepayId); } @Test(expectedExceptions = IllegalArgumentException.class,