From 63f14ce3d17245c2da264205721e363a2c43323c Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Tue, 11 Feb 2025 10:42:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor(payment):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=E5=92=8C=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memberCenter/MemberController.java | 15 ++++-- .../pay/AliPay/AliPayController.java | 4 +- .../pay/AliPay/OrderTradeController.java | 24 ++++++++-- .../pay/service/impl/AliPayServiceImpl.java | 47 ++++++++++++------- 4 files changed, 62 insertions(+), 28 deletions(-) diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java index 22063c7..3371290 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java @@ -17,10 +17,12 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; +import org.jboss.marshalling.SimpleDataInput; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import javax.validation.constraints.NotNull; +import java.text.SimpleDateFormat; import java.util.*; @RestController @@ -179,15 +181,18 @@ public class MemberController { @ApiOperation(value = "是否是会员") public AjaxResult isMember() { Long userId = SecurityUtils.getUserId(); - Map map = new HashMap<>(); + Map map = new HashMap<>(); Member member = memberService.getUseUserMemberByUserId(userId); if (Optional.ofNullable(member).isPresent()) { - map.put("result", 1L); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = member.getStartDate(); + Date endDate = member.getEndDate(); + map.put("result", "1"); + map.put("startDate", sdf.format(startDate)); + map.put("endDate", sdf.format(endDate)); return AjaxResult.success(map); } - map.put("result", 0L); - map.put("startDate", member.getStartDate().getTime()); - map.put("endDate", member.getEndDate().getTime()); + map.put("result", "0"); return AjaxResult.success(map); } diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java index 283185e..ea865d6 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java @@ -1,6 +1,7 @@ package com.mcwl.web.controller.pay.AliPay; import cn.hutool.core.lang.UUID; +import cn.hutool.extra.qrcode.QrCodeUtil; import com.alipay.easysdk.factory.Factory; import com.mcwl.common.annotation.Anonymous; import com.mcwl.common.core.controller.BaseController; @@ -27,6 +28,7 @@ import javax.validation.constraints.NotNull; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -197,7 +199,7 @@ public class AliPayController extends BaseController { OrderTrade orderTrade = orderTradeService.lambdaQuery() .eq(OrderTrade::getCode, code) .one(); - if (orderTrade == null) { + if (Objects.isNull(orderTrade)) { return "failure"; } // 获取订单后缀 diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java index 34a85b6..25458cb 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java @@ -3,6 +3,7 @@ package com.mcwl.web.controller.pay.AliPay; import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.kernel.Config; import com.alipay.easysdk.payment.common.models.AlipayTradeCancelResponse; +import com.alipay.easysdk.payment.common.models.AlipayTradeCloseResponse; import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; import com.mcwl.common.JSONUtils; import com.mcwl.common.core.controller.BaseController; @@ -134,17 +135,30 @@ public class OrderTradeController extends BaseController { /** - * 关闭交易 + * 撤销交易 */ - @GetMapping("/closeTrade") - public AjaxResult closeTrade(String outTradeNo) throws Exception { + @GetMapping("/cancelTrade") + public AjaxResult cancelTrade(String outTradeNo) throws Exception { // 关闭交易 - AlipayTradeCancelResponse close = Factory.Payment.Common().cancel(outTradeNo); - if (close.getCode().equals("10000")) { + AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(outTradeNo); + if (cancel.getCode().equals("10000")) { return AjaxResult.success("关闭成功"); } return AjaxResult.error("关闭失败"); } + /** + * 关闭交易 + */ +// @GetMapping("/closeTrade") +// public AjaxResult closeTrade(String outTradeNo) throws Exception { +// // 关闭交易 +// AlipayTradeCloseResponse close = Factory.Payment.Common().close(outTradeNo); +// if (close.getCode().equals("10000")) { +// return AjaxResult.success("关闭成功"); +// } +// return AjaxResult.error("关闭失败"); +// } + } diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java index 66c94d1..9f997c3 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java @@ -86,6 +86,8 @@ public class AliPayServiceImpl implements AliPayService { @Autowired private OrderTradeService orderTradeService; + private final int MAX_RETRY = 3; // 最大重试次数 + public AliPayServiceImpl(Config config) { Factory.setOptions(config); @@ -315,11 +317,13 @@ public class AliPayServiceImpl implements AliPayService { // 查询redis中订单信息 String orderTradeJson = redisCache.getCacheObject(outTradeNo); - OrderTrade orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); - + OrderTrade orderTrade = null; + if (StringUtils.isNotBlank(orderTradeJson)) { + orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); + } // 如果redis中存在该订单, 则直接返回该订单的支付状态 - if (StringUtils.isNotBlank(orderTradeJson) && Objects.nonNull(orderTrade)) { - return AjaxResult.success("查询成功", orderTrade.getPayStatus()); + if (Objects.nonNull(orderTrade)) { + return AjaxResult.success("查询成功", orderTrade.getOrderStatus()); } // 查询支付宝订单 @@ -339,7 +343,7 @@ public class AliPayServiceImpl implements AliPayService { String jsonString = JSONObject.toJSONString(tradStatus); JSONObject jsonObject = JSONObject.parseObject(jsonString); Object tradeStatus = jsonObject.get("trade_status"); - if (tradeStatus != null && tradeStatus.equals("TRADE_SUCCESS")) { + if (Objects.nonNull(tradeStatus) && tradeStatus.equals("TRADE_SUCCESS")) { Map params = new HashMap<>(); params.put("buyer_pay_amount", jsonObject.get("buyer_pay_amount").toString()); params.put("out_trade_no", jsonObject.get("out_trade_no").toString()); @@ -350,24 +354,33 @@ public class AliPayServiceImpl implements AliPayService { // 获取订单后缀 String suffix = code.substring(code.lastIndexOf("_") + 1); orderTradeService.orderHandler(orderTrade, suffix, params); - return AjaxResult.success("查询成功", orderTrade.getPayStatus()); + return AjaxResult.success("查询成功", orderTrade.getOrderStatus()); } - long time = orderTrade.getCreateTime().getTime() / 1000 / 60; + long time = (System.currentTimeMillis() - orderTrade.getCreateTime().getTime()) / 1000 / 60; // time 超过15分钟,则删除redis中订单信息 - if (time >= 15) { - // 撤销交易 - AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(outTradeNo); - if (cancel.getCode().equals("10000")) { - orderTrade.setOrderStatus(4); - orderTradeService.updateById(orderTrade); - redisCache.deleteObject(outTradeNo + "promotionId"); + if (time >= 1) { + for (int i = 0; i < MAX_RETRY; i++) { + // 撤销交易 + AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(outTradeNo); + if (cancel.getMsg().equals("Success")) { + orderTrade.setOrderStatus(4); + orderTradeService.updateById(orderTrade); + redisCache.deleteObject(outTradeNo + "promotionId"); + break; + } else { + // 检查是否需要继续重试 + if (!"Y".equals(cancel.getRetryFlag())) { + break; + } + } + Thread.sleep(2000); // 间隔2秒重试 } + } - return AjaxResult.success("查询成功", orderTrade.getPayStatus()); } - redisCache.setCacheObject(outTradeNo, JSONUtil.toJsonStr(orderTrade), 5, TimeUnit.SECONDS); - return AjaxResult.success("查询成功", orderTrade.getPayStatus()); + redisCache.setCacheObject(outTradeNo, JSONUtil.toJsonStr(orderTrade), 10, TimeUnit.SECONDS); + return AjaxResult.success("查询成功", orderTrade.getOrderStatus()); }