Commit 717caf527a130590b9554cd6b5d002bd8f00dd58

Authored by YunaiV
1 parent f46a0371

mall + pay:

1. 增加微信支付 Client 的查询订单接口
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java
... ... @@ -115,7 +115,7 @@ public abstract class AbstractAlipayPayClient extends AbstractPayClient<AlipayPa
115 115 outTradeNo, response);
116 116 }
117 117  
118   - private Integer parseStatus(String tradeStatus) {
  118 + private static Integer parseStatus(String tradeStatus) {
119 119 return Objects.equals("WAIT_BUYER_PAY", tradeStatus) ? PayOrderStatusRespEnum.WAITING.getStatus()
120 120 : ObjectUtils.equalsAny(tradeStatus, "TRADE_FINISHED", "TRADE_SUCCESS") ? PayOrderStatusRespEnum.SUCCESS.getStatus()
121 121 : Objects.equals("TRADE_CLOSED", tradeStatus) ? PayOrderStatusRespEnum.CLOSED.getStatus() : null;
... ...
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java
... ... @@ -16,8 +16,12 @@ import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
16 16 import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
17 17 import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
18 18 import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
  19 +import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
  20 +import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
19 21 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
20 22 import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
  23 +import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
  24 +import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
21 25 import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
22 26 import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
23 27 import com.github.binarywang.wxpay.config.WxPayConfig;
... ... @@ -115,7 +119,6 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC
115 119  
116 120 @Override
117 121 public PayOrderRespDTO doParseOrderNotify(Map<String, String> params, String body) throws WxPayException {
118   - // 微信支付 v2 回调结果处理
119 122 switch (config.getApiVersion()) {
120 123 case API_VERSION_V2:
121 124 return doParseOrderNotifyV2(body);
... ... @@ -130,7 +133,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
130 133 // 1. 解析回调
131 134 WxPayOrderNotifyResult response = client.parseOrderNotifyResult(body);
132 135 // 2. 构建结果
133   - // 微信支付的回调,只有 SUCCESS 支付成功、CLOSED 支付失败两种情况,无需像支付宝一样解析的比较复杂
  136 + // V2 微信支付的回调,只有 SUCCESS 支付成功、CLOSED 支付失败两种情况,无需像支付宝一样解析的比较复杂
134 137 Integer status = Objects.equals(response.getResultCode(), "SUCCESS") ?
135 138 PayOrderStatusRespEnum.SUCCESS.getStatus() : PayOrderStatusRespEnum.CLOSED.getStatus();
136 139 return PayOrderRespDTO.of(status, response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()),
... ... @@ -142,9 +145,7 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
142 145 WxPayOrderNotifyV3Result response = client.parseOrderNotifyV3Result(body, null);
143 146 WxPayOrderNotifyV3Result.DecryptNotifyResult result = response.getResult();
144 147 // 2. 构建结果
145   - // 微信支付的回调,只有 SUCCESS 支付成功、CLOSED 支付失败两种情况,无需像支付宝一样解析的比较复杂
146   - Integer status = Objects.equals(result.getTradeState(), "SUCCESS") ?
147   - PayOrderStatusRespEnum.SUCCESS.getStatus() : PayOrderStatusRespEnum.CLOSED.getStatus();
  148 + Integer status = parseStatus(result.getTradeState());
148 149 String openid = result.getPayer() != null ? result.getPayer().getOpenid() : null;
149 150 return PayOrderRespDTO.of(status, result.getTransactionId(), openid, parseDateV3(result.getSuccessTime()),
150 151 result.getOutTradeNo(), body);
... ... @@ -152,7 +153,59 @@ public abstract class AbstractWxPayClient extends AbstractPayClient&lt;WxPayClientC
152 153  
153 154 @Override
154 155 protected PayOrderRespDTO doGetOrder(String outTradeNo) throws Throwable {
155   - return null;
  156 + switch (config.getApiVersion()) {
  157 + case API_VERSION_V2:
  158 + return doGetOrderV2(outTradeNo);
  159 + case WxPayClientConfig.API_VERSION_V3:
  160 + return doGetOrderV3(outTradeNo);
  161 + default:
  162 + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
  163 + }
  164 + }
  165 +
  166 + private PayOrderRespDTO doGetOrderV2(String outTradeNo) throws WxPayException {
  167 + // 构建 WxPayUnifiedOrderRequest 对象
  168 + WxPayOrderQueryRequest request = WxPayOrderQueryRequest.newBuilder()
  169 + .outTradeNo(outTradeNo).build();
  170 + // 执行请求
  171 + WxPayOrderQueryResult response = client.queryOrder(request);
  172 +
  173 + // 转换结果
  174 + Integer status = parseStatus(response.getTradeState());
  175 + return PayOrderRespDTO.of(status, response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()),
  176 + outTradeNo, response);
  177 + }
  178 +
  179 + private PayOrderRespDTO doGetOrderV3(String outTradeNo) throws WxPayException {
  180 + // 构建 WxPayUnifiedOrderRequest 对象
  181 + WxPayOrderQueryV3Request request = new WxPayOrderQueryV3Request()
  182 + .setOutTradeNo(outTradeNo);
  183 + // 执行请求
  184 + WxPayOrderQueryV3Result response = client.queryOrderV3(request);
  185 +
  186 + // 转换结果
  187 + Integer status = parseStatus(response.getTradeState());
  188 + String openid = response.getPayer() != null ? response.getPayer().getOpenid() : null;
  189 + return PayOrderRespDTO.of(status, response.getTransactionId(), openid, parseDateV3(response.getSuccessTime()),
  190 + outTradeNo, response);
  191 + }
  192 +
  193 + private static Integer parseStatus(String tradeState) {
  194 + switch (tradeState) {
  195 + case "NOTPAY":
  196 + case "USERPAYING": // 支付中,等待用户输入密码(条码支付独有)
  197 + return PayOrderStatusRespEnum.WAITING.getStatus();
  198 + case "SUCCESS":
  199 + return PayOrderStatusRespEnum.SUCCESS.getStatus();
  200 + case "REFUND":
  201 + return PayOrderStatusRespEnum.REFUND.getStatus();
  202 + case "CLOSED":
  203 + case "REVOKED": // 已撤销(刷卡支付独有)
  204 + case "PAYERROR": // 支付失败(其它原因,如银行返回失败)
  205 + return PayOrderStatusRespEnum.CLOSED.getStatus();
  206 + default:
  207 + throw new IllegalArgumentException(StrUtil.format("未知的支付状态({})", tradeState));
  208 + }
156 209 }
157 210  
158 211 // ============ 退款相关 ==========
... ...