Skip to content

Commit f3b8cf6

Browse files
authored
🎨 #3954 【微信支付】修复V3支付预支付参数packageValue字段与微信官方API不一致问题,添加@SerializedName("package")注解
1 parent fb45833 commit f3b8cf6

File tree

4 files changed

+83
-2
lines changed

4 files changed

+83
-2
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ public static class JsapiResult implements Serializable {
6565
private String appId;
6666
private String timeStamp;
6767
private String nonceStr;
68+
/**
69+
* 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名
70+
*/
71+
@SerializedName("package")
6872
private String packageValue;
6973
private String signType;
7074
private String paySign;
@@ -80,6 +84,10 @@ public static class AppResult implements Serializable {
8084
private String appid;
8185
private String partnerid;
8286
private String prepayid;
87+
/**
88+
* 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名
89+
*/
90+
@SerializedName("package")
8391
private String packageValue;
8492
private String noncestr;
8593
private String timestamp;

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/CombineTransactionsResult.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ public static class JsapiResult implements Serializable {
7373
private String appId;
7474
private String timeStamp;
7575
private String nonceStr;
76+
/**
77+
* 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名
78+
*/
79+
@SerializedName("package")
7680
private String packageValue;
7781
private String signType;
7882
private String paySign;
@@ -89,6 +93,10 @@ public static class AppResult implements Serializable {
8993
private String appid;
9094
private String partnerid;
9195
private String prepayid;
96+
/**
97+
* 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名
98+
*/
99+
@SerializedName("package")
92100
private String packageValue;
93101
private String noncestr;
94102
private String timestamp;

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3Result.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ public static class JsapiResult implements Serializable {
7878
private String appId;
7979
private String timeStamp;
8080
private String nonceStr;
81+
/**
82+
* 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名
83+
*/
84+
@SerializedName("package")
8185
private String packageValue;
8286
private String signType;
8387
private String paySign;
@@ -106,8 +110,14 @@ public static class AppResult implements Serializable {
106110
private static final long serialVersionUID = 5465773025172875110L;
107111

108112
private String appid;
113+
@SerializedName("partnerid")
109114
private String partnerId;
115+
@SerializedName("prepayid")
110116
private String prepayId;
117+
/**
118+
* 由于package为java保留关键字,因此改为packageValue,序列化时会自动转换为package字段名
119+
*/
120+
@SerializedName("package")
111121
private String packageValue;
112122
private String noncestr;
113123
private String timestamp;

weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxPayUnifiedOrderV3ResultTest.java

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
44
import com.github.binarywang.wxpay.v3.util.SignUtils;
5+
import com.google.gson.Gson;
6+
import com.google.gson.JsonObject;
57
import org.testng.Assert;
68
import org.testng.annotations.Test;
79

@@ -200,9 +202,62 @@ public void testAppResultWithPrepayId() throws Exception {
200202
}
201203

202204
/**
203-
* 测试getJsapiPayInfo方法的空值验证
205+
* 测试JsapiResult序列化为JSON时,packageValue字段名应为package(兼容微信官方API要求)
204206
*/
205-
@Test(expectedExceptions = IllegalArgumentException.class,
207+
@Test
208+
public void testJsapiResultJsonSerializationPackageFieldName() throws Exception {
209+
String testPrepayId = "wx201410272009395522657a690389285100";
210+
String testAppId = "wx8888888888888888";
211+
KeyPair keyPair = generateKeyPair();
212+
PrivateKey privateKey = keyPair.getPrivate();
213+
214+
WxPayUnifiedOrderV3Result.JsapiResult jsapiResult =
215+
WxPayUnifiedOrderV3Result.getJsapiPayInfo(testPrepayId, testAppId, privateKey);
216+
217+
// 验证Java字段名仍为packageValue
218+
Assert.assertEquals(jsapiResult.getPackageValue(), "prepay_id=" + testPrepayId);
219+
220+
// 验证JSON序列化后字段名为package(微信官方要求)
221+
Gson gson = new Gson();
222+
JsonObject jsonObject = gson.toJsonTree(jsapiResult).getAsJsonObject();
223+
Assert.assertTrue(jsonObject.has("package"), "JSON中应该包含package字段");
224+
Assert.assertFalse(jsonObject.has("packageValue"), "JSON中不应该包含packageValue字段");
225+
Assert.assertEquals(jsonObject.get("package").getAsString(), "prepay_id=" + testPrepayId);
226+
}
227+
228+
/**
229+
* 测试AppResult序列化为JSON时,packageValue字段名应为package(兼容微信官方API要求)
230+
*/
231+
@Test
232+
public void testAppResultJsonSerializationPackageFieldName() throws Exception {
233+
String testPrepayId = "wx201410272009395522657a690389285100";
234+
String testAppId = "wx8888888888888888";
235+
String testMchId = "1900000109";
236+
KeyPair keyPair = generateKeyPair();
237+
PrivateKey privateKey = keyPair.getPrivate();
238+
239+
WxPayUnifiedOrderV3Result.AppResult appResult =
240+
WxPayUnifiedOrderV3Result.getAppPayInfo(testPrepayId, testAppId, testMchId, privateKey);
241+
242+
// 验证Java字段名仍为packageValue
243+
Assert.assertEquals(appResult.getPackageValue(), "Sign=WXPay");
244+
245+
// 验证JSON序列化后字段名为package(微信官方要求)
246+
Gson gson = new Gson();
247+
JsonObject jsonObject = gson.toJsonTree(appResult).getAsJsonObject();
248+
Assert.assertTrue(jsonObject.has("package"), "JSON中应该包含package字段");
249+
Assert.assertFalse(jsonObject.has("packageValue"), "JSON中不应该包含packageValue字段");
250+
Assert.assertEquals(jsonObject.get("package").getAsString(), "Sign=WXPay");
251+
// 验证JSON序列化后partnerid和prepayid字段名为全小写(微信官方要求)
252+
Assert.assertTrue(jsonObject.has("partnerid"), "JSON中应该包含partnerid字段");
253+
Assert.assertFalse(jsonObject.has("partnerId"), "JSON中不应该包含驼峰的partnerId字段");
254+
Assert.assertEquals(jsonObject.get("partnerid").getAsString(), testMchId);
255+
Assert.assertTrue(jsonObject.has("prepayid"), "JSON中应该包含prepayid字段");
256+
Assert.assertFalse(jsonObject.has("prepayId"), "JSON中不应该包含驼峰的prepayId字段");
257+
Assert.assertEquals(jsonObject.get("prepayid").getAsString(), testPrepayId);
258+
}
259+
260+
@Test(expectedExceptions = IllegalArgumentException.class,
206261
expectedExceptionsMessageRegExp = "prepayId, appId 和 privateKey 不能为空")
207262
public void testGetJsapiPayInfoWithNullPrepayId() {
208263
WxPayUnifiedOrderV3Result.getJsapiPayInfo(null, "appId", null);

0 commit comments

Comments
 (0)