bihs 1 maand geleden
bovenliggende
commit
9194295eac

+ 2 - 9
qmjszx-pay/src/main/java/beilv/wx/pay/controller/WxPayController.java

@@ -5,14 +5,7 @@ import beilv.common.core.domain.AjaxResult;
 import beilv.wx.pay.domain.vo.AppPayParam;
 import beilv.wx.pay.domain.vo.AppRefundParam;
 import beilv.wx.pay.service.IWxPayService;
-import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
-import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
-import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
-import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result.JsapiResult;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -57,7 +50,7 @@ public class WxPayController extends BaseController {
      */
     @ApiOperation(value = "支付回调通知处理")
     @PostMapping("app/pay/notify")
-    public ResponseEntity<String> parseOrderNotifyResult(@RequestBody String notifyData, HttpServletRequest request) {
+    public AjaxResult parseOrderNotifyResult(@RequestBody String notifyData, HttpServletRequest request) {
         return wxPayService.handleNotify(notifyData, request);
     }
 
@@ -88,7 +81,7 @@ public class WxPayController extends BaseController {
      */
     @ApiOperation(value = "退款回调通知处理")
     @PostMapping("app/notify/refund")
-    public ResponseEntity<String> parseRefundNotifyResult(@RequestBody String notifyData, HttpServletRequest request) {
+    public AjaxResult parseRefundNotifyResult(@RequestBody String notifyData, HttpServletRequest request) {
         return wxPayService.parseRefundNotify(notifyData, request);
     }
 

+ 29 - 18
qmjszx-pay/src/main/java/beilv/wx/pay/domain/vo/AppPayParam.java

@@ -1,6 +1,6 @@
 package beilv.wx.pay.domain.vo;
 
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
+import beilv.system.domain.SysMember;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -9,35 +9,46 @@ import java.math.BigDecimal;
 
 @Data
 public class AppPayParam implements Serializable {
+
     /**
-     * 订单类型(1:会员充值;2:卡券;3:直播赛事;4:约球;)
+     * 订单单号
      */
-    private String orderType;
-    /**
-     * 支付方式(1:微信支付,2:余额支付)
+    private String orderId;
+    /***
+     * 订单总价
      */
-    private String payType;
-    /**
-     * 商品id
+    private BigDecimal totalPrice;
+    /***
+     * 实际支付金额
      */
-    private String orderId;
+    private BigDecimal payPrice;
     /***
-     * 订单金额
+     * 会员折扣金额
      */
-    private BigDecimal money;
+    private BigDecimal deductionPrice;
     /***
      * 登录人id
      */
     private Long userId;
-
     /***
-     * 退款单号
+     * 优惠券id
      */
-    private String outRefundNo;
-    
-    /**
-     * 退款原因
+    private int couponId;
+    /***
+     * 优惠券金额
+     */
+    private int couponPrice;
+    /***
+     * 使用积分
+     */
+    private BigDecimal useIntegral;
+    /***
+     * 描述
+     */
+    private String description;
+    /***
+     * 登录用户信息
      */
-    private String refundReason;
+    private SysMember sysMember;
 
 }

+ 19 - 13
qmjszx-pay/src/main/java/beilv/wx/pay/domain/vo/AppRefundParam.java

@@ -9,23 +9,29 @@ import java.math.BigDecimal;
 
 @Data
 public class AppRefundParam extends WxPayRefundV3Request {
+    /**
+     * 订单单号
+     */
+    private String orderId;
     /***
-     * 订单金额
+     * 订单总价
      */
-    private BigDecimal money;
-
+    private BigDecimal totalPrice;
     /***
-     * 支付类型  1:微信 2:余额 3:退款
+     * 退款金额
      */
-    private String payType;
-
-    private SysMember sysMember;
-
-    private Long uid;
-
-    /**
-     * 订单类型(1:会员充值;2:卡券;3:报名;4:约球;5:观赛;6:退款;)
+    private BigDecimal refundAmount;
+    /***
+     * 登录人id
+     */
+    private Long userId;
+    /***
+     * 描述
      */
-    private String orderType;
+    private String description;
 
+    /***
+     * 登录用户信息
+     */
+    private SysMember sysMember;
 }

+ 0 - 10
qmjszx-pay/src/main/java/beilv/wx/pay/enums/ErrorCodeConstants.java

@@ -1,10 +0,0 @@
-package beilv.wx.pay.enums;
-
-
-import beilv.common.utils.ErrorCode;
-
-public interface ErrorCodeConstants {
-
-    ErrorCode USER_NOT_BINDING_WX_APPLET = new ErrorCode(1008007011, "该用户未绑定微信小程序!openid为空!");
-
-}

+ 0 - 27
qmjszx-pay/src/main/java/beilv/wx/pay/enums/OrderTypeEnum.java

@@ -1,27 +0,0 @@
-package beilv.wx.pay.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-
-
-/**
- * @author hupeng
- * 订单类型枚举
- */
-@Getter
-@AllArgsConstructor
-public enum OrderTypeEnum {
-
-    MEMBER_CHARGING("1", "会员充值"),
-    SINGLE_TIME("2", "卡券"),
-    MANY_TIMES("3", "报名"),
-    APPOINTMENT("4", "约球"),
-    WATCH_GAME("5", "观赛"),
-    REFOUND_MONEY("6", "退款");
-
-    private String value;
-
-    private String desc;
-
-}

+ 0 - 22
qmjszx-pay/src/main/java/beilv/wx/pay/enums/PayOrderConstants.java

@@ -1,22 +0,0 @@
-package beilv.wx.pay.enums;
-
-// 支付订单常亮
-public interface PayOrderConstants {
-
-    // 会员充值订单前缀
-    String RECHARGE_ORDER_PREFIX = "REC";
-    //观赛订单前缀
-    String EVENT_ORDER_PREFIX = "EVE";
-    //购卡订单前缀
-    String CAR_ORDER_PREFIX = "CAR";
-    //约球类型订单前缀
-    String APPOINTMENT_ORDER_PREFIX = "APP";
-    //报名类型订单前缀
-    String REGISTRATION_ORDER_PREFIX = "REG";
-    //退款订单前缀
-    String REFOUND_MONEY_PREFIX = "REF";
-
-    // 微信回调返回
-    String WEINXIN_RESULT = "{\"code\":\"SUCCESS\",\"message\":\"成功\"}";
-
-}

+ 0 - 36
qmjszx-pay/src/main/java/beilv/wx/pay/enums/PayTypeEnum.java

@@ -1,36 +0,0 @@
-/**
- * Copyright (C) 2018-2022
- * All rights reserved, Designed By www.yixiang.co
- */
-package beilv.wx.pay.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.stream.Stream;
-
-/**
- * @author hupeng
- * 支付相关枚举
- */
-@Getter
-@AllArgsConstructor
-public enum PayTypeEnum {
-
-    WEIXIN_APPLET("weixin_applet", "微信小程序支付"),
-
-    YUE("yue", "余额支付"),
-    INTEGRAL("integral", "积分兑换");
-
-    private String type;
-
-    private String desc;
-
-    public static PayTypeEnum toType(String type) {
-        return Stream.of(PayTypeEnum.values())
-                .filter(p -> p.type.equals(type))
-                .findAny()
-                .orElse(null);
-    }
-
-}

+ 43 - 98
qmjszx-pay/src/main/java/beilv/wx/pay/service/IWxPayService.java

@@ -1,8 +1,7 @@
 package beilv.wx.pay.service;
 
-import beilv.carinformation.domain.CarInformation;
 import beilv.carinformation.mapper.CarInformationMapper;
-import beilv.competition.domain.Competition;
+import beilv.common.core.domain.AjaxResult;
 import beilv.competition.mapper.CompetitionMapper;
 import beilv.order.domain.StoreOrder;
 import beilv.order.domain.StoreRefund;
@@ -13,8 +12,6 @@ import beilv.system.service.ISysMemberService;
 import beilv.wx.pay.config.WxPayProperties;
 import beilv.wx.pay.domain.vo.AppPayParam;
 import beilv.wx.pay.domain.vo.AppRefundParam;
-import beilv.wx.pay.enums.OrderTypeEnum;
-import beilv.wx.pay.enums.PayOrderConstants;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
@@ -68,24 +65,23 @@ public class IWxPayService {
      */
     public JsapiResult unifiedOrder(AppPayParam param) throws Exception {
         SysMember user = getSysMember(param.getUserId());
+        param.setSysMember(user);
         //生成唯一标识商家订单号
-        String outTradeNo = generateOutTradeNo(param.getOrderType());
         WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
         request.setAppid(wxPayProperties.getAppId());
         request.setMchid(wxPayProperties.getMchId());
-        request.setDescription(orderInfo(param, user));
-        request.setOutTradeNo(outTradeNo);
+        request.setDescription(param.getDescription());
+        request.setOutTradeNo(param.getOrderId());
         request.setNotifyUrl(wxPayProperties.getNotifyUrl());
         WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
-        amount.setTotal(yuanToFen(param.getMoney()));
+        amount.setTotal(yuanToFen(param.getPayPrice()));
         amount.setCurrency("CNY");
         request.setAmount(amount);
         request.setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(user.getOpenId()));
         JsapiResult jsapiResult = this.wxService.createOrderV3(TradeTypeEnum.JSAPI, request);
         if (StringUtils.isNotEmpty(jsapiResult.getPackageValue())) {
             //成功之后创建订单
-            generateOrder(user, param, outTradeNo, jsapiResult.getPackageValue(), orderInfo(param, user));
-
+            generateOrder(param, jsapiResult.getPackageValue());
         }
         return jsapiResult;
     }
@@ -109,73 +105,33 @@ public class IWxPayService {
                 .intValueExact();
     }
 
+
     /**
      * 统一下单接口
      *
      * @return 预支付交易会话标识
      */
-    private void generateOrder(SysMember user, AppPayParam param, String outTradeNo, String payId, String remark) {
+    private void generateOrder(AppPayParam param, String payId) {
         StoreOrder storeOrder = new StoreOrder();
-        storeOrder.setOrderId(outTradeNo);
-        storeOrder.setOrderType(param.getOrderType());
-        storeOrder.setUid(user.getId());
-        storeOrder.setRealName(user.getUsername());
-        storeOrder.setUserPhone(user.getMobile());
-        storeOrder.setUserAddress(user.getAddress());
+        storeOrder.setOrderId(param.getOrderId());
+        storeOrder.setUid(param.getSysMember().getId());
+        storeOrder.setRealName(param.getSysMember().getUsername());
+        storeOrder.setUserPhone(param.getSysMember().getMobile());
+        storeOrder.setUserAddress(param.getSysMember().getAddress());
         storeOrder.setTotalNum(1);
-        storeOrder.setPayType(param.getPayType());
-        storeOrder.setTotalPrice(param.getMoney());
-        storeOrder.setPayPrice(param.getMoney());
+        storeOrder.setTotalPrice(param.getTotalPrice());
+        storeOrder.setPayPrice(param.getPayPrice());
         storeOrder.setPayTime(new Date());
         storeOrder.setPayId(payId);
         storeOrder.setCreateTime(new Date());
-        storeOrder.setRemark(remark);
         storeOrderMapper.insertStoreOrder(storeOrder);
     }
 
-    //生成商户订单号
-    public String generateOutTradeNo(String orderType) {
-        String prefix = "";
+    //生成退款订单号
+    public String generateOutTradeNo() {
         String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
         String random = String.valueOf((int) ((Math.random() * 9 + 1) * 100000)); // 6位随机
-        if (orderType.equals(OrderTypeEnum.MEMBER_CHARGING.getValue())) {
-            prefix = PayOrderConstants.RECHARGE_ORDER_PREFIX;
-        } else if (orderType.equals(OrderTypeEnum.SINGLE_TIME.getValue())) {
-            prefix = PayOrderConstants.CAR_ORDER_PREFIX;
-        } else if (orderType.equals(OrderTypeEnum.MANY_TIMES.getValue())) {
-            prefix = PayOrderConstants.EVENT_ORDER_PREFIX;
-        } else if (orderType.equals(OrderTypeEnum.APPOINTMENT.getValue())) {
-            prefix = PayOrderConstants.APPOINTMENT_ORDER_PREFIX;
-        } else if (orderType.equals(OrderTypeEnum.WATCH_GAME.getValue())) {
-            prefix = PayOrderConstants.REGISTRATION_ORDER_PREFIX;
-        } else if (orderType.equals(OrderTypeEnum.REFOUND_MONEY.getValue())) {
-            prefix = PayOrderConstants.REFOUND_MONEY_PREFIX;
-        }
-        return prefix + time + random;
-    }
-
-    //获取购买商品信息
-    private String orderInfo(AppPayParam param, SysMember user) {
-        String orderType = param.getOrderType();
-        String isVip = user.getIsVip();
-        if (orderType.equals(OrderTypeEnum.MEMBER_CHARGING.getValue())) {
-            return "会员充值";
-        } else if (orderType.equals(OrderTypeEnum.SINGLE_TIME.getValue())) {
-            CarInformation carInformation = carInformationMapper.selectCarInformationById(Long.valueOf(param.getOrderId()));
-            if ("1".equals(isVip)) {
-                return carInformation.getMemberPrice().toString();
-            }
-            return carInformation.getName();
-        } else if (orderType.equals(OrderTypeEnum.MANY_TIMES.getValue())) {
-            Competition competition = competitionMapper.selectCompetitionById(Integer.valueOf(param.getOrderId()));
-            return competition.getCompetitionTitle() + competition.getCompetitionType() + "报名";
-        } else if (orderType.equals(OrderTypeEnum.APPOINTMENT.getValue())) {
-            return "球场预约";
-        } else if (orderType.equals(OrderTypeEnum.WATCH_GAME.getValue())) {
-            Competition competition = competitionMapper.selectCompetitionById(Integer.valueOf(param.getOrderId()));
-            return competition.getCompetitionTitle() + competition.getCompetitionType() + "观赛";
-        }
-        return null;
+        return "REF" + time + random;
     }
 
     /**
@@ -183,7 +139,7 @@ public class IWxPayService {
      *
      * @return 处理结果
      */
-    public ResponseEntity<String> handleNotify(String notifyData, HttpServletRequest request) {
+    public AjaxResult handleNotify(String notifyData, HttpServletRequest request) {
         SignatureHeader header = getRequestHeader(request);
         try {
             WxPayNotifyV3Result res = this.wxService.parseOrderNotifyV3Result(notifyData, header);
@@ -193,14 +149,14 @@ public class IWxPayService {
                 // 成功处理订单
                 processOrderPayment(decryptRes.getOutTradeNo());
                 // 成功返回200/204,body无需有内容
-                return ResponseEntity.status(200).body("");
+                return AjaxResult.success();
             } else {
                 // 失败返回4xx或5xx,且需要构造body信息
-                return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
+                return AjaxResult.error();
             }
         } catch (WxPayException e) {
             // 失败返回4xx或5xx,且需要构造body信息
-            return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
+            return AjaxResult.error("微信支付回调失败");
         }
     }
 
@@ -218,11 +174,7 @@ public class IWxPayService {
                 order.setPaid(1); // 设置为已支付
                 order.setStatus(1); // 设置订单状态为已支付
                 order.setPayTime(new java.util.Date()); // 设置支付时间
-
                 storeOrderMapper.updateStoreOrder(order);
-
-                // TODO: 根据订单类型处理不同的业务逻辑
-                // 例如:会员充值订单更新用户会员状态、购买商品订单更新库存等
             }
         }
     }
@@ -234,38 +186,37 @@ public class IWxPayService {
     public WxPayRefundV3Result refund(AppRefundParam param) throws WxPayException {
         WxPayRefundV3Request request = new WxPayRefundV3Request();
         //商户退款单号
-        request.setOutRefundNo(param.getOutTradeNo());
+        request.setOutRefundNo(param.getOrderId());
         //原支付商户订单号
-        request.setOutTradeNo(param.getOutTradeNo());
+        request.setOutTradeNo(param.getOrderId());
         //退款原因说明
-        request.setReason("不想要了");
+        request.setReason(param.getReason());
         WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount();
         //原订单总金额(单位:分)
-        amount.setTotal(yuanToFen(param.getMoney()));
+        amount.setTotal(yuanToFen(param.getTotalPrice()));
         //退款金额(单位:分)
-        amount.setRefund(yuanToFen(param.getMoney()));
+        amount.setRefund(yuanToFen(param.getRefundAmount()));
         //货币类型,默认 "CNY"
         amount.setCurrency("CNY");
         request.setAmount(amount);
         request.setNotifyUrl(wxPayProperties.getRefundNotifyUrl());
-        String outTradeNo = param.getOutTradeNo();
-
-        refundOrder(getSysMember(param.getUid()), param, outTradeNo, request.getReason());
+        param.setSysMember(getSysMember(param.getUserId()));
+        refundOrder(param);
         return this.wxService.refundV3(request);
     }
 
     /**
-     * 统一下单接口
+     * 统一退款接口
      *
      * @return 预支付交易会话标识
      */
-    private void refundOrder(SysMember user, AppRefundParam param, String outTradeNo, String reason) {
+    private void refundOrder(AppRefundParam param) {
         StoreRefund storeRefund = new StoreRefund();
-        storeRefund.setUid(user.getId());
-        storeRefund.setRefundNo(generateOutTradeNo(param.getOrderType()));
-        storeRefund.setOrderId(outTradeNo);
-        storeRefund.setRefundAmount(param.getMoney());
-        storeRefund.setRefundReason(reason);
+        storeRefund.setUid(param.getSysMember().getId());
+        storeRefund.setRefundNo(generateOutTradeNo());
+        storeRefund.setOrderId(param.getOrderId());
+        storeRefund.setRefundAmount(param.getRefundAmount());
+        storeRefund.setRefundReason(param.getReason());
         storeRefund.setCreateTime(new Date());
         storeRefundMapper.insertStoreRefund(storeRefund);
     }
@@ -275,7 +226,7 @@ public class IWxPayService {
      *
      * @return 处理结果
      */
-    public ResponseEntity<String> parseRefundNotify(String notifyData, HttpServletRequest request) {
+    public AjaxResult parseRefundNotify(String notifyData, HttpServletRequest request) {
         SignatureHeader header = getRequestHeader(request);
         try {
             WxPayRefundNotifyV3Result res = this.wxService.parseRefundNotifyV3Result(notifyData, header);
@@ -285,14 +236,14 @@ public class IWxPayService {
                 // 成功处理订单
                 processOrderRefund(decryptRes.getOutTradeNo());
                 //成功返回200/204,body无需有内容
-                return ResponseEntity.status(200).body("");
+                return AjaxResult.success();
             } else {
                 //失败返回4xx或5xx,且需要构造body信息
-                return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
+                return AjaxResult.error();
             }
         } catch (WxPayException e) {
             //失败返回4xx或5xx,且需要构造body信息
-            return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
+            return AjaxResult.error("微信退款回调失败");
         }
     }
 
@@ -305,27 +256,21 @@ public class IWxPayService {
         StoreOrder order = storeOrderMapper.selectStoreOrderByOrderId(outTradeNo);
         if (order != null) {
             // 检查订单是否已经处理过
-            if (order.getRefundStatus() == null && order.getPaid() == 1) {
+            if (order.getRefundStatus() != null && order.getPaid() == 1) {
                 // 更新订单状态
-                order.setStatus(1); // 设置订单状态为已退款
+                order.setStatus(2); // 设置订单状态为已退款
                 order.setUpdateTime(new Date());
                 storeOrderMapper.updateStoreOrder(order);
-
-                // TODO: 根据订单类型处理不同的业务逻辑
-                // 例如:会员充值订单更新用户会员状态、购买商品订单更新库存等
             }
         }
         StoreRefund refund = storeRefundMapper.selectStoreRefundByOrderId(outTradeNo);
         if (refund != null) {
             // 检查订单是否已经处理过
-            if (refund.getRefundStatus() == null && refund.getRefundStatus().equals("1")) {
+            if (refund.getRefundStatus() != null && refund.getRefundStatus().equals("1")) {
                 // 更新订单状态
                 refund.setRefundStatus("2"); // 设置订单状态为已退款
                 refund.setSuccessTime(new Date());
                 storeRefundMapper.updateStoreRefund(refund);
-
-                // TODO: 根据订单类型处理不同的业务逻辑
-                // 例如:会员充值订单更新用户会员状态、购买商品订单更新库存等
             }
         }
     }