Skip to content

Commit 28a0d6e

Browse files
authored
🎨 #3860 【微信支付】转账到银行卡的查询接口增加 bank_name 和 bank_card_number_tail 字段
1 parent ae2aa43 commit 28a0d6e

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResult.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,30 @@ public String toString() {
235235
*/
236236
@SerializedName(value = "update_time")
237237
private String updateTime;
238+
/**
239+
* <pre>
240+
* 字段名:开户银行全称(含支行)
241+
* 变量名:bank_name
242+
* 是否必填:否
243+
* 类型:string[1, 128]
244+
* 描述:
245+
* 转账到银行卡时返回,开户银行全称(含支行)
246+
* 示例值:中国农业银行股份有限公司深圳分行
247+
* </pre>
248+
*/
249+
@SerializedName(value = "bank_name")
250+
private String bankName;
251+
/**
252+
* <pre>
253+
* 字段名:银行卡号后四位
254+
* 变量名:bank_card_number_tail
255+
* 是否必填:否
256+
* 类型:string[4, 4]
257+
* 描述:
258+
* 转账到银行卡时返回,用于标识银行卡的后四位
259+
* 示例值:1234
260+
* </pre>
261+
*/
262+
@SerializedName(value = "bank_card_number_tail")
263+
private String bankCardNumberTail;
238264
}
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
package com.github.binarywang.wxpay.bean.marketing.transfer;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import org.testng.annotations.Test;
6+
7+
import static org.testng.Assert.*;
8+
9+
/**
10+
* 测试 BatchDetailsResult 的字段序列化和反序列化功能
11+
*
12+
* @author Binary Wang
13+
*/
14+
public class BatchDetailsResultTest {
15+
16+
private static final Gson GSON = new GsonBuilder().create();
17+
18+
@Test
19+
public void testBankFieldsDeserialization() {
20+
// 模拟微信API返回的JSON(包含银行相关字段)
21+
String mockJson = "{\n" +
22+
" \"sp_mchid\": \"1900001109\",\n" +
23+
" \"out_batch_no\": \"plfk2020042013\",\n" +
24+
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
25+
" \"appid\": \"wxf636efh567hg4356\",\n" +
26+
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
27+
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
28+
" \"detail_status\": \"SUCCESS\",\n" +
29+
" \"transfer_amount\": 200000,\n" +
30+
" \"transfer_remark\": \"2020年4月报销\",\n" +
31+
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
32+
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
33+
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
34+
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
35+
" \"bank_name\": \"中国农业银行股份有限公司深圳分行\",\n" +
36+
" \"bank_card_number_tail\": \"1234\"\n" +
37+
"}";
38+
39+
// 反序列化JSON
40+
BatchDetailsResult result = GSON.fromJson(mockJson, BatchDetailsResult.class);
41+
42+
// 验证基本字段正常解析
43+
assertEquals(result.getSpMchid(), "1900001109");
44+
assertEquals(result.getOutBatchNo(), "plfk2020042013");
45+
assertEquals(result.getBatchId(), "1030000071100999991182020050700019480001");
46+
assertEquals(result.getAppId(), "wxf636efh567hg4356");
47+
assertEquals(result.getOutDetailNo(), "x23zy545Bd5436");
48+
assertEquals(result.getDetailId(), "1040000071100999991182020050700019500100");
49+
assertEquals(result.getDetailStatus(), "SUCCESS");
50+
assertEquals(result.getTransferAmount(), Integer.valueOf(200000));
51+
assertEquals(result.getTransferRemark(), "2020年4月报销");
52+
assertEquals(result.getOpenid(), "o-MYE42l80oelYMDE34nYD456Xoy");
53+
assertEquals(result.getUserName(), "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45");
54+
assertEquals(result.getInitiateTime(), "2015-05-20T13:29:35.120+08:00");
55+
assertEquals(result.getUpdateTime(), "2015-05-20T13:29:35.120+08:00");
56+
57+
// 验证新增的银行相关字段
58+
assertEquals(result.getBankName(), "中国农业银行股份有限公司深圳分行");
59+
assertEquals(result.getBankCardNumberTail(), "1234");
60+
}
61+
62+
@Test
63+
public void testBankFieldsWithNull() {
64+
// 测试不包含银行字段的情况(转账到零钱)
65+
String mockJsonWithoutBank = "{\n" +
66+
" \"sp_mchid\": \"1900001109\",\n" +
67+
" \"out_batch_no\": \"plfk2020042013\",\n" +
68+
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
69+
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
70+
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
71+
" \"detail_status\": \"SUCCESS\",\n" +
72+
" \"transfer_amount\": 200000,\n" +
73+
" \"transfer_remark\": \"2020年4月报销\",\n" +
74+
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
75+
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
76+
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
77+
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\"\n" +
78+
"}";
79+
80+
BatchDetailsResult result = GSON.fromJson(mockJsonWithoutBank, BatchDetailsResult.class);
81+
82+
// 验证其他字段正常
83+
assertEquals(result.getSpMchid(), "1900001109");
84+
assertEquals(result.getDetailStatus(), "SUCCESS");
85+
86+
// 验证银行字段为null(转账到零钱场景下不返回这些字段)
87+
assertNull(result.getBankName());
88+
assertNull(result.getBankCardNumberTail());
89+
}
90+
91+
@Test
92+
public void testBankFieldsSerialization() {
93+
// 测试序列化
94+
BatchDetailsResult result = new BatchDetailsResult();
95+
result.setSpMchid("1900001109");
96+
result.setOutBatchNo("plfk2020042013");
97+
result.setBatchId("1030000071100999991182020050700019480001");
98+
result.setDetailStatus("SUCCESS");
99+
result.setBankName("中国工商银行股份有限公司北京分行");
100+
result.setBankCardNumberTail("5678");
101+
102+
String json = GSON.toJson(result);
103+
104+
// 验证JSON包含银行字段
105+
assertTrue(json.contains("\"bank_name\":\"中国工商银行股份有限公司北京分行\""));
106+
assertTrue(json.contains("\"bank_card_number_tail\":\"5678\""));
107+
}
108+
109+
@Test
110+
public void testToString() {
111+
// 测试toString方法
112+
BatchDetailsResult result = new BatchDetailsResult();
113+
result.setSpMchid("1900001109");
114+
result.setBankName("中国建设银行股份有限公司上海分行");
115+
result.setBankCardNumberTail("9012");
116+
117+
String resultString = result.toString();
118+
119+
// 验证toString包含所有字段
120+
assertNotNull(resultString);
121+
assertTrue(resultString.contains("1900001109"));
122+
assertTrue(resultString.contains("中国建设银行股份有限公司上海分行"));
123+
assertTrue(resultString.contains("9012"));
124+
}
125+
126+
@Test
127+
public void testBankNameWithSpecialCharacters() {
128+
// 测试银行名称包含特殊字符的情况
129+
String mockJson = "{\n" +
130+
" \"sp_mchid\": \"1900001109\",\n" +
131+
" \"out_batch_no\": \"plfk2020042013\",\n" +
132+
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
133+
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
134+
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
135+
" \"detail_status\": \"SUCCESS\",\n" +
136+
" \"transfer_amount\": 200000,\n" +
137+
" \"transfer_remark\": \"2020年4月报销\",\n" +
138+
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
139+
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
140+
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
141+
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
142+
" \"bank_name\": \"中国农业银行股份有限公司北京市朝阳区(支行)\",\n" +
143+
" \"bank_card_number_tail\": \"0000\"\n" +
144+
"}";
145+
146+
BatchDetailsResult result = GSON.fromJson(mockJson, BatchDetailsResult.class);
147+
148+
// 验证特殊字符正确解析
149+
assertEquals(result.getBankName(), "中国农业银行股份有限公司北京市朝阳区(支行)");
150+
assertEquals(result.getBankCardNumberTail(), "0000");
151+
}
152+
153+
@Test
154+
public void testFailedTransferWithoutBankFields() {
155+
// 测试转账失败的情况
156+
String mockJson = "{\n" +
157+
" \"sp_mchid\": \"1900001109\",\n" +
158+
" \"out_batch_no\": \"plfk2020042013\",\n" +
159+
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
160+
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
161+
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
162+
" \"detail_status\": \"FAIL\",\n" +
163+
" \"transfer_amount\": 200000,\n" +
164+
" \"transfer_remark\": \"2020年4月报销\",\n" +
165+
" \"fail_reason\": \"ACCOUNT_FROZEN\",\n" +
166+
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
167+
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
168+
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
169+
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\"\n" +
170+
"}";
171+
172+
BatchDetailsResult result = GSON.fromJson(mockJson, BatchDetailsResult.class);
173+
174+
// 验证失败状态
175+
assertEquals(result.getDetailStatus(), "FAIL");
176+
assertEquals(result.getFailReason(), "ACCOUNT_FROZEN");
177+
178+
// 失败的情况下银行字段应为null
179+
assertNull(result.getBankName());
180+
assertNull(result.getBankCardNumberTail());
181+
}
182+
}

0 commit comments

Comments
 (0)