🆕 #3063 【微信支付】增加服务商模式关闭订单的接口

This commit is contained in:
Pursuer丶
2023-06-25 11:45:24 +08:00
committed by GitHub
parent cb7efb79cf
commit 10b1e4db73
7 changed files with 208 additions and 37 deletions

View File

@@ -5,6 +5,7 @@ import com.github.binarywang.wxpay.bean.coupon.*;
import com.github.binarywang.wxpay.bean.notify.*;
import com.github.binarywang.wxpay.bean.request.*;
import com.github.binarywang.wxpay.bean.result.*;
import com.github.binarywang.wxpay.bean.result.enums.PartnerTradeTypeEnum;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
@@ -477,6 +478,23 @@ public interface WxPayService {
*/
void closeOrderV3(String outTradeNo) throws WxPayException;
/**
* <pre>
* 服务商关闭订单
* 应用场景
* 以下情况需要调用关单接口:
* 1、商户订单支付失败需要生成新单号重新发起支付要对原订单号调用关单避免重复支付
* 2、系统下单后用户支付超时系统退出不再受理避免用户继续请调用关单接口。
* 注意关单没有时间限制建议在订单生成后间隔几分钟最短5分钟再调用关单接口避免出现订单状态同步不及时导致关单失败。
* 接口地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_3.shtml
* </pre>
*
* @param outTradeNo 商户系统内部的订单号
* @return the wx pay order close result
* @throws WxPayException the wx pay exception
*/
void closePartnerOrderV3(String outTradeNo) throws WxPayException;
/**
* <pre>
* 关闭订单
@@ -494,6 +512,23 @@ public interface WxPayService {
*/
void closeOrderV3(WxPayOrderCloseV3Request request) throws WxPayException;
/**
* <pre>
* 服务商关闭订单
* 应用场景
* 以下情况需要调用关单接口:
* 1、商户订单支付失败需要生成新单号重新发起支付要对原订单号调用关单避免重复支付
* 2、系统下单后用户支付超时系统退出不再受理避免用户继续请调用关单接口。
* 注意关单没有时间限制建议在订单生成后间隔几分钟最短5分钟再调用关单接口避免出现订单状态同步不及时导致关单失败。
* 接口地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_3.shtml
* </pre>
*
* @param request 关闭订单请求对象
* @return the wx pay order close result
* @throws WxPayException the wx pay exception
*/
void closePartnerOrderV3(WxPayPartnerOrderCloseV3Request request) throws WxPayException;
/**
* <pre>
* 合单关闭订单API
@@ -559,7 +594,7 @@ public interface WxPayService {
* @return 返回 {@link com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result}里的内部类或字段
* @throws WxPayException the wx pay exception
*/
<T> T createPartnerOrderV3(TradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException;
<T> T createPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException;
/**
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
@@ -569,7 +604,7 @@ public interface WxPayService {
* @return the wx pay unified order result
* @throws WxPayException the wx pay exception
*/
WxPayUnifiedOrderV3Result unifiedPartnerOrderV3(TradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException;
WxPayUnifiedOrderV3Result unifiedPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException;
/**
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"

View File

@@ -10,6 +10,7 @@ import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
import com.github.binarywang.wxpay.bean.request.*;
import com.github.binarywang.wxpay.bean.result.*;
import com.github.binarywang.wxpay.bean.result.enums.PartnerTradeTypeEnum;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.config.WxPayConfigHolder;
@@ -538,6 +539,16 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
this.closeOrderV3(request);
}
@Override
public void closePartnerOrderV3(String outTradeNo) throws WxPayException {
if (StringUtils.isBlank(outTradeNo)) {
throw new WxPayException("out_trade_no不能为空");
}
WxPayPartnerOrderCloseV3Request request = new WxPayPartnerOrderCloseV3Request();
request.setOutTradeNo(StringUtils.trimToNull(outTradeNo));
this.closePartnerOrderV3(request);
}
@Override
public void closeOrderV3(WxPayOrderCloseV3Request request) throws WxPayException {
if (StringUtils.isBlank(request.getMchid())) {
@@ -547,6 +558,18 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
this.postV3(url, GSON.toJson(request));
}
@Override
public void closePartnerOrderV3(WxPayPartnerOrderCloseV3Request request) throws WxPayException {
if (StringUtils.isBlank(request.getSpMchId())) {
request.setSpMchId(this.getConfig().getMchId());
}
if (StringUtils.isBlank(request.getSubMchId())) {
request.setSubMchId(this.getConfig().getSubMchId());
}
String url = String.format("%s/v3/pay/partner/transactions/out-trade-no/%s/close", this.getPayBaseUrl(), request.getOutTradeNo());
this.postV3(url, GSON.toJson(request));
}
@Override
public void closeCombine(CombineCloseRequest request) throws WxPayException {
String url = String.format("%s/v3/combine-transactions/out-trade-no/%s/close", this.getPayBaseUrl(), request.getCombineOutTradeNo());
@@ -664,34 +687,19 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
}
@Override
public <T> T createPartnerOrderV3(TradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException {
public <T> T createPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException {
WxPayUnifiedOrderV3Result result = this.unifiedPartnerOrderV3(tradeType, request);
//获取应用ID
String appId = StringUtils.isBlank(request.getSubAppid()) ? request.getSpAppid() : request.getSubAppid();
return result.getPayInfo(tradeType, appId, request.getSubMchId(), this.getConfig().getPrivateKey());
return result.getPartnerPayInfo(tradeType, appId, request.getSubMchId(), this.getConfig().getPrivateKey());
}
@Override
public WxPayUnifiedOrderV3Result unifiedPartnerOrderV3(TradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException {
if (StringUtils.isBlank(request.getSpAppid())) {
request.setSpAppid(this.getConfig().getAppId());
}
if (StringUtils.isBlank(request.getSpMchId())) {
request.setSpMchId(this.getConfig().getMchId());
}
if (StringUtils.isBlank(request.getNotifyUrl())) {
request.setNotifyUrl(this.getConfig().getNotifyUrl());
}
if (StringUtils.isBlank(request.getSubAppid())) {
request.setSubAppid(this.getConfig().getSubAppId());
}
if (StringUtils.isBlank(request.getSubMchId())) {
request.setSubMchId(this.getConfig().getSubMchId());
}
String url = this.getPayBaseUrl() + tradeType.getPartnerUrl();
String response = this.postV3(url, GSON.toJson(request));
return GSON.fromJson(response, WxPayUnifiedOrderV3Result.class);
public WxPayUnifiedOrderV3Result unifiedPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException {
WxPayUnifiedOrderV3Result result = this.unifiedPartnerOrderV3(tradeType, request);
//获取应用ID
String appId = StringUtils.isBlank(request.getSubAppid()) ? request.getSpAppid() : request.getSubAppid();
return result.getPartnerPayInfo(tradeType, appId, request.getSubMchId(), this.getConfig().getPrivateKey());
}
@Override