优化订单退款逻辑

This commit is contained in:
2023-08-11 14:20:00 +08:00
parent cd1d2f6747
commit 0382fe1edd
3 changed files with 94 additions and 17 deletions

View File

@@ -16,6 +16,7 @@ import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.adapay.common.DivMember;
import com.jsowell.adapay.response.BalancePaymentResponse;
import com.jsowell.adapay.response.PaymentConfirmResponse;
import com.jsowell.adapay.response.PaymentReverseResponse;
import com.jsowell.adapay.service.AdapayMemberService;
import com.jsowell.adapay.vo.OrderSettleResult;
import com.jsowell.common.constant.CacheConstants;
@@ -825,7 +826,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
* @param residue 需退款金额
*/
private void refundOrder(OrderBasicInfo orderBasicInfo, BigDecimal residue) {
// 订单编号
String orderCode = orderBasicInfo.getOrderCode();
// 订单消费金额
BigDecimal orderAmount = orderBasicInfo.getOrderAmount();
// 查支付记录
List<OrderPayRecord> payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
@@ -2314,15 +2317,16 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
public void refundOrderWithAdapay(ApplyRefundDTO dto) {
logger.info("汇付支付订单:{}, 执行退款逻辑 param:{}", dto.getOrderCode(), JSON.toJSONString(dto));
// 查出来原来的支付信息
AdapayCallbackRecord record = adapayCallbackRecordService.selectByOrderCode(dto.getOrderCode());
if (Objects.isNull(record)) {
AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByOrderCode(dto.getOrderCode());
if (Objects.isNull(callbackRecord)) {
logger.error("汇付支付orderCode:{}, 订单退款处理逻辑, 查询订单微信支付记录为空!", dto.getOrderCode());
throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_CALLBACK_RECORD_ERROR);
}
// 判断支付金额和退款金额
String paymentId = callbackRecord.getPaymentId();
BigDecimal refundAmount = dto.getRefundAmount();
BigDecimal payAmt = record.getPayAmt();
BigDecimal payAmt = callbackRecord.getPayAmt();
if (refundAmount.compareTo(payAmt) > 0) {
logger.error("汇付支付订单号:{}, 退款金额:{}(元),大于可退金额{}(元), 抛出异常", dto.getOrderCode(), refundAmount, payAmt);
throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_AMOUNT_ERROR);
@@ -2334,10 +2338,27 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
String payMode = "delay";
if (StringUtils.equals("", payMode)) {
// 延迟分账确认的调退款接口
adapayMemberService.createRefundRequest(record.getPaymentId(), dto.getRefundAmount());
adapayMemberService.createRefundRequest(paymentId, refundAmount);
} else {
// 延迟分账未确认调撤销调撤销接口退款
adapayMemberService.createPaymentReverseRequest(record.getPaymentId(), dto.getRefundAmount());
PaymentReverseResponse response = adapayMemberService.createPaymentReverseRequest(paymentId, refundAmount);
if (response != null) {
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
BigDecimal reverseAmt = new BigDecimal(response.getReverse_amt());
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额
BigDecimal spendAmt = callbackRecord.getPayAmt().subtract(reverseAmt);
record.setSpendAmt(spendAmt);
// 退款金额
record.setRefundAmt(reverseAmt);
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
if (BigDecimal.ZERO.compareTo(record.getBalanceAmt()) != 0) {
logger.error("订单分账结束后账不平paymentId:{}, orderCode:{}, 支付金额:{}, 消费金额:{}, 退款金额:{}",
paymentId, dto.getOrderCode(), payAmt, spendAmt, reverseAmt);
}
memberAdapayRecordService.updateByPrimaryKeySelective(record);
}
}
}