diff --git a/src/main/java/com/peanut/modules/pay/alipay/controller/AliPayController.java b/src/main/java/com/peanut/modules/pay/alipay/controller/AliPayController.java index 715db31..98e718e 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/controller/AliPayController.java +++ b/src/main/java/com/peanut/modules/pay/alipay/controller/AliPayController.java @@ -1,7 +1,17 @@ package com.peanut.modules.pay.alipay.controller; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.peanut.common.utils.R; +import com.peanut.config.Constants; +import com.peanut.modules.book.service.BuyOrderService; +import com.peanut.modules.book.service.MyUserService; +import com.peanut.modules.common.entity.BuyOrder; +import com.peanut.modules.common.entity.BuyOrderRefund; +import com.peanut.modules.common.entity.BuyOrderRefundLog; +import com.peanut.modules.common.entity.MyUserEntity; +import com.peanut.modules.common.service.BuyOrderRefundLogService; +import com.peanut.modules.common.service.BuyOrderRefundService; import com.peanut.modules.pay.alipay.dto.AlipayDTO; import com.peanut.modules.pay.alipay.dto.ReFundDTO; import com.peanut.modules.pay.alipay.service.AliPayService; @@ -11,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; + +import java.math.BigDecimal; import java.util.Map; @@ -24,6 +36,14 @@ public class AliPayController { @Autowired private AliPayService aliPayService; + @Autowired + private BuyOrderService buyOrderService; + @Autowired + private MyUserService myUserService; + @Autowired + private BuyOrderRefundService buyOrderRefundService; + @Autowired + private BuyOrderRefundLogService buyOrderRefundLogService; /** * 请求支付宝接口支付 @@ -50,6 +70,65 @@ public class AliPayController { */ @RequestMapping("/refund") public R refund(@RequestBody Map params) { + Object orderIdObject = params.get("orderId"); + if(orderIdObject == null || orderIdObject.toString().trim().equals("")){ + return R.error("orderId不能为空"); + } + int orderId = Integer.parseInt(orderIdObject.toString()); + QueryWrapper queryWapper = new QueryWrapper<>(); + queryWapper.eq("order_id",orderId); + BuyOrder buyOrder = buyOrderService.getOne(queryWapper); + if(buyOrder==null){ + return R.error("订单不存在"); + } + MyUserEntity user = myUserService.getById(buyOrder.getUserId()); + if (user == null) { + return R.error("订单对应用户不存在"); + } + + if(Constants.ORDER_STATUS_REFUND.equals(buyOrder.getOrderStatus()) + || Constants.ORDER_STATUS_REFUNDING.equals(buyOrder.getOrderStatus())){ + return R.error("请勿重复提交退款"); + }else if (Constants.ORDER_STATUS_TO_BE_PAID.equals(buyOrder.getOrderStatus()) + || Constants.ORDER_STATUS_FAIL.equals(buyOrder.getOrderStatus()) + || Constants.ORDER_STATUS_OUT_OF_TIME.equals(buyOrder.getOrderStatus())) { + return R.error("当前订单状态不支持退单"); + } + + buyOrder.setOrderStatus(Constants.ORDER_STATUS_REFUNDING); + buyOrderService.updateById(buyOrder); + + BigDecimal refundFee = buyOrder.getRealMoney(); + BigDecimal shippingMoney = buyOrder.getShippingMoney()==null?BigDecimal.ZERO:buyOrder.getShippingMoney(); + int deductShipping = params.containsKey("deductShipping") && params.get("deductShipping")!=null?Integer.parseInt(params.get("deductShipping").toString()):0; + if(refundFee.compareTo(BigDecimal.ZERO)>0 && shippingMoney.compareTo(BigDecimal.ZERO)>0 && deductShipping==1){ + refundFee = refundFee.subtract(shippingMoney); + refundFee = refundFee.compareTo(BigDecimal.ZERO)>0?refundFee:BigDecimal.ZERO; + } + String remark = params.containsKey("remark") && params.get("remark").toString()!=null?params.get("remark").toString():""; + + BuyOrderRefund buyOrderRefund = new BuyOrderRefund(); + String refundNo = buyOrderRefundService.genRefundNo(); + buyOrderRefund.setRefundNo(refundNo); + buyOrderRefund.setOrderId(buyOrder.getOrderId()); + buyOrderRefund.setOrderSn(buyOrder.getOrderSn()); + buyOrderRefund.setUserId(buyOrder.getUserId()); + buyOrderRefund.setType(params.containsKey("deductShipping")?"后台":"线上"); //id + buyOrderRefund.setPayType(buyOrder.getPaymentMethod()); + buyOrderRefund.setFee(refundFee); + buyOrderRefund.setJfDeduction(buyOrder.getJfDeduction()); + buyOrderRefund.setShippingMoney(deductShipping==1?buyOrder.getShippingMoney():BigDecimal.ZERO); + buyOrderRefund.setDeductShipping(deductShipping); + buyOrderRefund.setRemark(remark); + buyOrderRefundService.save(buyOrderRefund); + + buyOrderRefundLogService.insertRefundLog(buyOrderRefund.getId(),0,1); + + int refundId = buyOrderRefund.getId(); + buyOrderRefundLogService.insertRefundLog(refundId,1,0); + + + String refund = aliPayService.refund(params); return R.ok().put("msg",refund); } diff --git a/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java b/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java index 39d443d..f3dba00 100644 --- a/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/peanut/modules/pay/alipay/service/impl/AliPayServiceImpl.java @@ -159,6 +159,17 @@ public class AliPayServiceImpl implements AliPayService { // log.error(">>>>>>>>>>验签结果 flag = {}", flag); if (flag) { log.info(">>>>>>>>>>验签通过"); + String refundStatus = params.get("refund_status"); + if(refundStatus!=null){ + String outTradeNo = params.get("out_trade_no"); + if ("REFUND_SUCCESS".equals(refundStatus)) { + String outBizNo = params.get("out_biz_no"); // 退款单号 + String refundAmount = params.get("refund_amount");// 退款金额 + // 业务:更新退款流水、订单退款状态、幂等判断 + log.info("退款回调:订单=" + outTradeNo + ",退款单号=" + outBizNo); + } + } + //验签通过 获取交易状态 String tradeStatus = params.get("trade_status"); //只处理支付成功的订单: 修改交易表状态,支付成功 @@ -336,6 +347,7 @@ public class AliPayServiceImpl implements AliPayService { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); wrapper.eq(PayZfbOrderEntity::getRelevanceoid,params.get("orderSn").toString()); PayZfbOrderEntity payZfbOrder = payZfbOrderService.getOne(wrapper); + ReFundDTO reFundDTO = new ReFundDTO(); reFundDTO.setOutTrandeNo(payZfbOrder.getOutTradeNo()); reFundDTO.setTradeNo(payZfbOrder.getTradeNo()); @@ -344,6 +356,7 @@ public class AliPayServiceImpl implements AliPayService { reFundDTO.setRefundAmount(new BigDecimal(params.get("refundFee").toString())); // reFundDTO.setOutRequestNo(params.get("outRequestNo").toString()); reFundDTO.setOutRequestNo(UUID.randomUUID().toString()); + BuyOrder buyOrder = buyOrderService.getOne(new LambdaQueryWrapper() .eq(BuyOrder::getOrderSn,params.get("orderSn"))); String mchName = "";