Skip to content

Commit 1e075a4

Browse files
authored
🎨 #3832 【企业微信】修复 WxSignQueryResult 中 contract_expired_time 字段解析错误
1 parent e46da01 commit 1e075a4

File tree

2 files changed

+126
-1
lines changed

2 files changed

+126
-1
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ protected void loadXml(Document d) {
112112
contractDisplayAccount = readXmlString(d, "contract_display_account");
113113
contractState = readXmlInteger(d, "contract_state");
114114
contractSignedTime = readXmlString(d, "contract_signed_time");
115-
contractExpiredTime = readXmlString(d, "contrace_Expired_time");
115+
contractExpiredTime = readXmlString(d, "contract_expired_time");
116116
contractTerminatedTime = readXmlString(d, "contract_terminated_time");
117117
contractTerminatedMode = readXmlInteger(d, "contract_termination_mode");
118118
contractTerminationRemark = readXmlString(d, "contract_termination_remark");
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package com.github.binarywang.wxpay.bean.result;
2+
3+
import com.github.binarywang.wxpay.util.XmlConfig;
4+
import org.testng.Assert;
5+
import org.testng.annotations.Test;
6+
7+
/**
8+
* WxSignQueryResult 单元测试
9+
*
10+
* @author Binary Wang
11+
*/
12+
public class WxSignQueryResultTest {
13+
14+
/**
15+
* 测试 XML 解析,特别是 contract_expired_time 字段
16+
*/
17+
@Test
18+
public void testFromXML() {
19+
/*
20+
* xml样例字符串来自于官方文档
21+
* https://pay.weixin.qq.com/doc/v2/merchant/4011987640
22+
*/
23+
String xmlString = "<xml>\n" +
24+
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
25+
" <result_code><![CDATA[SUCCESS]]></result_code>\n" +
26+
" <mch_id><![CDATA[80000000]]></mch_id>\n" +
27+
" <appid><![CDATA[wx426b3015555b46be]]></appid>\n" +
28+
" <contract_id>203</contract_id>\n" +
29+
" <plan_id>66</plan_id>\n" +
30+
" <openid><![CDATA[oHZx6uMbIG46UXQ3SKxVYEgw1LZs]]></openid>\n" +
31+
" <request_serial>123</request_serial>\n" +
32+
" <contract_code><![CDATA[1005]]></contract_code>\n" +
33+
" <contract_display_account><![CDATA[test]]></contract_display_account>\n" +
34+
" <contract_state>1</contract_state>\n" +
35+
" <contract_signed_time>2015-07-01 10:00:00</contract_signed_time>\n" +
36+
" <contract_expired_time>2015-07-01 10:00:00</contract_expired_time>\n" +
37+
" <contract_terminated_time>2015-07-01 10:00:00</contract_terminated_time>\n" +
38+
" <contract_termination_mode>3</contract_termination_mode>\n" +
39+
" <contract_termination_remark><![CDATA[delete ....]]></contract_termination_remark>\n" +
40+
" <err_code>0</err_code>\n" +
41+
" <err_code_des><![CDATA[SUCCESS]]></err_code_des>\n" +
42+
" <sign><![CDATA[8FC9DACB7DDF9B48333DCCC2224E0CAC]]></sign>\n" +
43+
"</xml>";
44+
45+
// 启用 fastMode 以覆盖 WxSignQueryResult#loadXml 分支
46+
XmlConfig.fastMode = true;
47+
try {
48+
WxSignQueryResult result = WxSignQueryResult.fromXML(xmlString, WxSignQueryResult.class);
49+
50+
// 验证基本字段
51+
Assert.assertEquals(result.getReturnCode(), "SUCCESS");
52+
Assert.assertEquals(result.getResultCode(), "SUCCESS");
53+
Assert.assertEquals(result.getMchId(), "80000000");
54+
Assert.assertEquals(result.getAppid(), "wx426b3015555b46be");
55+
56+
// 验证签约相关字段
57+
Assert.assertEquals(result.getContractId(), "203");
58+
Assert.assertEquals(result.getPlanId(), "66");
59+
Assert.assertEquals(result.getOpenId(), "oHZx6uMbIG46UXQ3SKxVYEgw1LZs");
60+
Assert.assertEquals(result.getRequestSerial().longValue(), 123L);
61+
Assert.assertEquals(result.getContractCode(), "1005");
62+
Assert.assertEquals(result.getContractDisplayAccount(), "test");
63+
Assert.assertEquals(result.getContractState().intValue(), 1);
64+
65+
// 重点测试时间字段,特别是 contract_expired_time
66+
Assert.assertEquals(result.getContractSignedTime(), "2015-07-01 10:00:00");
67+
Assert.assertEquals(result.getContractExpiredTime(), "2015-07-01 10:00:00");
68+
Assert.assertEquals(result.getContractTerminatedTime(), "2015-07-01 10:00:00");
69+
70+
// 验证其他字段
71+
Assert.assertEquals(result.getContractTerminatedMode().intValue(), 3);
72+
Assert.assertEquals(result.getContractTerminationRemark(), "delete ....");
73+
} finally {
74+
// 恢复默认值
75+
XmlConfig.fastMode = false;
76+
}
77+
}
78+
79+
/**
80+
* 测试 XML 解析 - 只包含必填字段
81+
*/
82+
@Test
83+
public void testFromXML_RequiredFieldsOnly() {
84+
String xmlString = "<xml>\n" +
85+
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
86+
" <result_code><![CDATA[SUCCESS]]></result_code>\n" +
87+
" <mch_id><![CDATA[10000098]]></mch_id>\n" +
88+
" <appid><![CDATA[wxcbda96de0b165486]]></appid>\n" +
89+
" <contract_id>Wx15463511252015071056489715</contract_id>\n" +
90+
" <plan_id>123</plan_id>\n" +
91+
" <request_serial>1695</request_serial>\n" +
92+
" <contract_code><![CDATA[100001256]]></contract_code>\n" +
93+
" <contract_display_account><![CDATA[张三]]></contract_display_account>\n" +
94+
" <contract_state>0</contract_state>\n" +
95+
" <contract_signed_time>2015-07-01 10:00:00</contract_signed_time>\n" +
96+
" <contract_expired_time>2016-07-01 10:00:00</contract_expired_time>\n" +
97+
" <openid><![CDATA[ozoKAt9TIPHfwVMkcniiNKZ1vbyw]]></openid>\n" +
98+
" <sign><![CDATA[C380BEC2BFD727A4B6845133519F3AD6]]></sign>\n" +
99+
"</xml>";
100+
101+
// 启用 fastMode 以覆盖 WxSignQueryResult#loadXml 分支
102+
XmlConfig.fastMode = true;
103+
try {
104+
WxSignQueryResult result = WxSignQueryResult.fromXML(xmlString, WxSignQueryResult.class);
105+
106+
// 验证必填字段
107+
Assert.assertEquals(result.getReturnCode(), "SUCCESS");
108+
Assert.assertEquals(result.getResultCode(), "SUCCESS");
109+
Assert.assertEquals(result.getContractId(), "Wx15463511252015071056489715");
110+
Assert.assertEquals(result.getPlanId(), "123");
111+
Assert.assertEquals(result.getContractState().intValue(), 0);
112+
113+
// 验证 contract_expired_time 字段能正确解析
114+
Assert.assertEquals(result.getContractExpiredTime(), "2016-07-01 10:00:00");
115+
116+
// 验证非必填字段为 null
117+
Assert.assertNull(result.getContractTerminatedTime());
118+
Assert.assertNull(result.getContractTerminatedMode());
119+
Assert.assertNull(result.getContractTerminationRemark());
120+
} finally {
121+
// 恢复默认值
122+
XmlConfig.fastMode = false;
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)