From f021540afe09a1b9bfeb9cefeb030e6ccf09375d Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期三, 28 八月 2024 16:07:28 +0800
Subject: [PATCH] 完善支付相关功能
---
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java | 35 +++++
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java | 138 +++++++++++++++++++++-
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java | 7 +
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java | 6 +
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java | 4
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java | 12 ++
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java | 12 ++
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java | 10 +
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java | 5
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java | 17 ++
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java | 8 +
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java | 5
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java | 14 ++
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java | 22 ++-
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java | 2
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java | 10 +
16 files changed, 287 insertions(+), 20 deletions(-)
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
index f3aa48a..708996e 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
@@ -29,6 +29,14 @@
@ApiModelProperty(value = "主键")
@TableField("id")
private Long id;
+
+ @ApiModelProperty(value = "支付时间")
+ @TableField("pay_time")
+ private LocalDateTime payTime;
+
+ @ApiModelProperty(value = "支付流水号")
+ @TableField("pay_code")
+ private String payCode;
@ApiModelProperty(value = "累计退款金额")
@TableField("pay_amount")
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
index 4937da4..ba006ed 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
@@ -35,6 +35,11 @@
public R<List<Integer>> getCouponIdsByName(String name) {
return R.fail("根据名称查询优惠券ids:" + throwable.getMessage());
}
+
+ @Override
+ public R updateCoupon(TCoupon coupon) {
+ throw new RuntimeException("修改优惠券失败");
+ }
};
}
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
index 2ee7b91..e9002f4 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
@@ -33,6 +33,11 @@
public R<List<Integer>> getGoodsIdsByName(String name) {
return R.fail("根据商品名称获取商品ids失败:" + throwable.getMessage());
}
+
+ @Override
+ public R updateGoods(TGoods goods) {
+ throw new RuntimeException("修改商品异常");
+ }
};
}
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
index 64f7fdb..946dc50 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
@@ -8,6 +8,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@@ -28,4 +29,13 @@
R<TCoupon> getCouponById1(@PathVariable("id") Integer id);
@PostMapping("/t-coupon/getCouponIdsByName/{name}")
R<List<Integer>> getCouponIdsByName(@PathVariable("name")String name);
+
+
+ /**
+ * 修改优惠券
+ * @param coupon
+ * @return
+ */
+ @PostMapping("/t-coupon/updateCoupon")
+ R updateCoupon(@RequestBody TCoupon coupon);
}
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
index 6f918aa..7f7e94a 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
@@ -8,6 +8,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@@ -32,4 +33,13 @@
*/
@PostMapping("/t-goods/getGoodsIdsByName/{name}")
public R<List<Integer>> getGoodsIdsByName(@PathVariable("name")String name);
+
+
+ /**
+ * 修改商品
+ * @param goods
+ * @return
+ */
+ @PostMapping("/t-goods/updateGoods")
+ R updateGoods(@RequestBody TGoods goods);
}
diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
index ee40d32..6ed2018 100644
--- a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
@@ -5,6 +5,7 @@
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
import com.ruoyi.payment.api.vo.PaymentOrder;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -58,6 +59,11 @@
return R.fail("微信退款失败:" + throwable.getMessage());
}
+
+ @Override
+ public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) {
+ return R.fail("微信退款回调失败:" + throwable.getMessage());
+ }
};
}
}
diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
index a09b432..90cb9c9 100644
--- a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
+++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
@@ -6,6 +6,7 @@
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
import com.ruoyi.payment.api.vo.PaymentOrder;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
@@ -65,4 +66,10 @@
@ApiOperation("订单退款")
@PostMapping(value = "/wx/refundOrderR")
public R<String> refundOrderR(@RequestBody WxPaymentRefundModel model);
+
+
+
+ @ApiOperation("订单退款回调")
+ @PostMapping(value = "/wx/refund/notify")
+ R<WxRefundNotifyResp> refundNotify(HttpServletRequest request);
}
diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java
new file mode 100644
index 0000000..320cc40
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java
@@ -0,0 +1,35 @@
+package com.ruoyi.payment.api.vo;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/28 14:54
+ */
+@Data
+public class WxRefundNotifyResp {
+ /**
+ * 支付单号
+ */
+ private String out_trade_no;
+ /**
+ * 退款单号
+ */
+ private String out_refund_no;
+ /**
+ * 支付流水号
+ */
+ private String transaction_id;
+ /**
+ * 退款流水号
+ */
+ private String refund_id;
+ /**
+ * 退款状态
+ */
+ private String tradeState;
+ /**
+ * 退款时间
+ */
+ private String success_time;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
index c843b31..4edd63f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -24,6 +24,7 @@
import com.ruoyi.payment.api.model.RefundReq;
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.swagger.annotations.Api;
@@ -33,6 +34,7 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -228,6 +230,21 @@
return shoppingOrderService.cancelOrder(id);
}
+ /**
+ * 商城订单取消微信退款回调
+ */
+ @PostMapping("/cancelShoppingOrderWxRefund")
+ public void cancelShoppingOrderWxRefund(HttpServletRequest request){
+ WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
+ if(null != data){
+ String out_refund_no = data.getOut_refund_no();
+ String refund_id = data.getRefund_id();
+ String tradeState = data.getTradeState();
+ String success_time = data.getSuccess_time();
+ shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time);
+ }
+ }
+
@ResponseBody
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
index 307d58f..382c3ff 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
@@ -39,6 +39,8 @@
private String code;
@ApiModelProperty("下单时间")
private String createTime;
+ @ApiModelProperty("订单金额")
+ private BigDecimal orderAmount;
@ApiModelProperty("支付金额")
private BigDecimal paymentAmount;
@ApiModelProperty("备注")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
index 6cc1346..a16ec05 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
@@ -19,6 +19,8 @@
private String imgUrl;
@ApiModelProperty("商品名称")
private String name;
+ @ApiModelProperty("商品类型(1=商品,2=优惠券)")
+ private Integer orderType;
@ApiModelProperty("状态(1=待发货,2=待收货,3=已完成,4=已取消)")
private Integer status;
@ApiModelProperty("单价")
@@ -27,4 +29,6 @@
private Integer number;
@ApiModelProperty("支付金额")
private BigDecimal paymentAmount;
+ @ApiModelProperty("订单时间")
+ private String createTime;
}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
index a103b1d..ae5925d 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
@@ -55,6 +55,18 @@
/**
+ * 商城订单取消订单微信退款处理
+ * @param out_refund_no 退款单号
+ * @param refund_id 退款流水号
+ * @param refund_status 退款状态 SUCCESS:退款成功 CLOSED:退款关闭 ABNORMAL:退款异常
+ * @param success_time 退款成功时间
+ * @return
+ */
+ AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time);
+
+
+
+ /**
* 获取未开票的订单列表
* @param query
* @return
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
index af1d4e3..30fb46a 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -7,11 +7,13 @@
import com.ruoyi.account.api.feignClient.AppCouponClient;
import com.ruoyi.account.api.feignClient.AppUserAddressClient;
import com.ruoyi.account.api.model.TAppUserAddress;
+import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.order.api.model.TShoppingOrder;
+import com.ruoyi.order.api.model.TShoppingOrderRefund;
import com.ruoyi.order.api.query.ShoppingOrderQuery;
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.ChargingOrderVO;
@@ -19,6 +21,7 @@
import com.ruoyi.order.api.vo.TActivityVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TShoppingOrderMapper;
+import com.ruoyi.order.service.TShoppingOrderRefundService;
import com.ruoyi.order.service.TShoppingOrderService;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
@@ -26,17 +29,25 @@
import com.ruoyi.other.api.feignClient.GoodsClient;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
+import com.ruoyi.payment.api.model.RefundReq;
+import com.ruoyi.payment.api.model.RefundResp;
+import com.ruoyi.payment.api.model.WxPaymentRefundModel;
+import com.ruoyi.payment.api.vo.AliQueryOrder;
import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
+import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
+import java.util.stream.Collectors;
/**
* <p>
@@ -68,6 +79,9 @@
@Resource
private AliPaymentClient aliPaymentClient;
+
+ @Resource
+ private TShoppingOrderRefundService shoppingOrderRefundService;
@@ -206,6 +220,7 @@
myShoppingOrderList.setUnitPrice(unitPrice);
myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+ myShoppingOrderList.setOrderType(tShoppingOrder.getOrderType());
pageList.add(myShoppingOrderList);
}
return pageList;
@@ -250,6 +265,7 @@
info.setUnitPrice(unitPrice);
info.setCode(shoppingOrder.getCode());
info.setCreateTime(shoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ info.setOrderAmount(shoppingOrder.getOrderAmount());
info.setPaymentAmount(shoppingOrder.getPaymentAmount());
info.setRemark(shoppingOrder.getRemark());
info.setDeliveryTime(shoppingOrder.getConsignerTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
@@ -272,11 +288,18 @@
if(shoppingOrder.getStatus() == 3){
return AjaxResult.error("订单已完成,不能取消");
}
- if(shoppingOrder.getStatus() == 4){
+ //退款状态并且所有金额退完
+ List<TShoppingOrderRefund> list = shoppingOrderRefundService.list(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getShoppingOrderId, id).eq(TShoppingOrderRefund::getRefundStatus, 2));
+ BigDecimal bigDecimal = list.stream().map(TShoppingOrderRefund::getRefundAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_EVEN);
+ if(shoppingOrder.getPaymentAmount().compareTo(bigDecimal) == 0 && shoppingOrder.getStatus() == 4){
return AjaxResult.error("订单已取消,不能重复操作");
}
+
+ //退款金额
+ BigDecimal refundAmount = shoppingOrder.getPaymentAmount().subtract(bigDecimal);
+
//先查询第三方订单状态订单是否退款
- //支付方式(1=微信,2=支付宝) todo 待完善
+ //支付方式(1=微信,2=支付宝)
Integer paymentType = shoppingOrder.getPaymentType();
if(1 == paymentType){
NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(shoppingOrder.getCode()).getData();
@@ -290,20 +313,118 @@
if("USERPAYING".equals(trade_state)){
return AjaxResult.error("订单正在支付中,不能操作退款");
}
- if("REFUND".equals(trade_state)){
- return AjaxResult.error("订单已退款,不能操作退款");
- }
}
if(2 == paymentType){
-
+ AliQueryOrder aliQueryOrder = aliPaymentClient.query(shoppingOrder.getCode()).getData();
+ String tradeStatus = aliQueryOrder.getTradeStatus();
+ if("TRADE_CLOSED".equals(tradeStatus)){
+ return AjaxResult.error("订单还未支付,不能操作退款");
+ }
+ if("TRADE_FINISHED".equals(tradeStatus)){
+ return AjaxResult.error("订单支付已关闭,不能操作退款");
+ }
+ if("WAIT_BUYER_PAY".equals(tradeStatus)){
+ return AjaxResult.error("订单正在支付中,不能操作退款");
+ }
}
//退款成功后需要判断商品库存类型后决定是否需要回退库存
//加redis锁处理高并发
-
-
+ //构建退款明细
+ TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund();
+ shoppingOrderRefund.setPayTime(shoppingOrder.getPayTime());
+ shoppingOrderRefund.setPayCode(shoppingOrder.getSerialNumber());
+ shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType());
+ shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId());
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ shoppingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Math.random() * 1000));
+ shoppingOrderRefund.setRefundAmount(refundAmount);
+ shoppingOrderRefund.setRefundStatus(1);
+ shoppingOrderRefund.setCode(shoppingOrder.getCode());
+ shoppingOrderRefund.setRefundTitle("取消订单");
+ shoppingOrderRefund.setRefundContent("取消订单");
+ shoppingOrderRefund.setRefundReason("取消订单");
+ shoppingOrderRefund.setRefundRemark("全额退款");
+ shoppingOrderRefund.setRefundTotalAmount(refundAmount.add(bigDecimal));
+ shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount());
+ if(1 == paymentType){
+ WxPaymentRefundModel model = new WxPaymentRefundModel();
+ model.setOut_trade_no(shoppingOrder.getCode());
+ model.setOut_refund_no(shoppingOrderRefund.getRefundCode());
+ model.setReason("取消订单");
+ model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund");
+ WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+ amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+ amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
+ amount.setCurrency("CNY");
+ model.setAmount(amount);
+ R<String> orderR = wxPaymentClient.refundOrderR(model);
+ if(200 == orderR.getCode()){
+ shoppingOrderRefundService.save(shoppingOrderRefund);
+ }
+ }
+ if(2 == paymentType){
+ RefundReq dto = new RefundReq();
+ dto.setOutTradeNo(shoppingOrder.getCode());
+ dto.setOutRequestNo(shoppingOrderRefund.getCode());
+ dto.setRefundAmount(refundAmount.toString());
+ dto.setRefundReason("取消订单");
+ RefundResp resp = aliPaymentClient.refund(dto).getData();
+ if(null != resp){
+ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
+ AjaxResult success = cancelShoppingOrderWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
+ if(success.isSuccess()){
+ shoppingOrderRefundService.save(shoppingOrderRefund);
+ }
+ }
+ }
return AjaxResult.success();
}
+
+ /**
+ * 商城订单取消订单微信退款处理
+ * @param out_refund_no 退款单号
+ * @param refund_id 退款流水号
+ * @param refund_status 退款状态 SUCCESS:退款成功 CLOSED:退款关闭 ABNORMAL:退款异常
+ * @param success_time 退款成功时间
+ * @return
+ */
+ @Override
+ @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
+ public AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time) {
+ if("SUCCESS".equals(refund_status)){
+ TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no));
+ one.setRefundSerialNumber(refund_id);
+ one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
+ shoppingOrderRefundService.updateById(one);
+ //判断是否需要回退库存
+ TShoppingOrder shoppingOrder = this.getById(one.getShoppingOrderId());
+ //商品
+ if(shoppingOrder.getOrderType() == 1){
+ // todo 需完善redis锁
+ //redis锁 和支付使用同一个锁
+ TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData();
+ Integer inventory = goods.getInventory();
+ if(-1 != inventory){
+ goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity());
+ goodsClient.updateGoods(goods);
+ }
+ //解锁
+ }
+ //优惠券
+ if(shoppingOrder.getOrderType() == 2){
+ //redis锁
+ TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData();
+ Integer inventory = coupon.getInventoryQuantity();
+ if(-1 != inventory){
+ coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity());
+ couponClient.updateCoupon(coupon);
+ }
+ //解锁
+ }
+ }
+ return AjaxResult.success();
+ }
/**
* 获取未开票的订单列表
@@ -336,6 +457,7 @@
myShoppingOrderList.setUnitPrice(unitPrice);
myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+ myShoppingOrderList.setCreateTime(tShoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss")));
pageList.add(myShoppingOrderList);
}
return pageList;
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
index 34d1ff5..a2eefca 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
@@ -202,7 +202,17 @@
TCoupon coupon = tCouponService.getById(id);
return R.ok(coupon);
}
-
-
+
+
+ /**
+ * 修改优惠券
+ * @param coupon
+ * @return
+ */
+ @PostMapping(value = "/updateCoupon")
+ public R updateCoupon(@RequestBody TCoupon coupon){
+ tCouponService.updateById(coupon);
+ return R.ok();
+ }
}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
index 6021c3a..40fb7c6 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -317,5 +317,17 @@
TGoods goods = goodsService.getById(id);
return R.ok(goods);
}
+
+
+ /**
+ * 修改商品
+ * @param goods
+ * @return
+ */
+ @PostMapping("/updateGoods")
+ public R updateGoods(@RequestBody TGoods goods){
+ goodsService.updateById(goods);
+ return R.ok();
+ }
}
diff --git a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
index 81ea044..a937505 100644
--- a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
+++ b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.payment.api.vo.PaymentOrder;
+import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import com.ruoyi.payment.wx.enums.RefundEnum;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.wx.resp.NotifyV3PayDecodeRespBody;
@@ -149,12 +150,12 @@
* 退款回调
*/
@PostMapping("refund/notify")
- public void refundNotify(HttpServletRequest request) throws IOException {
+ public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) throws IOException {
try {
Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {
});
// 商户订单号
- String tradeNo = params.get("out_trade_no").toString();
+ String out_trade_no = params.get("out_trade_no").toString();
// 商户退款单号
String out_refund_no = params.get("out_refund_no").toString();
// 微信支付订单号
@@ -167,21 +168,22 @@
// 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下
String success_time = params.get("success_time").toString();
if (tradeState.equals(RefundEnum.SUCCESS.name())) {
- String substring = out_refund_no.substring(0, 2);
- switch (substring){
- case "GW":
- break;
-
- }
- // TODO 退款成功处理
+ WxRefundNotifyResp resp = new WxRefundNotifyResp();
+ resp.setOut_trade_no(out_trade_no);
+ resp.setOut_refund_no(out_refund_no);
+ resp.setTradeState(tradeState);
+ resp.setTransaction_id(transaction_id);
+ resp.setRefund_id(refund_id);
+ resp.setSuccess_time(success_time);
wxV3Pay.ack();
+ return R.ok(resp);
} else {
wxV3Pay.ack(false, "不是成功的退款状态");
}
} catch (Exception e) {
wxV3Pay.ack(false, e.getMessage());
}
-
+ return R.fail();
}
/**
--
Gitblit v1.7.1