Skip to content

Commit 1c8e4b0

Browse files
authored
修复reservationTransferBatch中证书懒加载NPE问题,并补充TransferBillsRequest授权字段序列化测试
1 parent a24a442 commit 1c8e4b0

2 files changed

Lines changed: 77 additions & 2 deletions

File tree

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/TransferServiceImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,12 @@ public ReservationTransferBatchResult reservationTransferBatch(ReservationTransf
140140
String url = String.format("%s/v3/fund-app/mch-transfer/reservation/transfer-batches", this.payService.getPayBaseUrl());
141141
List<ReservationTransferBatchRequest.TransferDetail> transferDetailList = request.getTransferDetailList();
142142
if (transferDetailList != null && !transferDetailList.isEmpty()) {
143-
X509Certificate validCertificate = this.payService.getConfig().getVerifier().getValidCertificate();
143+
X509Certificate validCertificate = null;
144144
for (ReservationTransferBatchRequest.TransferDetail detail : transferDetailList) {
145145
if (detail.getUserName() != null && !detail.getUserName().isEmpty()) {
146+
if (validCertificate == null) {
147+
validCertificate = this.payService.getConfig().getVerifier().getValidCertificate();
148+
}
146149
RsaCryptoUtil.encryptFields(detail, validCertificate);
147150
}
148151
}

weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/TransferAuthorizationApiCompatibilityTest.java

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.github.binarywang.wxpay.service.impl;
22

3-
import com.github.binarywang.wxpay.bean.transfer.ReservationTransferBatchRequest;
43
import com.github.binarywang.wxpay.bean.transfer.ReservationTransferBatchGetResult;
4+
import com.github.binarywang.wxpay.bean.transfer.ReservationTransferBatchRequest;
55
import com.github.binarywang.wxpay.bean.transfer.ReservationTransferBatchResult;
6+
import com.github.binarywang.wxpay.bean.transfer.TransferBillsRequest;
67
import com.github.binarywang.wxpay.bean.transfer.UserAuthorizationStatusResult;
78
import com.github.binarywang.wxpay.exception.WxPayException;
89
import com.github.binarywang.wxpay.service.WxPayService;
@@ -220,6 +221,77 @@ public void shouldCloseReservationTransferBatchWithCorrectPath() throws WxPayExc
220221
Assert.assertEquals(handler.lastPostBody, "");
221222
}
222223

224+
/**
225+
* 验证 TransferBillsRequest 中授权相关字段可正确序列化为 JSON(含 @SerializedName 映射)。
226+
*/
227+
public void shouldSerializeTransferBillsRequestAuthorizationFields() {
228+
Gson gson = new Gson();
229+
TransferBillsRequest request = TransferBillsRequest.newBuilder()
230+
.appid("wxf636efh5xxxxx")
231+
.outBillNo("OUT_BILL_001")
232+
.transferSceneId("1005")
233+
.openid("oX_7Jzr9gSZz4X_Xc9-_7HGf8XzI")
234+
.transferAmount(100)
235+
.transferRemark("测试转账")
236+
.receiptAuthorizationMode("NO_CONFIRM_RECEIPT_AUTHORIZATION")
237+
.authorizationInfo(TransferBillsRequest.AuthorizationInfo.newBuilder()
238+
.userDisplayName("张三")
239+
.outAuthorizationNo("OUT_AUTH_001")
240+
.authorizationNotifyUrl("https://example.com/auth/notify")
241+
.build())
242+
.build();
243+
244+
String json = gson.toJson(request);
245+
246+
Assert.assertTrue(json.contains("\"receipt_authorization_mode\""),
247+
"JSON 应包含 receipt_authorization_mode 字段");
248+
Assert.assertTrue(json.contains("NO_CONFIRM_RECEIPT_AUTHORIZATION"),
249+
"JSON 应包含 receipt_authorization_mode 的值");
250+
Assert.assertTrue(json.contains("\"authorization_info\""),
251+
"JSON 应包含 authorization_info 嵌套字段");
252+
Assert.assertTrue(json.contains("\"user_display_name\""),
253+
"JSON 应包含 user_display_name 字段");
254+
Assert.assertTrue(json.contains("张三"),
255+
"JSON 应包含 user_display_name 的值");
256+
Assert.assertTrue(json.contains("\"out_authorization_no\""),
257+
"JSON 应包含 out_authorization_no 字段");
258+
Assert.assertTrue(json.contains("OUT_AUTH_001"),
259+
"JSON 应包含 out_authorization_no 的值");
260+
Assert.assertTrue(json.contains("\"authorization_notify_url\""),
261+
"JSON 应包含 authorization_notify_url 字段");
262+
Assert.assertTrue(json.contains("https://example.com/auth/notify"),
263+
"JSON 应包含 authorization_notify_url 的值");
264+
}
265+
266+
/**
267+
* 验证通过 authorization_id 和 out_authorization_no 顶层字段发起免确认转账时序列化正确。
268+
*/
269+
public void shouldSerializeTransferBillsRequestWithTopLevelAuthFields() {
270+
Gson gson = new Gson();
271+
TransferBillsRequest request = TransferBillsRequest.newBuilder()
272+
.appid("wxf636efh5xxxxx")
273+
.outBillNo("OUT_BILL_002")
274+
.transferSceneId("1005")
275+
.openid("oX_7Jzr9gSZz4X_Xc9-_7HGf8XzI")
276+
.transferAmount(200)
277+
.transferRemark("免确认转账")
278+
.receiptAuthorizationMode("NO_CONFIRM_RECEIPT_AUTHORIZATION")
279+
.authorizationId("AUTH_ID_001")
280+
.outAuthorizationNo("OUT_AUTH_002")
281+
.build();
282+
283+
String json = gson.toJson(request);
284+
285+
Assert.assertTrue(json.contains("\"authorization_id\""),
286+
"JSON 应包含 authorization_id 字段");
287+
Assert.assertTrue(json.contains("AUTH_ID_001"),
288+
"JSON 应包含 authorization_id 的值");
289+
Assert.assertTrue(json.contains("\"out_authorization_no\""),
290+
"JSON 应包含 out_authorization_no 字段");
291+
Assert.assertTrue(json.contains("OUT_AUTH_002"),
292+
"JSON 应包含 out_authorization_no 的值");
293+
}
294+
223295
/**
224296
* 通过动态代理拦截 WxPayService 请求并记录 URL/请求体,便于断言接口路径和参数。
225297
*/

0 commit comments

Comments
 (0)