Commit 04a265a7eed3faf89e1973fdef9f50ed284d8088
1 parent
e7e60463
fix cancel before pay
Showing
4 changed files
with
47 additions
and
3 deletions
cashier-mall/src/main/java/com/diligrp/cashier/mall/domain/rtmall/co/RefundCO.java
| @@ -4,7 +4,6 @@ import com.diligrp.cashier.mall.domain.rtmall.RtMarkBaseCO; | @@ -4,7 +4,6 @@ import com.diligrp.cashier.mall.domain.rtmall.RtMarkBaseCO; | ||
| 4 | import com.fasterxml.jackson.annotation.JsonAlias; | 4 | import com.fasterxml.jackson.annotation.JsonAlias; |
| 5 | import jakarta.validation.Valid; | 5 | import jakarta.validation.Valid; |
| 6 | import jakarta.validation.constraints.NotBlank; | 6 | import jakarta.validation.constraints.NotBlank; |
| 7 | -import jakarta.validation.constraints.NotNull; | ||
| 8 | 7 | ||
| 9 | import java.util.List; | 8 | import java.util.List; |
| 10 | 9 | ||
| @@ -50,6 +49,11 @@ public class RefundCO extends RtMarkBaseCO { | @@ -50,6 +49,11 @@ public class RefundCO extends RtMarkBaseCO { | ||
| 50 | private String companyCode; | 49 | private String companyCode; |
| 51 | 50 | ||
| 52 | /** | 51 | /** |
| 52 | + * 原因 | ||
| 53 | + */ | ||
| 54 | + private String refuseReason; | ||
| 55 | + | ||
| 56 | + /** | ||
| 53 | * 退款商品列表 | 57 | * 退款商品列表 |
| 54 | */ | 58 | */ |
| 55 | @Valid | 59 | @Valid |
| @@ -111,4 +115,12 @@ public class RefundCO extends RtMarkBaseCO { | @@ -111,4 +115,12 @@ public class RefundCO extends RtMarkBaseCO { | ||
| 111 | public void setReturnItemList(List<RefundItemCO> returnItemList) { | 115 | public void setReturnItemList(List<RefundItemCO> returnItemList) { |
| 112 | this.returnItemList = returnItemList; | 116 | this.returnItemList = returnItemList; |
| 113 | } | 117 | } |
| 118 | + | ||
| 119 | + public String getRefuseReason() { | ||
| 120 | + return refuseReason; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + public void setRefuseReason(String refuseReason) { | ||
| 124 | + this.refuseReason = refuseReason; | ||
| 125 | + } | ||
| 114 | } | 126 | } |
cashier-mall/src/main/java/com/diligrp/cashier/mall/model/MallBizPayment.java
| 1 | package com.diligrp.cashier.mall.model; | 1 | package com.diligrp.cashier.mall.model; |
| 2 | 2 | ||
| 3 | import com.diligrp.cashier.mall.context.MallInitializeContext; | 3 | import com.diligrp.cashier.mall.context.MallInitializeContext; |
| 4 | +import com.diligrp.cashier.mall.domain.rtmall.co.RefundCO; | ||
| 4 | import com.diligrp.cashier.mall.domain.rtmall.vo.OrderPaymentVO; | 5 | import com.diligrp.cashier.mall.domain.rtmall.vo.OrderPaymentVO; |
| 5 | import com.diligrp.cashier.mall.property.RtMallDynamicProperty; | 6 | import com.diligrp.cashier.mall.property.RtMallDynamicProperty; |
| 6 | import com.diligrp.cashier.mall.util.MallSnowflakeKeyManager; | 7 | import com.diligrp.cashier.mall.util.MallSnowflakeKeyManager; |
| @@ -379,4 +380,13 @@ public class MallBizPayment extends BaseDO { | @@ -379,4 +380,13 @@ public class MallBizPayment extends BaseDO { | ||
| 379 | this.setChannelId(event.getOutPayType()); | 380 | this.setChannelId(event.getOutPayType()); |
| 380 | MallInitializeContext.getByPayChannel(this.getChannelId()).fill(this, event); | 381 | MallInitializeContext.getByPayChannel(this.getChannelId()).fill(this, event); |
| 381 | } | 382 | } |
| 383 | + | ||
| 384 | + public RefundCO ofRefund() { | ||
| 385 | + RefundCO refundCo = new RefundCO(); | ||
| 386 | + refundCo.setOrderId(orderId); | ||
| 387 | + refundCo.setTradeId(tradeId); | ||
| 388 | + refundCo.setRefundFee(payFee); | ||
| 389 | + refundCo.setRefuseReason("系统自动取消"); | ||
| 390 | + return refundCo; | ||
| 391 | + } | ||
| 382 | } | 392 | } |
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/biz/impl/MallBizRefundServiceImpl.java
| @@ -121,7 +121,7 @@ public class MallBizRefundServiceImpl implements MallBizRefundService { | @@ -121,7 +121,7 @@ public class MallBizRefundServiceImpl implements MallBizRefundService { | ||
| 121 | * doRefund | 121 | * doRefund |
| 122 | */ | 122 | */ |
| 123 | private RefundResultBO doRefund(MallBizRefund refund) { | 123 | private RefundResultBO doRefund(MallBizRefund refund) { |
| 124 | - CashierRefundBO cashierRefundBO = new CashierRefundBO(refund.getPayTradeId(), refund.getRefundFee(), null, "用户主动取消!"); | 124 | + CashierRefundBO cashierRefundBO = new CashierRefundBO(refund.getPayTradeId(), refund.getRefundFee(), null, ObjectUtils.defaultIfNull(refund.getRefuseReason(), "用户主动取消!")); |
| 125 | LOG.info("doRefund cashierRefundBO: {}", JsonUtils.toJsonString(cashierRefundBO)); | 125 | LOG.info("doRefund cashierRefundBO: {}", JsonUtils.toJsonString(cashierRefundBO)); |
| 126 | RefundResultBO refundResultBO = cashierDeskManager.doRefund(cashierRefundBO); | 126 | RefundResultBO refundResultBO = cashierDeskManager.doRefund(cashierRefundBO); |
| 127 | refund.setRefundTradeId(refundResultBO.getRefundId()); | 127 | refund.setRefundTradeId(refundResultBO.getRefundId()); |
cashier-mall/src/main/java/com/diligrp/cashier/mall/service/sourcechannel/AbstractSourceChannel.java
| @@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil; | @@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil; | ||
| 4 | import com.diligrp.cashier.mall.MallConstants; | 4 | import com.diligrp.cashier.mall.MallConstants; |
| 5 | import com.diligrp.cashier.mall.dao.MallBizOrderDao; | 5 | import com.diligrp.cashier.mall.dao.MallBizOrderDao; |
| 6 | import com.diligrp.cashier.mall.domain.rtmall.co.AuthLoginCO; | 6 | import com.diligrp.cashier.mall.domain.rtmall.co.AuthLoginCO; |
| 7 | +import com.diligrp.cashier.mall.domain.rtmall.co.RefundCO; | ||
| 7 | import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO; | 8 | import com.diligrp.cashier.mall.domain.rtmall.vo.UserInfoVO; |
| 8 | import com.diligrp.cashier.mall.domain.tax.TaxMessage; | 9 | import com.diligrp.cashier.mall.domain.tax.TaxMessage; |
| 9 | import com.diligrp.cashier.mall.exception.RtMartMallException; | 10 | import com.diligrp.cashier.mall.exception.RtMartMallException; |
| @@ -32,7 +33,9 @@ import org.springframework.data.redis.core.RedisTemplate; | @@ -32,7 +33,9 @@ import org.springframework.data.redis.core.RedisTemplate; | ||
| 32 | import org.springframework.transaction.annotation.Transactional; | 33 | import org.springframework.transaction.annotation.Transactional; |
| 33 | 34 | ||
| 34 | import java.nio.charset.StandardCharsets; | 35 | import java.nio.charset.StandardCharsets; |
| 35 | -import java.util.*; | 36 | +import java.util.Arrays; |
| 37 | +import java.util.List; | ||
| 38 | +import java.util.Objects; | ||
| 36 | import java.util.concurrent.TimeUnit; | 39 | import java.util.concurrent.TimeUnit; |
| 37 | 40 | ||
| 38 | /** | 41 | /** |
| @@ -99,6 +102,9 @@ public abstract class AbstractSourceChannel { | @@ -99,6 +102,9 @@ public abstract class AbstractSourceChannel { | ||
| 99 | @Transactional(rollbackFor = {Exception.class}) | 102 | @Transactional(rollbackFor = {Exception.class}) |
| 100 | public void paymentOnEvent(PaymentResultBO event, MallBizPayment mallBizPayment) { | 103 | public void paymentOnEvent(PaymentResultBO event, MallBizPayment mallBizPayment) { |
| 101 | LOG.info("paymentOnEvent event: {} mallBizPayment: {}", JsonUtils.toJsonString(event), JsonUtils.toJsonString(mallBizPayment)); | 104 | LOG.info("paymentOnEvent event: {} mallBizPayment: {}", JsonUtils.toJsonString(event), JsonUtils.toJsonString(mallBizPayment)); |
| 105 | + | ||
| 106 | + Integer curPayState = mallBizPayment.getPayState(); | ||
| 107 | + | ||
| 102 | // update mall_biz_payment | 108 | // update mall_biz_payment |
| 103 | mallBizPayment.payCallBack(event); | 109 | mallBizPayment.payCallBack(event); |
| 104 | mallBizPaymentService.updateByPay(mallBizPayment); | 110 | mallBizPaymentService.updateByPay(mallBizPayment); |
| @@ -115,6 +121,9 @@ public abstract class AbstractSourceChannel { | @@ -115,6 +121,9 @@ public abstract class AbstractSourceChannel { | ||
| 115 | .setHeader("x-delay", MallConstants.WAIT_DELAY_MILLIS) | 121 | .setHeader("x-delay", MallConstants.WAIT_DELAY_MILLIS) |
| 116 | .build(); | 122 | .build(); |
| 117 | rabbitTemplate.convertAndSend(MallConstants.TAX_REPORT_DELAY_EXCHANGE, MallConstants.TAX_REPORT_DELAY_KEY, msg); | 123 | rabbitTemplate.convertAndSend(MallConstants.TAX_REPORT_DELAY_EXCHANGE, MallConstants.TAX_REPORT_DELAY_KEY, msg); |
| 124 | + | ||
| 125 | + // check pay success | ||
| 126 | + checkPayHandler(curPayState, mallBizPayment); | ||
| 118 | } | 127 | } |
| 119 | 128 | ||
| 120 | /** | 129 | /** |
| @@ -195,6 +204,19 @@ public abstract class AbstractSourceChannel { | @@ -195,6 +204,19 @@ public abstract class AbstractSourceChannel { | ||
| 195 | } | 204 | } |
| 196 | 205 | ||
| 197 | /** | 206 | /** |
| 207 | + * 如果payState=6表示系统主动取消,如果此时支付响应成功需要撤销该笔交易 | ||
| 208 | + */ | ||
| 209 | + private void checkPayHandler(final Integer curPayState, | ||
| 210 | + MallBizPayment mallBizPayment) { | ||
| 211 | + if (Objects.equals(curPayState, PaymentState.FAILED.getCode()) | ||
| 212 | + && (mallBizPayment = mallBizPaymentService.getByPayTradeId(mallBizPayment.getPayTradeId())) != null | ||
| 213 | + && Objects.equals(mallBizPayment.getPayState(), PaymentState.SUCCESS.getCode())) { | ||
| 214 | + RefundCO refundCo = mallBizPayment.ofRefund(); | ||
| 215 | + mallBizRefundService.refund(refundCo); | ||
| 216 | + } | ||
| 217 | + } | ||
| 218 | + | ||
| 219 | + /** | ||
| 198 | * 渠道 | 220 | * 渠道 |
| 199 | */ | 221 | */ |
| 200 | public abstract Integer source(); | 222 | public abstract Integer source(); |