Skip to content

Commit 4959966

Browse files
committed
实现微信支付关闭订单的接口 #54
1 parent ecba1ec commit 4959966

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import me.chanjar.weixin.common.exception.WxErrorException;
44
import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback;
5+
import me.chanjar.weixin.mp.bean.pay.result.WxPayOrderCloseResult;
56
import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest;
67
import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest;
78
import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest;
@@ -35,6 +36,22 @@ public interface WxMpPayService {
3536
*/
3637
WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxErrorException;
3738

39+
/**
40+
* <pre>
41+
* 关闭订单
42+
* 应用场景
43+
* 以下情况需要调用关单接口:
44+
* 1. 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;
45+
* 2. 系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口。
46+
* 注意:订单生成后不能马上调用关单接口,最短调用时间间隔为5分钟。
47+
* 接口地址:https://api.mch.weixin.qq.com/pay/closeorder
48+
* 是否需要证书: 不需要。
49+
* </pre>
50+
* @param outTradeNo 商户系统内部的订单号,当没提供transaction_id时需要传这个。
51+
* @throws WxErrorException
52+
*/
53+
WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxErrorException;
54+
3855
/**
3956
* 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
4057
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import me.chanjar.weixin.mp.api.WxMpPayService;
99
import me.chanjar.weixin.mp.api.WxMpService;
1010
import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback;
11+
import me.chanjar.weixin.mp.bean.pay.result.WxPayOrderCloseResult;
1112
import me.chanjar.weixin.mp.bean.pay.request.*;
1213
import me.chanjar.weixin.mp.bean.pay.result.*;
1314
import org.apache.commons.codec.digest.DigestUtils;
@@ -210,6 +211,39 @@ public WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo)
210211
return result;
211212
}
212213

214+
@Override
215+
public WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxErrorException {
216+
if (StringUtils.isBlank(outTradeNo)) {
217+
throw new IllegalArgumentException("out_trade_no 不能为空");
218+
}
219+
220+
XStream xstream = XStreamInitializer.getInstance();
221+
xstream.processAnnotations(WxPayOrderCloseRequest.class);
222+
xstream.processAnnotations(WxPayOrderCloseResult.class);
223+
224+
WxPayOrderCloseRequest request = new WxPayOrderCloseRequest();
225+
request.setOutTradeNo(StringUtils.trimToNull(outTradeNo));
226+
request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
227+
request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
228+
request.setNonceStr(System.currentTimeMillis() + "");
229+
230+
String sign = this.createSign(BeanUtils.xmlBean2Map(request),
231+
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
232+
request.setSign(sign);
233+
234+
String url = PAY_BASE_URL + "/pay/closeorder";
235+
236+
String responseContent = this.wxMpService.post(url, xstream.toXML(request));
237+
WxPayOrderCloseResult result = (WxPayOrderCloseResult) xstream.fromXML(responseContent);
238+
if ("FAIL".equals(result.getResultCode())) {
239+
throw new WxErrorException(WxError.newBuilder()
240+
.setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
241+
.build());
242+
}
243+
244+
return result;
245+
}
246+
213247
@Override
214248
public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request)
215249
throws WxErrorException {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package me.chanjar.weixin.mp.bean.pay.request;
2+
3+
import com.thoughtworks.xstream.annotations.XStreamAlias;
4+
5+
/**
6+
* <pre>
7+
* 关闭订单请求对象类
8+
* Created by Binary Wang on 2016-10-27.
9+
* @author <a href="https://github.com/binarywang">binarywang(Binary Wang)</a>
10+
* </pre>
11+
*/
12+
@XStreamAlias("xml")
13+
public class WxPayOrderCloseRequest extends WxPayBaseRequest{
14+
15+
/**
16+
* <pre>
17+
* 商户订单号
18+
* out_trade_no
19+
* 二选一
20+
* String(32)
21+
* 20150806125346
22+
* 商户系统内部的订单号,当没提供transaction_id时需要传这个。
23+
* </pre>
24+
*/
25+
@XStreamAlias("out_trade_no")
26+
private String outTradeNo;
27+
28+
public String getOutTradeNo() {
29+
return this.outTradeNo;
30+
}
31+
32+
public void setOutTradeNo(String outTradeNo) {
33+
this.outTradeNo = outTradeNo;
34+
}
35+
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package me.chanjar.weixin.mp.bean.pay.result;
2+
3+
import com.thoughtworks.xstream.annotations.XStreamAlias;
4+
5+
/**
6+
* <pre>
7+
* 关闭订单结果对象类
8+
* Created by Binary Wang on 2016-10-27.
9+
* @author <a href="https://github.com/binarywang">binarywang(Binary Wang)</a>
10+
* </pre>
11+
*/
12+
@XStreamAlias("xml")
13+
public class WxPayOrderCloseResult extends WxPayBaseResult {
14+
15+
/**
16+
* 业务结果描述
17+
*/
18+
@XStreamAlias("result_msg")
19+
private String resultMsg;
20+
21+
public String getResultMsg() {
22+
return this.resultMsg;
23+
}
24+
25+
public void setResultMsg(String resultMsg) {
26+
this.resultMsg = resultMsg;
27+
}
28+
}

weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@ public final void testQueryOrder() throws WxErrorException {
8787
System.err.println(this.wxService.getPayService().queryOrder(null, "11111"));
8888
}
8989

90+
/**
91+
* Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#closeOrder(String)} .
92+
* @throws WxErrorException
93+
*/
94+
@Test
95+
public final void testCloseOrder() throws WxErrorException {
96+
System.err.println(this.wxService.getPayService().closeOrder("11212121"));
97+
}
98+
9099
/**
91100
* Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}.
92101
* @throws WxErrorException

0 commit comments

Comments
 (0)