|
|
@@ -16,6 +16,7 @@ import shop.alien.entity.store.UserReservation;
|
|
|
import shop.alien.entity.store.UserReservationOrder;
|
|
|
import shop.alien.store.service.MerchantPaymentOrderService;
|
|
|
import shop.alien.store.service.RefundRecordAsyncService;
|
|
|
+import shop.alien.store.service.RefundRecordService;
|
|
|
import shop.alien.store.service.StorePaymentConfigService;
|
|
|
import shop.alien.store.service.ReservationOrderPaymentTimeoutService;
|
|
|
import shop.alien.store.service.UserReservationOrderService;
|
|
|
@@ -53,6 +54,10 @@ public class MerchantWechatPaymentStrategyImpl implements MerchantPaymentStrateg
|
|
|
private static final String REDIS_PREPAY_DEBOUNCE_KEY_PREFIX = "merchant:wechat:prepay:debounce:order:";
|
|
|
/** 防抖有效期(秒),期内重复调用返回请勿重复提交 */
|
|
|
private static final long REDIS_PREPAY_DEBOUNCE_SECONDS = 5;
|
|
|
+ /** 支付状态:退款中 */
|
|
|
+ private static final int PAY_STATUS_REFUNDING = 4;
|
|
|
+ /** 退款记录状态:退款失败 */
|
|
|
+ private static final String REFUND_STATUS_FAIL = "FAIL";
|
|
|
|
|
|
@Value("${payment.wechatPay.host:https://api.mch.weixin.qq.com}")
|
|
|
private String wechatPayApiHost;
|
|
|
@@ -71,6 +76,7 @@ public class MerchantWechatPaymentStrategyImpl implements MerchantPaymentStrateg
|
|
|
private final UserReservationOrderService userReservationOrderService;
|
|
|
private final MerchantPaymentOrderService merchantPaymentOrderService;
|
|
|
private final RefundRecordAsyncService refundRecordAsyncService;
|
|
|
+ private final RefundRecordService refundRecordService;
|
|
|
private final ReservationOrderPaymentTimeoutService reservationOrderPaymentTimeoutService;
|
|
|
private final UserReservationService userReservationService;
|
|
|
private final StringRedisTemplate stringRedisTemplate;
|
|
|
@@ -346,6 +352,7 @@ public class MerchantWechatPaymentStrategyImpl implements MerchantPaymentStrateg
|
|
|
Thread.sleep(delayMs);
|
|
|
} catch (InterruptedException ie) {
|
|
|
Thread.currentThread().interrupt();
|
|
|
+ markRefundFailed(order, paymentOrder, "操作过于频繁,请稍后再试", refundReason, storeId, outTradeNo);
|
|
|
return R.fail("操作过于频繁,请稍后再试");
|
|
|
}
|
|
|
} else {
|
|
|
@@ -360,11 +367,14 @@ public class MerchantWechatPaymentStrategyImpl implements MerchantPaymentStrateg
|
|
|
String msg = lastApiException != null && lastApiException.getStatusCode() == 429
|
|
|
? (StringUtils.isNotBlank(lastApiException.getErrorMessage()) ? lastApiException.getErrorMessage() : "操作过于频繁,请稍后再试")
|
|
|
: "退款失败";
|
|
|
+ markRefundFailed(order, paymentOrder, msg, refundReason, storeId, outTradeNo);
|
|
|
return R.fail(msg);
|
|
|
}
|
|
|
String status = response.status != null ? response.status.name() : "";
|
|
|
if (!"SUCCESS".equals(status) && !"PROCESSING".equals(status)) {
|
|
|
- return R.fail("退款失败:" + status);
|
|
|
+ String failMsg = "退款失败:" + status;
|
|
|
+ markRefundFailed(order, paymentOrder, failMsg, refundReason, storeId, outTradeNo);
|
|
|
+ return R.fail(failMsg);
|
|
|
}
|
|
|
|
|
|
Date now = new Date();
|
|
|
@@ -403,16 +413,53 @@ public class MerchantWechatPaymentStrategyImpl implements MerchantPaymentStrateg
|
|
|
return R.data("退款成功");
|
|
|
} catch (WXPayUtility.ApiException e) {
|
|
|
log.error("商户预订订单微信退款异常,outTradeNo={}", outTradeNo, e);
|
|
|
- if (e.getStatusCode() == 429) {
|
|
|
- return R.fail(StringUtils.isNotBlank(e.getErrorMessage()) ? e.getErrorMessage() : "操作过于频繁,请稍后再试");
|
|
|
+ String errMsg = e.getStatusCode() == 429
|
|
|
+ ? (StringUtils.isNotBlank(e.getErrorMessage()) ? e.getErrorMessage() : "操作过于频繁,请稍后再试")
|
|
|
+ : "退款失败:" + e.getMessage();
|
|
|
+ MerchantPaymentOrder payOrder = merchantPaymentOrderService.getByOutTradeNo(outTradeNo);
|
|
|
+ UserReservationOrder resOrder = payOrder != null ? userReservationOrderService.getById(payOrder.getOrderId()) : null;
|
|
|
+ if (resOrder != null && payOrder != null) {
|
|
|
+ markRefundFailed(resOrder, payOrder, errMsg, refundReason, storeId, outTradeNo);
|
|
|
}
|
|
|
- return R.fail("退款失败:" + e.getMessage());
|
|
|
+ return R.fail(errMsg);
|
|
|
} catch (Exception e) {
|
|
|
log.error("商户微信退款异常,storeId={}", storeId, e);
|
|
|
+ MerchantPaymentOrder payOrder = merchantPaymentOrderService.getByOutTradeNo(outTradeNo);
|
|
|
+ UserReservationOrder resOrder = payOrder != null ? userReservationOrderService.getById(payOrder.getOrderId()) : null;
|
|
|
+ if (resOrder != null && payOrder != null) {
|
|
|
+ markRefundFailed(resOrder, payOrder, "退款失败:" + e.getMessage(), refundReason, storeId, outTradeNo);
|
|
|
+ }
|
|
|
return R.fail("退款失败:" + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /** 退款失败时:订单与支付单置为退款中,并写入退款失败记录 */
|
|
|
+ private void markRefundFailed(UserReservationOrder order, MerchantPaymentOrder paymentOrder,
|
|
|
+ String errorMsg, String refundReason, Integer storeId, String outTradeNo) {
|
|
|
+ try {
|
|
|
+ Date now = new Date();
|
|
|
+ order.setPaymentStatus(PAY_STATUS_REFUNDING);
|
|
|
+ order.setUpdatedTime(now);
|
|
|
+ userReservationOrderService.updateById(order);
|
|
|
+ paymentOrder.setPayStatus(PAY_STATUS_REFUNDING);
|
|
|
+ paymentOrder.setUpdatedTime(now);
|
|
|
+ merchantPaymentOrderService.updateById(paymentOrder);
|
|
|
+ RefundRecord record = new RefundRecord();
|
|
|
+ record.setOutTradeNo(outTradeNo);
|
|
|
+ record.setPayType(PaymentEnum.WECHAT_PAY.getType());
|
|
|
+ record.setRefundStatus(REFUND_STATUS_FAIL);
|
|
|
+ record.setOrderId(String.valueOf(order.getId()));
|
|
|
+ record.setStoreId(storeId);
|
|
|
+ record.setUserId(order.getUserId());
|
|
|
+ record.setRefundReason(StringUtils.isNotBlank(refundReason) ? refundReason : "退款失败");
|
|
|
+ record.setErrorMsg(errorMsg != null ? errorMsg : "退款失败");
|
|
|
+ record.setDeleteFlag(0);
|
|
|
+ refundRecordService.save(record);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("标记退款失败状态异常,outTradeNo={}", outTradeNo, ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public String getType() {
|
|
|
return PaymentEnum.WECHAT_PAY.getType();
|