From a4edccc7deec5decd1d9e1944bc4fd3c6f05521c Mon Sep 17 00:00:00 2001 From: wyn <1074145239@qq.com> Date: Thu, 30 Apr 2026 09:54:18 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=80=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/peanut/config/Constants.java | 4 + .../book/controller/BuyOrderController.java | 120 +++++++------ .../modules/book/service/BuyOrderService.java | 2 - .../service/impl/BuyOrderServiceImpl.java | 47 +---- .../modules/common/entity/BuyOrderRefund.java | 1 + .../common/entity/BuyOrderRefundLog.java | 2 +- .../service/BuyOrderRefundLogService.java | 1 + .../common/service/BuyOrderRefundService.java | 2 + .../impl/BuyOrderRefundLogServiceImpl.java | 9 + .../impl/BuyOrderRefundServiceImpl.java | 8 + .../service/impl/BuyOrderServiceImpl.java | 8 +- .../controller/WeChatPayController.java | 3 + .../pay/weChatPay/dto/WeChatRefundInfo.java | 21 +++ .../pay/weChatPay/service/WxpayService.java | 3 + .../service/impl/WxpayServiceImpl.java | 164 +++++++++++++++--- 15 files changed, 278 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/peanut/modules/pay/weChatPay/dto/WeChatRefundInfo.java diff --git a/src/main/java/com/peanut/config/Constants.java b/src/main/java/com/peanut/config/Constants.java index 7889ff4..643b77b 100644 --- a/src/main/java/com/peanut/config/Constants.java +++ b/src/main/java/com/peanut/config/Constants.java @@ -30,6 +30,10 @@ public class Constants { * 订单状态 - 退款 */ public static final String ORDER_STATUS_REFUND = "6"; + /** + * 订单状态 - 退款中 + */ + public static final String ORDER_STATUS_REFUNDING = "7"; /** * 订单状态 - 全部 diff --git a/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java b/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java index 82d49a9..32f2194 100644 --- a/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java +++ b/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java @@ -35,6 +35,7 @@ import com.peanut.modules.common.entity.*; import com.peanut.modules.common.service.*; import com.peanut.modules.master.service.CourseCatalogueService; import com.peanut.modules.pay.alipay.service.AliPayService; +import com.peanut.modules.pay.weChatPay.dto.WeChatRefundInfo; import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo; import com.peanut.modules.pay.weChatPay.service.WxpayService; import com.peanut.modules.sys.entity.SysConfigEntity; @@ -603,24 +604,28 @@ public class BuyOrderController { return R.error("退款信息不存在"); } QueryWrapper wapper2 = new QueryWrapper<>(); - wapper2.eq("refund_id",refundInfo.getId()).orderByDesc("create_time"); + wapper2.eq("refund_id",refundInfo.getId()).orderByDesc("id"); List list = buyOrderRefundLogService.list(wapper2); for (BuyOrderRefundLog log : list){ - if(log.getType()==1){ + if(log.getType()==4){ log.setTitle("天医币已退还"); log.setContent("天医币已退还到账户,可在我的->天医币中查看明细"); - }else if(log.getType()==2){ + }else if(log.getType()==5){ log.setTitle("积分已退还"); log.setContent("积分已退还到账户,可在我的->积分中查看明细"); - }else if(log.getType()==3){ + }else if(log.getType()==2){ log.setTitle(log.getStatus()==1?"到账成功":"已退款,支付宝处理中"); log.setContent(log.getStatus()==1?"已退到您的支付宝,到账时间以支付宝处理时间为准,可前往「支付宝-账单」查看":"已将退款资金提交给支付宝处理,通常情况下,退款会原路退回您的支付账户,预计会在1-7天内到账"); - }else if(log.getType()==4){ + }else if(log.getType()==1){ log.setTitle(log.getStatus()==1?"到账成功":"已退款,微信处理中"); log.setContent(log.getStatus()==1?"已退到您的微信,到账时间以微信处理时间为准,可前往「微信-账单」查看":"已将退款资金提交给微信处理,通常情况下,退款会原路退回您的支付账户,预计会在1-7天内到账"); + }else if(log.getType()==0){ + log.setTitle(log.getStatus()==3?"重新申请退款":"发起退款"); + log.setContent("系统会在1-2天内提交处理"); } + } - BuyOrderRefundLog log = new BuyOrderRefundLog(); + /* BuyOrderRefundLog log = new BuyOrderRefundLog(); log.setId(0); log.setRefundId(refundInfo.getId()); log.setType(0); @@ -628,7 +633,7 @@ public class BuyOrderController { log.setCreateTime(refundInfo.getCreateTime()); log.setTitle("发起退款"); log.setContent("系统会在1-2天内提交处理"); - list.add(log); + list.add(log);*/ Map result = new HashMap<>(); BigDecimal shippingMoney = refundInfo.getDeductShipping()==1?refundInfo.getShippingMoney():BigDecimal.ZERO; @@ -658,19 +663,19 @@ public class BuyOrderController { if (user == null) { return R.error("订单对应用户不存在"); } - - BuyOrderRefund buyOrderRefund = buyOrderRefundService.getOne(new QueryWrapper().eq("order_id",buyOrder.getOrderId())); - if(buyOrderRefund!=null){ - return R.error("请勿重复申请退款"); - }else{ - buyOrderRefund = new BuyOrderRefund(); - } - if (Constants.ORDER_STATUS_TO_BE_PAID.equals(buyOrder.getOrderStatus()) + 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_REFUND.equals(buyOrder.getOrderStatus()) || Constants.ORDER_STATUS_OUT_OF_TIME.equals(buyOrder.getOrderStatus())) { return R.error("当前订单状态不支持退单"); } + if(Constants.PAYMENT_METHOD_ALI_PAY.equals(buyOrder.getPaymentMethod())){ + return R.error("当前订单支付方式暂不支持退单"); + } + //设置状态为已退款 + buyOrder.setOrderStatus(Constants.ORDER_STATUS_REFUNDING); BigDecimal refundFee = buyOrder.getRealMoney(); BigDecimal shippingMoney = buyOrder.getShippingMoney()==null?BigDecimal.ZERO:buyOrder.getShippingMoney(); @@ -681,12 +686,13 @@ public class BuyOrderController { } 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("线上"); //id + buyOrderRefund.setType(params.containsKey("deductShipping")?"后台":"线上"); //id buyOrderRefund.setPayType(buyOrder.getPaymentMethod()); buyOrderRefund.setFee(refundFee); buyOrderRefund.setJfDeduction(buyOrder.getJfDeduction()); @@ -695,54 +701,68 @@ public class BuyOrderController { buyOrderRefund.setRemark(remark); buyOrderRefundService.save(buyOrderRefund); - int refundId = buyOrderRefund.getId(); + buyOrderRefundLogService.insertRefundLog(buyOrderRefund.getId(),0,1); + int refundId = buyOrderRefund.getId(); if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) { if(refundFee.compareTo(BigDecimal.ZERO)>0){ + //退还虚拟币 transactionDetailsService.refundRecord(buyOrder,user,refundFee); user.setPeanutCoin(user.getPeanutCoin().add(refundFee)); myUserService.updateById(user); - buyOrderRefundLogService.insertRefundLog(refundId,1,1); + //记录退款进度 + buyOrderRefundLogService.insertRefundLog(refundId,4,1); + //积分、其他权益退回 buyOrderService.refundOrder(buyOrder,user,refundId); - //更改订单状态为已付款 + //更改订单状态为已退款 buyOrder.setOrderStatus(Constants.ORDER_STATUS_REFUND); buyOrderService.updateById(buyOrder); - + return R.ok("ok"); } } else if (Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())) { - buyOrderRefundLogService.insertRefundLog(refundId,4,0); + buyOrderRefundLogService.insertRefundLog(refundId,1,0); if (refundFee.compareTo(BigDecimal.ZERO) > 0) { - Map refundParams = new HashMap<>(); - refundParams.put("orderSn", buyOrder.getOrderSn()); - refundParams.put("refundFee", refundFee); - refundParams.put("reason", StringUtils.isBlank(remark) ? "后台申请退款" : remark); - String refundResult = wxpayService.refund(refundParams); - JSONObject resultJson = JSONObject.parseObject(refundResult); - if (!"SUCCESS".equals(resultJson.getString("status"))) { - return R.error("微信退款申请失败"); - }else{ - buyOrderRefundLogService.insertRefundLog(refundId,4,2); - } - - } - } else if (Constants.PAYMENT_METHOD_ALI_PAY.equals(buyOrder.getPaymentMethod())) { - buyOrderRefundLogService.insertRefundLog(refundId,3,0); - if (refundFee.compareTo(BigDecimal.ZERO) > 0) { - Map refundParams = new HashMap<>(); - refundParams.put("orderSn", buyOrder.getOrderSn()); - refundParams.put("refundFee", refundFee); - String refundResult = aliPayService.refund(refundParams); - JSONObject resultJson = JSONObject.parseObject(refundResult); - JSONObject responseJson = resultJson.getJSONObject("alipay_trade_refund_response"); - if (responseJson == null - || !"10000".equals(responseJson.getString("code")) - || !"Y".equals(responseJson.getString("fund_change"))) { - return R.error("支付宝退款申请失败"); - }else{ - buyOrderRefundLogService.insertRefundLog(refundId,3,2); + WeChatRefundInfo weChatRefundInfo = new WeChatRefundInfo(); + weChatRefundInfo.setOrderSn(buyOrder.getOrderSn()); + weChatRefundInfo.setOrderId(buyOrder.getOrderId()); + weChatRefundInfo.setOrderType(buyOrder.getOrderType()); + weChatRefundInfo.setRefundNo(buyOrderRefund.getRefundNo()); + weChatRefundInfo.setTotalAmount(buyOrder.getRealMoney()); + weChatRefundInfo.setRefundAmount(buyOrderRefund.getFee()); + weChatRefundInfo.setRemark("用户申请退款"); + weChatRefundInfo.setRefundId(buyOrderRefund.getId()); + if(buyOrder.getCome()==null||buyOrder.getCome()==0){ + weChatRefundInfo.setAppName(buyOrder.getAppName()); + } else if (buyOrder.getCome()==2){ + weChatRefundInfo.setAppName("wumen"); + } else if (buyOrder.getCome()==1) { + weChatRefundInfo.setAppName("zmzm"); + } else if (buyOrder.getCome()==3) { + weChatRefundInfo.setAppName("xlkj"); + } else if (buyOrder.getCome()==4) { + weChatRefundInfo.setAppName("thyy"); } + wxpayService.refund(weChatRefundInfo); } } +// else if (Constants.PAYMENT_METHOD_ALI_PAY.equals(buyOrder.getPaymentMethod())) { +// buyOrderRefundLogService.insertRefundLog(refundId,2,0); +// if (refundFee.compareTo(BigDecimal.ZERO) > 0) { +// Map refundParams = new HashMap<>(); +// refundParams.put("orderSn", buyOrder.getOrderSn()); +// refundParams.put("refundFee", refundFee); +// String refundResult = aliPayService.refund(refundParams); +// JSONObject resultJson = JSONObject.parseObject(refundResult); +// JSONObject responseJson = resultJson.getJSONObject("alipay_trade_refund_response"); +// if (responseJson == null +// || !"10000".equals(responseJson.getString("code")) +// || !"Y".equals(responseJson.getString("fund_change"))) { +// return R.error("支付宝退款申请失败"); +// }else{ +// buyOrderRefundLogService.insertRefundLog(refundId,3,2); +// } +// } +// } return R.ok("ok"); } diff --git a/src/main/java/com/peanut/modules/book/service/BuyOrderService.java b/src/main/java/com/peanut/modules/book/service/BuyOrderService.java index 9beb786..c9a9a65 100644 --- a/src/main/java/com/peanut/modules/book/service/BuyOrderService.java +++ b/src/main/java/com/peanut/modules/book/service/BuyOrderService.java @@ -74,6 +74,4 @@ public interface BuyOrderService extends IService { BigDecimal getRefundFee(Map params, BuyOrder buyOrder); void refundOrder(BuyOrder buyOrder, MyUserEntity user, int refundId); - - void refundOrder(BuyOrder buyOrder); } \ No newline at end of file diff --git a/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java b/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java index 4dc752e..586ef46 100644 --- a/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java +++ b/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java @@ -220,6 +220,8 @@ public class BuyOrderServiceImpl extends ServiceImpl impl } else if (type.equals("2")) { orderEntity.setPaymentDate(new Date()); orderEntity.setOrderStatus("3"); + }else if (type.equals("6")) { + orderEntity.setOrderStatus("6"); } updateById(orderEntity); } @@ -475,12 +477,10 @@ public class BuyOrderServiceImpl extends ServiceImpl impl } } if(b.getOrderStatus().equals(Constants.ORDER_STATUS_REFUND)){ - QueryWrapper wrapperRefund = new QueryWrapper<>(); - wrapperRefund.eq("order_id",b.getOrderId()); - BuyOrderRefund refundInfo = buyOrderRefundService.getOne(wrapperRefund); + BuyOrderRefund refundInfo = buyOrderRefundService.getRefundInfoByOrderId(b.getOrderId()); b.setRefundRemark(refundInfo.getRemark()); } - b.setRefundableStatus(b.getOrderStatus().equals("6")?false:refundableStatus); + b.setRefundableStatus(b.getOrderStatus().equals("6")|| b.getOrderStatus().equals("7")||Constants.PAYMENT_METHOD_ALI_PAY.equals(b.getPaymentMethod())?false:refundableStatus); b.setProductList(buyOrderProducts); //设置快递信息传递给前端 ConsigneeVo consigneeVo = new ConsigneeVo(); @@ -536,7 +536,7 @@ public class BuyOrderServiceImpl extends ServiceImpl impl wrapper.eq(BuyOrder::getUserId,userOrderDto.getUserId()); // wrapper.eq(BuyOrder::getOrderType,"order");//这里有点问题 if(userOrderDto.getOrderStatus()==null){ - Integer[] sts = {0,1,2,3,6}; + Integer[] sts = {0,1,2,3,6,7}; wrapper.in(BuyOrder::getOrderStatus,sts); }else{ wrapper.eq(BuyOrder::getOrderStatus,userOrderDto.getOrderStatus()); @@ -585,7 +585,7 @@ public class BuyOrderServiceImpl extends ServiceImpl impl } } } - b.setRefundableStatus(b.getOrderStatus().equals("6")?false:refundableStatus); + b.setRefundableStatus(b.getOrderStatus().equals("6") || b.getOrderStatus().equals("7") || Constants.PAYMENT_METHOD_ALI_PAY.equals(b.getPaymentMethod())?false:refundableStatus); b.setProductList(buyOrderProducts); b.setTimestamp(b.getCreateTime().getTime()/1000); //充值订单填充充值商品信息 @@ -1089,40 +1089,5 @@ public class BuyOrderServiceImpl extends ServiceImpl impl //回滚库存 shopProductService.rollbackStock(buyOrder); } - - } - @Override - public void refundOrder(BuyOrder buyOrder){ - if(buyOrder.getCouponId()!=null && buyOrder.getCouponId()!=0){ - couponService.rollbackCoupon(buyOrder.getCouponId()); - } - QueryWrapper productQueryWrapper = new QueryWrapper<>(); - productQueryWrapper.eq("order_id",buyOrder.getOrderId()); - List orderProducts = buyOrderProductService.list(productQueryWrapper); - - //积分恢复 - BigDecimal jf = buyOrder.getJfDeduction()==null?BigDecimal.ZERO : buyOrder.getJfDeduction(); - MyUserEntity user = myUserService.getById(buyOrder.getUserId()); - if(jf.compareTo(BigDecimal.ZERO)>0){ - jfTransactionDetailsService.refundJfTransaction(buyOrder,user); - user.setJf(jf.add(user.getJf())); - myUserService.updateById(user); - buyOrderRefundLogService.insertRefundLog(refundId,2,1); - } - if(buyOrder.getOrderType().equals("vip")){ - userVipService.refundVip(buyOrder); - }else{ - //撤回本订单购买赠送的优惠券 - couponService.refundZSCouponHistoryByOrder(buyOrder); - /*//恢复用户权益(点穴/时辰取穴/五运六气/肿瘤古方) - myUserService.rollbackUserPowers(buyOrder, orderProducts);*/ - //撤回电子书权限 - userEbookBuyService.rollbackUserEbooks(buyOrder, orderProducts); - //撤回课程权限 - removeCourseToUser(buyOrder); - //回滚库存 - shopProductService.rollbackStock(buyOrder); - } - } } \ No newline at end of file diff --git a/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java b/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java index 365f3ec..1df6ac8 100644 --- a/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java +++ b/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java @@ -32,4 +32,5 @@ public class BuyOrderRefund implements Serializable { private int status; private String remark; private Date createTime; + private String wxRefundNo; } diff --git a/src/main/java/com/peanut/modules/common/entity/BuyOrderRefundLog.java b/src/main/java/com/peanut/modules/common/entity/BuyOrderRefundLog.java index 19d8fce..283435c 100644 --- a/src/main/java/com/peanut/modules/common/entity/BuyOrderRefundLog.java +++ b/src/main/java/com/peanut/modules/common/entity/BuyOrderRefundLog.java @@ -27,7 +27,7 @@ public class BuyOrderRefundLog implements Serializable { private Date createTime; private int type; private int status; - + private int reason; @TableField(exist = false) private String title; diff --git a/src/main/java/com/peanut/modules/common/service/BuyOrderRefundLogService.java b/src/main/java/com/peanut/modules/common/service/BuyOrderRefundLogService.java index 516a4b5..7da6aa5 100644 --- a/src/main/java/com/peanut/modules/common/service/BuyOrderRefundLogService.java +++ b/src/main/java/com/peanut/modules/common/service/BuyOrderRefundLogService.java @@ -6,4 +6,5 @@ import com.peanut.modules.common.entity.BuyOrderRefundLog; public interface BuyOrderRefundLogService extends IService { void insertRefundLog(int buyOrderRefundId, int type, int status); + void insertRefundLog(int buyOrderRefundId, int type, int status, String reason); } diff --git a/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java b/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java index d560b2f..a252f8e 100644 --- a/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java +++ b/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java @@ -9,4 +9,6 @@ import java.math.BigDecimal; public interface BuyOrderRefundService extends IService { int insertBuyOrderRefund(BuyOrder buyOrder, BigDecimal refundFee, int deductShipping,String remark); String genRefundNo(); + + BuyOrderRefund getRefundInfoByOrderId(int orderId); } diff --git a/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundLogServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundLogServiceImpl.java index 7cb6e0f..a768623 100644 --- a/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundLogServiceImpl.java +++ b/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundLogServiceImpl.java @@ -2,6 +2,7 @@ package com.peanut.modules.common.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.peanut.modules.common.dao.BuyOrderRefundLogDao; +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.service.BuyOrderRefundLogService; @@ -19,4 +20,12 @@ public class BuyOrderRefundLogServiceImpl extends ServiceImpl wrapperRefund = new QueryWrapper<>(); + wrapperRefund.eq("order_id",orderId).last("LIMIT 1"); + BuyOrderRefund refundInfo = this.getOne(wrapperRefund); + return refundInfo; + } } diff --git a/src/main/java/com/peanut/modules/common/service/impl/BuyOrderServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/BuyOrderServiceImpl.java index 23f1e5c..d33cdc7 100644 --- a/src/main/java/com/peanut/modules/common/service/impl/BuyOrderServiceImpl.java +++ b/src/main/java/com/peanut/modules/common/service/impl/BuyOrderServiceImpl.java @@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.ExpressOrderUtil; import com.peanut.common.utils.Query; +import com.peanut.config.Constants; import com.peanut.modules.common.dao.*; import com.peanut.modules.common.entity.*; +import com.peanut.modules.common.service.BuyOrderRefundService; import com.peanut.modules.common.service.BuyOrderService; import com.peanut.modules.common.to.PrepareOrderDto; import com.peanut.modules.common.vo.UserBaseVo; @@ -44,6 +46,8 @@ public class BuyOrderServiceImpl extends ServiceImpl impl private AiBuyConfigDao aiBuyConfigDao; @Autowired private ShopProductCourseDao shopProductCourseDao; + @Autowired + private BuyOrderRefundService buyOrderRefundService; @Override public Map initPrepareOrder(PrepareOrderDto prepareOrderDto) { @@ -75,7 +79,7 @@ public class BuyOrderServiceImpl extends ServiceImpl impl wrapper.eq(BuyOrder::getUserId,params.get("userId")); wrapper.eq(BuyOrder::getCome,params.get("come")); if(StringUtils.isEmpty(params.get("orderStatus").toString())){ - Integer[] sts = {0,1,2,3,6}; + Integer[] sts = {0,1,2,3,6,7}; wrapper.in(BuyOrder::getOrderStatus,sts); }else{ wrapper.eq(BuyOrder::getOrderStatus,params.get("orderStatus").toString()); @@ -147,7 +151,7 @@ public class BuyOrderServiceImpl extends ServiceImpl impl b.setExpressList(expressOrders); } } - b.setRefundableStatus(b.getOrderStatus().equals("6")?false:refundableStatus); + b.setRefundableStatus(b.getOrderStatus().equals("6") || b.getOrderStatus().equals("7")|| Constants.PAYMENT_METHOD_ALI_PAY.equals(b.getPaymentMethod())?false:refundableStatus); } } return page; diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java b/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java index 6a1bb0f..2ab3cf0 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/controller/WeChatPayController.java @@ -126,6 +126,7 @@ public class WeChatPayController { */ @RequestMapping("/refund" ) public R refund(@RequestBody Map map){ + return R.ok(wxpayService.refund(map)); } @@ -135,11 +136,13 @@ public class WeChatPayController { */ @PostMapping("/refundNotify") public void refundNotify(HttpServletRequest request){ + wxpayService.refundNotify(request); } @PostMapping("/lsRefundNotify") public void lsRefundNotify(HttpServletRequest request){ + wxpayService.lsRefundNotify(request); } diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/dto/WeChatRefundInfo.java b/src/main/java/com/peanut/modules/pay/weChatPay/dto/WeChatRefundInfo.java new file mode 100644 index 0000000..f2f680c --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/weChatPay/dto/WeChatRefundInfo.java @@ -0,0 +1,21 @@ +package com.peanut.modules.pay.weChatPay.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class WeChatRefundInfo implements Serializable { + private String orderSn; + private Integer orderId; + private String orderType; + private String refundNo; + private BigDecimal totalAmount; + private BigDecimal refundAmount; + private String remark; + private String appName; + private String currency; + private String notify_url; + private int refundId; +} diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java b/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java index 6abdc4c..3bf8495 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/service/WxpayService.java @@ -2,6 +2,7 @@ package com.peanut.modules.pay.weChatPay.service; import com.baomidou.mybatisplus.extension.service.IService; import com.peanut.modules.common.entity.PayWechatOrderEntity; +import com.peanut.modules.pay.weChatPay.dto.WeChatRefundInfo; import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo; import org.springframework.stereotype.Service; @@ -19,6 +20,8 @@ public interface WxpayService extends IService { String refund(Map map); + void refund(WeChatRefundInfo refundInfo); + void refundNotify(HttpServletRequest request); void lsRefundNotify(HttpServletRequest request); diff --git a/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java b/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java index 83b5b37..88b2cff 100644 --- a/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java +++ b/src/main/java/com/peanut/modules/pay/weChatPay/service/impl/WxpayServiceImpl.java @@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.ShiroUtils; -import com.peanut.config.Constants; import com.peanut.modules.book.service.BookBuyConfigService; import com.peanut.modules.book.service.BuyOrderService; import com.peanut.modules.book.service.MyUserService; @@ -21,11 +20,13 @@ import com.peanut.modules.master.service.UserCourseBuyService; import com.peanut.modules.pay.refund.entity.PayRefundOrder; import com.peanut.modules.pay.refund.service.PayRefundOrderService; import com.peanut.modules.pay.weChatPay.config.WechatPayConfig; +import com.peanut.modules.pay.weChatPay.dto.WeChatRefundInfo; import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo; import com.peanut.modules.pay.weChatPay.service.WxpayService; import com.peanut.modules.pay.weChatPay.util.HttpUtils; import com.peanut.modules.pay.weChatPay.util.WechatPayValidator; import com.peanut.modules.pay.weChatPay.util.WxPayUtil; +import com.qiniu.util.Json; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -79,10 +80,6 @@ public class WxpayServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + + BigDecimal refund = new BigDecimal(refundInfo.getRefundAmount().toString()); + //原订单总金额 + BigDecimal total = refundInfo.getTotalAmount(); + // 这里 * 100,微信支付单位为 ‘分’ + BigDecimal hand = new BigDecimal("100"); + Map amountMap = new HashMap<>(); + amountMap.put("refund", refund.multiply(hand)); + amountMap.put("total", total.multiply(hand).intValue()); + amountMap.put("currency", "CNY"); + paramMap.put("amount", amountMap); + paramMap.put("out_refund_no", refundInfo.getRefundNo()); + //微信支付订单号 + paramMap.put("out_trade_no", refundInfo.getOrderSn()); + //退款原因 + paramMap.put("reason", refundInfo.getRemark()); + + String appid = ""; + if (refundInfo.getAppName()==null||"".equals(refundInfo.getAppName())){ + appid = wechatPayConfig.getAppId(); + }else if ("zmzm".equals(refundInfo.getAppName())){ + appid = wechatPayConfig.getZmzmappId(); + } else if ("wumen".equals(refundInfo.getAppName())) { + appid = wechatPayConfig.getWumenappId(); + } else if ("xlkj".equals(refundInfo.getAppName())) { + appid = wechatPayConfig.getXlkjappId(); + } else if ("thyy".equals(refundInfo.getAppName())) { + appid = wechatPayConfig.getThyyappId(); + } + // app id + paramMap.put("appid", appid); + + String notify_url = wechatPayConfig.getRefundNotifyUrl(); + String mchName = ""; + if ("trainingClass".equals(refundInfo.getOrderType())||"lsorder".equals(refundInfo.getOrderType())) { + mchName = "LS"; + notify_url = wechatPayConfig.getLsRefundNotifyUrl(); + } + paramMap.put("notify_url", notify_url); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(paramMap)); + log.info("=======微信退款申请请求参数:{}", json.toJSONString()); + log.info(">>>>>>>>>>App请求微信退款申请接口"); + + JSONObject responseJson = wxPayUtil.doPostWexinV3(wechatPayConfig.getRefundUrl(), json.toJSONString(),mchName); +// JSONObject responseJson = new JSONObject(); +// responseJson.put("status","SUCCESS"); +// responseJson.put("refund_id",System.currentTimeMillis()); + + System.out.println(responseJson); + log.info(">>>>>>>>>>>微信退款返回的信息是 resJson = {}", responseJson.toJSONString()); + if ("SUCCESS".equals(responseJson.get("status"))){ + buyOrderRefundLogService.insertRefundLog(refundInfo.getRefundId(),1,2); + + BuyOrderRefund buyOrderRefund = buyOrderRefundService.getById(refundInfo.getRefundId()); + buyOrderRefund.setWxRefundNo(responseJson.getString("refund_id")); + buyOrderRefundService.updateById(buyOrderRefund); + }else{ + buyOrderRefundLogService.insertRefundLog(refundInfo.getRefundId(),1,3); + } +// return responseJson.toJSONString(); + } private void userCoinJf(BuyOrder order){ MyUserEntity userEntity = userService.getById(order.getUserId()); userEntity.setJf(userEntity.getJf().subtract(order.getJfDeduction())); @@ -378,6 +447,18 @@ public class WxpayServiceImpl extends ServiceImpl resourceMap = WechatPayValidator.decryptFromResource(resource, wechatPayConfig.getApiV3Key(), 2); + /*BuyOrder orderFalse = buyOrderService.getOne(new QueryWrapper().eq("user_id",149299).orderByDesc("order_id")); + BuyOrderRefund refundFalse = buyOrderRefundService.getOne(new QueryWrapper().eq("user_id",149299).orderByDesc("id")); + Map resourceMap = new HashMap<>(); + resourceMap.put("refund_status","SUCCESS"); + resourceMap.put("out_trade_no",orderFalse.getOrderSn()); + resourceMap.put("refund_id",System.currentTimeMillis()); + resourceMap.put("out_refund_no",refundFalse.getRefundNo()); + Map amount = new HashMap<>(); + amount.put("refund",orderFalse.getRealMoney()); + resourceMap.put("amount",amount);*/ + + log.info("微信退款回调结果 msg={}",resourceMap); if ("SUCCESS".equals(resourceMap.get("refund_status").toString())){ log.info(">>>>>>>>>>>微信退款成功!<<<<<<<<<<<<<"); @@ -385,15 +466,40 @@ public class WxpayServiceImpl extends ServiceImpl().eq("order_id",order.getOrderId())); - buyOrderRefund.setStatus(1); - buyOrderRefundService.updateById(buyOrderRefund); - buyOrderRefundLogService.insertRefundLog(buyOrderRefund.getId(),4,1); + PayRefundOrder refund = new PayRefundOrder(); + refund.setPayType("1"); + refund.setOrderId(order.getOrderId()); + refund.setTradeNo(resourceMap.get("transaction_id").toString()); + refund.setOutTradeNo(resourceMap.get("out_trade_no").toString()); + refund.setRefundFee(((Map)resourceMap.get("amount")).get("refund").toString()); + refundOrderService.save(refund); + + MyUserEntity user = myUserService.getById(order.getUserId()); + + BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper().eq("order_id",order.getOrderId())); + refundInfo.setStatus(1); + refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString()); + buyOrderRefundService.updateById(refundInfo); + + buyOrderService.refundOrder(order,user,refundInfo.getId()); + + buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,1); + + buyOrderService.updateOrderStatus(order.getUserId(),order.getOrderSn(),"6"); +// refundOrderService.businessOpt(order); + }else{ + if(resourceMap.containsKey("out_refund_no")){ + String refundNo = resourceMap.get("out_refund_no").toString(); + BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper().eq("refund_no",refundNo)); + refundInfo.setStatus(2); + refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString()); + buyOrderRefundService.updateById(refundInfo); + + buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,3,resourceMap.get("reason").toString()); + } - buyOrderService.refundOrder(); } } @Override @@ -413,6 +519,7 @@ public class WxpayServiceImpl extends ServiceImpl() - .eq(BuyOrderRefund::getOrderId, order.getOrderId()) - .orderByDesc(BuyOrderRefund::getId) - .last("limit 1")); - if (buyOrderRefund != null) { - buyOrderRefundLogService.insertRefundLog(buyOrderRefund.getId(),4,1); - } - } else { - refundOrderService.businessOpt(order); + + //refundOrderService.businessOpt(order); + + MyUserEntity user = myUserService.getById(order.getUserId()); + + BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper().eq("order_id",order.getOrderId())); + refundInfo.setStatus(1); + refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString()); + buyOrderRefundService.updateById(refundInfo); + + buyOrderService.refundOrder(order,user,refundInfo.getId()); + + buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,1); + + buyOrderService.updateOrderStatus(order.getUserId(),order.getOrderSn(),"6"); + }else{ + if(resourceMap.containsKey("out_refund_no")){ + String refundNo = resourceMap.get("out_refund_no").toString(); + BuyOrderRefund refundInfo = buyOrderRefundService.getOne(new QueryWrapper().eq("refund_no",refundNo)); + refundInfo.setStatus(2); + refundInfo.setWxRefundNo( resourceMap.get("refund_id").toString()); + buyOrderRefundService.updateById(refundInfo); + + buyOrderRefundLogService.insertRefundLog(refundInfo.getId(),1,3,resourceMap.get("reason").toString()); } + } }