Skip to content

Commit c69a82d

Browse files
authored
🎨 #3942 【微信支付】修复WxSignQueryResult 缺少 change_type 和 operate_time 字段导致签约回调无法判断类型
1 parent 60185c1 commit c69a82d

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,36 @@ public class WxSignQueryResult extends BaseWxPayResult implements Serializable {
102102
@XStreamAlias("openid")
103103
private String openId;
104104

105+
/**
106+
* 变更类型, ADD:签约,DELETE:解约
107+
* 签约/解约回调通知时返回
108+
*/
109+
@XStreamAlias("change_type")
110+
private String changeType;
111+
112+
/**
113+
* 操作时间
114+
* 签约/解约回调通知时返回
115+
*/
116+
@XStreamAlias("operate_time")
117+
private String operateTime;
118+
119+
/**
120+
* 为保持向后兼容保留的构造函数(不含 changeType、operateTime 字段)。
121+
*
122+
* @deprecated 请使用包含所有字段的全参构造函数。
123+
*/
124+
@Deprecated
125+
public WxSignQueryResult(String contractId, String planId, Long requestSerial,
126+
String contractCode, String contractDisplayAccount,
127+
Integer contractState, String contractSignedTime,
128+
String contractExpiredTime, String contractTerminatedTime,
129+
Integer contractTerminatedMode, String contractTerminationRemark,
130+
String openId) {
131+
this(contractId, planId, requestSerial, contractCode, contractDisplayAccount,
132+
contractState, contractSignedTime, contractExpiredTime, contractTerminatedTime,
133+
contractTerminatedMode, contractTerminationRemark, openId, null, null);
134+
}
105135

106136
@Override
107137
protected void loadXml(Document d) {
@@ -117,6 +147,8 @@ protected void loadXml(Document d) {
117147
contractTerminatedMode = readXmlInteger(d, "contract_termination_mode");
118148
contractTerminationRemark = readXmlString(d, "contract_termination_remark");
119149
openId = readXmlString(d, "openid");
150+
changeType = readXmlString(d, "change_type");
151+
operateTime = readXmlString(d, "operate_time");
120152
}
121153

122154
@Override

weixin-java-pay/src/test/java/com/github/binarywang/wxpay/bean/result/WxSignQueryResultTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,74 @@ public void testFromXML_RequiredFieldsOnly() {
117117
Assert.assertNull(result.getContractTerminatedTime());
118118
Assert.assertNull(result.getContractTerminatedMode());
119119
Assert.assertNull(result.getContractTerminationRemark());
120+
Assert.assertNull(result.getChangeType());
121+
Assert.assertNull(result.getOperateTime());
120122
} finally {
121123
// 恢复默认值
122124
XmlConfig.fastMode = false;
123125
}
124126
}
127+
128+
/**
129+
* 测试签约回调通知 XML 解析 - change_type = ADD
130+
*/
131+
@Test
132+
public void testFromXML_SignCallback_Add() {
133+
String xmlString = "<xml>\n" +
134+
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
135+
" <appid><![CDATA[wx426b3015555b46be]]></appid>\n" +
136+
" <mch_id><![CDATA[10000098]]></mch_id>\n" +
137+
" <contract_id><![CDATA[Wx15463511252015071056489715]]></contract_id>\n" +
138+
" <plan_id>123</plan_id>\n" +
139+
" <openid><![CDATA[ozoKAt9TIPHfwVMkcniiNKZ1vbyw]]></openid>\n" +
140+
" <request_serial>1695</request_serial>\n" +
141+
" <contract_code><![CDATA[100001256]]></contract_code>\n" +
142+
" <change_type><![CDATA[ADD]]></change_type>\n" +
143+
" <operate_time>2015-07-01 10:00:00</operate_time>\n" +
144+
" <contract_expired_time>2016-07-01 10:00:00</contract_expired_time>\n" +
145+
" <sign><![CDATA[C380BEC2BFD727A4B6845133519F3AD6]]></sign>\n" +
146+
"</xml>";
147+
148+
XmlConfig.fastMode = true;
149+
try {
150+
WxSignQueryResult result = WxSignQueryResult.fromXML(xmlString, WxSignQueryResult.class);
151+
152+
Assert.assertEquals(result.getChangeType(), "ADD");
153+
Assert.assertEquals(result.getOperateTime(), "2015-07-01 10:00:00");
154+
} finally {
155+
XmlConfig.fastMode = false;
156+
}
157+
}
158+
159+
/**
160+
* 测试解约回调通知 XML 解析 - change_type = DELETE
161+
*/
162+
@Test
163+
public void testFromXML_SignCallback_Delete() {
164+
String xmlString = "<xml>\n" +
165+
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
166+
" <appid><![CDATA[wx426b3015555b46be]]></appid>\n" +
167+
" <mch_id><![CDATA[10000098]]></mch_id>\n" +
168+
" <contract_id><![CDATA[Wx15463511252015071056489715]]></contract_id>\n" +
169+
" <plan_id>123</plan_id>\n" +
170+
" <openid><![CDATA[ozoKAt9TIPHfwVMkcniiNKZ1vbyw]]></openid>\n" +
171+
" <request_serial>1695</request_serial>\n" +
172+
" <contract_code><![CDATA[100001256]]></contract_code>\n" +
173+
" <change_type><![CDATA[DELETE]]></change_type>\n" +
174+
" <operate_time>2015-07-01 11:00:00</operate_time>\n" +
175+
" <contract_termination_mode>2</contract_termination_mode>\n" +
176+
" <sign><![CDATA[C380BEC2BFD727A4B6845133519F3AD6]]></sign>\n" +
177+
"</xml>";
178+
179+
XmlConfig.fastMode = true;
180+
try {
181+
WxSignQueryResult result = WxSignQueryResult.fromXML(xmlString, WxSignQueryResult.class);
182+
183+
Assert.assertEquals(result.getChangeType(), "DELETE");
184+
Assert.assertEquals(result.getOperateTime(), "2015-07-01 11:00:00");
185+
Assert.assertEquals(result.getContractTerminatedMode().intValue(), 2);
186+
} finally {
187+
XmlConfig.fastMode = false;
188+
}
189+
}
125190
}

0 commit comments

Comments
 (0)