From 37c2db9672f9b84ba33c4618571d088717d91373 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:01:40 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#3832=20=E3=80=90=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E3=80=91=E4=BF=AE=E5=A4=8D=20WxSignQueryResu?= =?UTF-8?q?lt=20=E4=B8=AD=20contract=5Fexpired=5Ftime=20=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/bean/result/WxSignQueryResult.java | 2 +- .../bean/result/WxSignQueryResultTest.java | 125 ++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResultTest.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java index 524159719..af19aec60 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java @@ -112,7 +112,7 @@ public class WxSignQueryResult extends BaseWxPayResult implements Serializable { contractDisplayAccount = readXmlString(d, "contract_display_account"); contractState = readXmlInteger(d, "contract_state"); contractSignedTime = readXmlString(d, "contract_signed_time"); - contractExpiredTime = readXmlString(d, "contrace_Expired_time"); + contractExpiredTime = readXmlString(d, "contract_expired_time"); contractTerminatedTime = readXmlString(d, "contract_terminated_time"); contractTerminatedMode = readXmlInteger(d, "contract_termination_mode"); contractTerminationRemark = readXmlString(d, "contract_termination_remark"); diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResultTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResultTest.java new file mode 100644 index 000000000..52df2b6e2 --- /dev/null +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResultTest.java @@ -0,0 +1,125 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.github.binarywang.wxpay.util.XmlConfig; +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * WxSignQueryResult 单元测试 + * + * @author Binary Wang + */ +public class WxSignQueryResultTest { + + /** + * 测试 XML 解析,特别是 contract_expired_time 字段 + */ + @Test + public void testFromXML() { + /* + * xml样例字符串来自于官方文档 + * https://pay.weixin.qq.com/doc/v2/merchant/4011987640 + */ + String xmlString = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 203\n" + + " 66\n" + + " \n" + + " 123\n" + + " \n" + + " \n" + + " 1\n" + + " 2015-07-01 10:00:00\n" + + " 2015-07-01 10:00:00\n" + + " 2015-07-01 10:00:00\n" + + " 3\n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + ""; + + // 启用 fastMode 以覆盖 WxSignQueryResult#loadXml 分支 + XmlConfig.fastMode = true; + try { + WxSignQueryResult result = WxSignQueryResult.fromXML(xmlString, WxSignQueryResult.class); + + // 验证基本字段 + Assert.assertEquals(result.getReturnCode(), "SUCCESS"); + Assert.assertEquals(result.getResultCode(), "SUCCESS"); + Assert.assertEquals(result.getMchId(), "80000000"); + Assert.assertEquals(result.getAppid(), "wx426b3015555b46be"); + + // 验证签约相关字段 + Assert.assertEquals(result.getContractId(), "203"); + Assert.assertEquals(result.getPlanId(), "66"); + Assert.assertEquals(result.getOpenId(), "oHZx6uMbIG46UXQ3SKxVYEgw1LZs"); + Assert.assertEquals(result.getRequestSerial().longValue(), 123L); + Assert.assertEquals(result.getContractCode(), "1005"); + Assert.assertEquals(result.getContractDisplayAccount(), "test"); + Assert.assertEquals(result.getContractState().intValue(), 1); + + // 重点测试时间字段,特别是 contract_expired_time + Assert.assertEquals(result.getContractSignedTime(), "2015-07-01 10:00:00"); + Assert.assertEquals(result.getContractExpiredTime(), "2015-07-01 10:00:00"); + Assert.assertEquals(result.getContractTerminatedTime(), "2015-07-01 10:00:00"); + + // 验证其他字段 + Assert.assertEquals(result.getContractTerminatedMode().intValue(), 3); + Assert.assertEquals(result.getContractTerminationRemark(), "delete ...."); + } finally { + // 恢复默认值 + XmlConfig.fastMode = false; + } + } + + /** + * 测试 XML 解析 - 只包含必填字段 + */ + @Test + public void testFromXML_RequiredFieldsOnly() { + String xmlString = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " Wx15463511252015071056489715\n" + + " 123\n" + + " 1695\n" + + " \n" + + " \n" + + " 0\n" + + " 2015-07-01 10:00:00\n" + + " 2016-07-01 10:00:00\n" + + " \n" + + " \n" + + ""; + + // 启用 fastMode 以覆盖 WxSignQueryResult#loadXml 分支 + XmlConfig.fastMode = true; + try { + WxSignQueryResult result = WxSignQueryResult.fromXML(xmlString, WxSignQueryResult.class); + + // 验证必填字段 + Assert.assertEquals(result.getReturnCode(), "SUCCESS"); + Assert.assertEquals(result.getResultCode(), "SUCCESS"); + Assert.assertEquals(result.getContractId(), "Wx15463511252015071056489715"); + Assert.assertEquals(result.getPlanId(), "123"); + Assert.assertEquals(result.getContractState().intValue(), 0); + + // 验证 contract_expired_time 字段能正确解析 + Assert.assertEquals(result.getContractExpiredTime(), "2016-07-01 10:00:00"); + + // 验证非必填字段为 null + Assert.assertNull(result.getContractTerminatedTime()); + Assert.assertNull(result.getContractTerminatedMode()); + Assert.assertNull(result.getContractTerminationRemark()); + } finally { + // 恢复默认值 + XmlConfig.fastMode = false; + } + } +}