Java微信支付之关闭订单
关闭订单是指在订单未支付或者支付失败的情况下,商家可以通过接口关闭订单。在Java微信支付中,关闭订单是通过调用微信支付提供的关闭订单API来实现的。下面我们就来介绍一下Java微信支付中如何关闭订单。
一、关闭订单的作用
在商家发现订单存在异常或者用户取消订单时,可以通过关闭订单接口将订单关闭。关闭订单后,用户无法再进行支付,如果用户已经下单,支付完成后订单会自动变为已支付状态。
二、Java微信支付中关闭订单的流程
1. 获取Access Token
在调用微信支付API之前,需要先获取Access Token,Access Token是用来验证身份的令牌,它是一串由微信支付分配的字符串,在验证成功后才能调用API。
获取Access Token的方法有两种:
(1)通过AppID和AppSecret获取Access Token
(2)通过OAuth2.0网页授权获取Access Token
2.调用关闭订单API
调用关闭订单API需要传入以下参数:
参数 | 必填 | 类型 | 说明
---|---|---|---
appid | 是 | String(32) | 公众账号ID
mch_id | 是 | String(32) | 微信支付分配的商户号
out_trade_no | 是 | String(32) | 商户系统内部的订单号
nonce_str | 是 | String(32) | 随机字符串
sign_type | 否 | String(32) | 签名类型,默认为MD5
sign | 是 | String(32) | 签名
注意事项:
(1)参数需按照文档要求正确填写,签名方式必须是MD5。
(2)如果成功调用关闭订单接口,会返回result_code为SUCCESS的XML格式数据。
(3)如果调用接口出现异常,会抛出异常。
3. 解析返回结果
调用关闭订单API后,微信支付会返回一个XML格式数据。我们需要将这些数据解析出来,判断是否关闭成功。
XML格式数据示例:
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wxd930ea5d5a258f4f]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[NpgJUd6d8yKZEzcd]]></nonce_str> <sign><![CDATA[8F6B48E92990EB9AF00D6FA8A2A0CC3C]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <result_msg><![CDATA[OK]]></result_msg> </xml>
4. 封装关闭订单API
我们可以将关闭订单API封装成一个Java方法,方便日后调用。
/**
* 关闭订单
*
* @param outTradeNo 商户订单号
* @param appid 公众账号ID
* @param mchId 商户号
* @param apiKey 商户的API秘钥
* @return true-关闭订单成功,false-关闭订单失败
* @throws Exception 订单关闭失败
*/
public static boolean closeOrder(String outTradeNo, String appid, String mchId, String apiKey) throws Exception {
SortedMap<String, Object> params = new TreeMap<>();
params.put("appid", appid);
params.put("mch_id", mchId);
params.put("out_trade_no", outTradeNo);
params.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
String sign = PayUtil.createSign(params, apiKey);
params.put("sign", sign);
String xml = PayUtil.mapToXml(params);
String result = HttpUtil.httpsRequest(CLOSE_ORDER_URL, "POST", xml);
Map<String, String> map = PayUtil.xmlToMap(result);
if ("SUCCESS".equals(map.get("return_code")) && "SUCCESS".equals(map.get("result_code"))) {
return true;
} else {
throw new Exception("关闭订单失败,错误信息:" + map.get("return_msg"));
}
}
5. 测试
可以编写一个JUnit测试类来测试关闭订单API的实现:
public class CloseOrderTest {
@Test
public void closeOrderTest() {
try {
boolean result = WeChatPayUtil.closeOrder("1234567890", "wx123456", "1234567890", "abcdefg");
Assert.assertTrue(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、总结
本文介绍了Java微信支付中如何关闭订单。关闭订单的流程主要包括获取Access Token、调用关闭订单API、解析返回结果、封装关闭订单API和测试。在实现关闭订单API时,需要注意参数填写顺序以及签名方式等细节。
