From 8fd85451d57a32691f4901cc2869abf60aaeab16 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 03:38:49 +0000 Subject: [PATCH 1/2] Initial plan From 9504d63b2374dcc162cc707e9cb6f07529e7b298 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 03:45:05 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20BatchDetailsResult=20?= =?UTF-8?q?=E7=9A=84=20bankName=20=E5=92=8C=20bankCardNumberTail=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8F=8A=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../transfer/BatchDetailsResult.java | 26 +++ .../transfer/BatchDetailsResultTest.java | 182 ++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResultTest.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResult.java index 4ca7958ed5..854fd6ba5a 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResult.java @@ -235,4 +235,30 @@ public String toString() { */ @SerializedName(value = "update_time") private String updateTime; + /** + *
+   * 字段名:开户银行全称(含支行)
+   * 变量名:bank_name
+   * 是否必填:否
+   * 类型:string[1, 128]
+   * 描述:
+   * 转账到银行卡时返回,开户银行全称(含支行)
+   * 示例值:中国农业银行股份有限公司深圳分行
+   * 
+ */ + @SerializedName(value = "bank_name") + private String bankName; + /** + *
+   * 字段名:银行卡号后四位
+   * 变量名:bank_card_number_tail
+   * 是否必填:否
+   * 类型:string[4, 4]
+   * 描述:
+   * 转账到银行卡时返回,用于标识银行卡的后四位
+   * 示例值:1234
+   * 
+ */ + @SerializedName(value = "bank_card_number_tail") + private String bankCardNumberTail; } diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResultTest.java new file mode 100644 index 0000000000..c2347300a6 --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/marketing/transfer/BatchDetailsResultTest.java @@ -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()); + } +}