1
0
mirror of synced 2026-02-07 11:07:51 +08:00

🎨 #3860 【微信支付】转账到银行卡的查询接口增加 bank_name 和 bank_card_number_tail 字段

This commit is contained in:
Copilot
2026-01-20 13:37:39 +08:00
committed by GitHub
parent ae2aa43190
commit 28a0d6e8ee
2 changed files with 208 additions and 0 deletions

View File

@@ -235,4 +235,30 @@ public class BatchDetailsResult implements Serializable {
*/
@SerializedName(value = "update_time")
private String updateTime;
/**
* <pre>
* 字段名:开户银行全称(含支行)
* 变量名bank_name
* 是否必填:否
* 类型string[1, 128]
* 描述:
* 转账到银行卡时返回,开户银行全称(含支行)
* 示例值:中国农业银行股份有限公司深圳分行
* </pre>
*/
@SerializedName(value = "bank_name")
private String bankName;
/**
* <pre>
* 字段名:银行卡号后四位
* 变量名bank_card_number_tail
* 是否必填:否
* 类型string[4, 4]
* 描述:
* 转账到银行卡时返回,用于标识银行卡的后四位
* 示例值1234
* </pre>
*/
@SerializedName(value = "bank_card_number_tail")
private String bankCardNumberTail;
}

View File

@@ -0,0 +1,182 @@
package com.github.binarywang.wxpay.bean.marketing.transfer;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
* 测试 BatchDetailsResult 的字段序列化和反序列化功能
*
* @author Binary Wang
*/
public class BatchDetailsResultTest {
private static final Gson GSON = new GsonBuilder().create();
@Test
public void testBankFieldsDeserialization() {
// 模拟微信API返回的JSON包含银行相关字段
String mockJson = "{\n" +
" \"sp_mchid\": \"1900001109\",\n" +
" \"out_batch_no\": \"plfk2020042013\",\n" +
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
" \"appid\": \"wxf636efh567hg4356\",\n" +
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
" \"detail_status\": \"SUCCESS\",\n" +
" \"transfer_amount\": 200000,\n" +
" \"transfer_remark\": \"2020年4月报销\",\n" +
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
" \"bank_name\": \"中国农业银行股份有限公司深圳分行\",\n" +
" \"bank_card_number_tail\": \"1234\"\n" +
"}";
// 反序列化JSON
BatchDetailsResult result = GSON.fromJson(mockJson, BatchDetailsResult.class);
// 验证基本字段正常解析
assertEquals(result.getSpMchid(), "1900001109");
assertEquals(result.getOutBatchNo(), "plfk2020042013");
assertEquals(result.getBatchId(), "1030000071100999991182020050700019480001");
assertEquals(result.getAppId(), "wxf636efh567hg4356");
assertEquals(result.getOutDetailNo(), "x23zy545Bd5436");
assertEquals(result.getDetailId(), "1040000071100999991182020050700019500100");
assertEquals(result.getDetailStatus(), "SUCCESS");
assertEquals(result.getTransferAmount(), Integer.valueOf(200000));
assertEquals(result.getTransferRemark(), "2020年4月报销");
assertEquals(result.getOpenid(), "o-MYE42l80oelYMDE34nYD456Xoy");
assertEquals(result.getUserName(), "757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45");
assertEquals(result.getInitiateTime(), "2015-05-20T13:29:35.120+08:00");
assertEquals(result.getUpdateTime(), "2015-05-20T13:29:35.120+08:00");
// 验证新增的银行相关字段
assertEquals(result.getBankName(), "中国农业银行股份有限公司深圳分行");
assertEquals(result.getBankCardNumberTail(), "1234");
}
@Test
public void testBankFieldsWithNull() {
// 测试不包含银行字段的情况(转账到零钱)
String mockJsonWithoutBank = "{\n" +
" \"sp_mchid\": \"1900001109\",\n" +
" \"out_batch_no\": \"plfk2020042013\",\n" +
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
" \"detail_status\": \"SUCCESS\",\n" +
" \"transfer_amount\": 200000,\n" +
" \"transfer_remark\": \"2020年4月报销\",\n" +
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\"\n" +
"}";
BatchDetailsResult result = GSON.fromJson(mockJsonWithoutBank, BatchDetailsResult.class);
// 验证其他字段正常
assertEquals(result.getSpMchid(), "1900001109");
assertEquals(result.getDetailStatus(), "SUCCESS");
// 验证银行字段为null转账到零钱场景下不返回这些字段
assertNull(result.getBankName());
assertNull(result.getBankCardNumberTail());
}
@Test
public void testBankFieldsSerialization() {
// 测试序列化
BatchDetailsResult result = new BatchDetailsResult();
result.setSpMchid("1900001109");
result.setOutBatchNo("plfk2020042013");
result.setBatchId("1030000071100999991182020050700019480001");
result.setDetailStatus("SUCCESS");
result.setBankName("中国工商银行股份有限公司北京分行");
result.setBankCardNumberTail("5678");
String json = GSON.toJson(result);
// 验证JSON包含银行字段
assertTrue(json.contains("\"bank_name\":\"中国工商银行股份有限公司北京分行\""));
assertTrue(json.contains("\"bank_card_number_tail\":\"5678\""));
}
@Test
public void testToString() {
// 测试toString方法
BatchDetailsResult result = new BatchDetailsResult();
result.setSpMchid("1900001109");
result.setBankName("中国建设银行股份有限公司上海分行");
result.setBankCardNumberTail("9012");
String resultString = result.toString();
// 验证toString包含所有字段
assertNotNull(resultString);
assertTrue(resultString.contains("1900001109"));
assertTrue(resultString.contains("中国建设银行股份有限公司上海分行"));
assertTrue(resultString.contains("9012"));
}
@Test
public void testBankNameWithSpecialCharacters() {
// 测试银行名称包含特殊字符的情况
String mockJson = "{\n" +
" \"sp_mchid\": \"1900001109\",\n" +
" \"out_batch_no\": \"plfk2020042013\",\n" +
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
" \"detail_status\": \"SUCCESS\",\n" +
" \"transfer_amount\": 200000,\n" +
" \"transfer_remark\": \"2020年4月报销\",\n" +
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
" \"bank_name\": \"中国农业银行股份有限公司北京市朝阳区(支行)\",\n" +
" \"bank_card_number_tail\": \"0000\"\n" +
"}";
BatchDetailsResult result = GSON.fromJson(mockJson, BatchDetailsResult.class);
// 验证特殊字符正确解析
assertEquals(result.getBankName(), "中国农业银行股份有限公司北京市朝阳区(支行)");
assertEquals(result.getBankCardNumberTail(), "0000");
}
@Test
public void testFailedTransferWithoutBankFields() {
// 测试转账失败的情况
String mockJson = "{\n" +
" \"sp_mchid\": \"1900001109\",\n" +
" \"out_batch_no\": \"plfk2020042013\",\n" +
" \"batch_id\": \"1030000071100999991182020050700019480001\",\n" +
" \"out_detail_no\": \"x23zy545Bd5436\",\n" +
" \"detail_id\": \"1040000071100999991182020050700019500100\",\n" +
" \"detail_status\": \"FAIL\",\n" +
" \"transfer_amount\": 200000,\n" +
" \"transfer_remark\": \"2020年4月报销\",\n" +
" \"fail_reason\": \"ACCOUNT_FROZEN\",\n" +
" \"openid\": \"o-MYE42l80oelYMDE34nYD456Xoy\",\n" +
" \"username\": \"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45\",\n" +
" \"initiate_time\": \"2015-05-20T13:29:35.120+08:00\",\n" +
" \"update_time\": \"2015-05-20T13:29:35.120+08:00\"\n" +
"}";
BatchDetailsResult result = GSON.fromJson(mockJson, BatchDetailsResult.class);
// 验证失败状态
assertEquals(result.getDetailStatus(), "FAIL");
assertEquals(result.getFailReason(), "ACCOUNT_FROZEN");
// 失败的情况下银行字段应为null
assertNull(result.getBankName());
assertNull(result.getBankCardNumberTail());
}
}