Skip to content

Commit 41a694c

Browse files
Copilotbinarywang
andcommitted
修复 WxSignQueryResult 中 contract_expired_time 字段解析错误
Co-authored-by: binarywang <[email protected]>
1 parent 4b60768 commit 41a694c

File tree

2 files changed

+111
-1
lines changed

2 files changed

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

0 commit comments

Comments
 (0)