Browse Source

余额支付

mac 2 years ago
parent
commit
e4a569e139
17 changed files with 216 additions and 47 deletions
  1. 1 1
      kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/exception/GlobalBizExceptionHandler.java
  2. 4 0
      kxs-common/kxs-common-pay/pom.xml
  3. 14 2
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/PayConfiguration.java
  4. 5 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayConstants.java
  5. 2 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayPlatformEnum.java
  6. 5 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/factory/PaymentFactory.java
  7. 1 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/PayResponse.java
  8. 29 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/YuePayMessage.java
  9. 20 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/PayService.java
  10. 0 15
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java
  11. 0 4
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/wechat/WxPayService.java
  12. 64 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/yue/YuePayService.java
  13. 33 20
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java
  14. 5 0
      kxs-user/kxs-user-api/pom.xml
  15. 0 2
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/RemoteKxsUserService.java
  16. 21 0
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/RemoteYuePayService.java
  17. 12 0
      kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/config/KxsUserFeignClientConfiguration.java

+ 1 - 1
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/exception/GlobalBizExceptionHandler.java

@@ -162,7 +162,7 @@ public class GlobalBizExceptionHandler {
 	}
 
 	/**
-	 * 参数绑定异常
+	 * 远程调用报错
 	 * @param exception 错误类型
 	 * @return {@link R}
 	 */

+ 4 - 0
kxs-common/kxs-common-pay/pom.xml

@@ -21,6 +21,10 @@
             <groupId>com.kxs</groupId>
             <artifactId>kxs-common-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-user-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-extra</artifactId>

+ 14 - 2
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/PayConfiguration.java

@@ -8,6 +8,9 @@ import com.kxs.common.pay.factory.PaymentFactory;
 import com.kxs.common.pay.handlers.PayEventHandlers;
 import com.kxs.common.pay.service.ali.AliPayService;
 import com.kxs.common.pay.service.wechat.WxPayService;
+import com.kxs.common.pay.service.yue.YuePayService;
+import com.kxs.user.api.feign.RemoteKxsUserService;
+import com.kxs.user.api.feign.RemoteYuePayService;
 import com.lly835.bestpay.config.WxPayConfig;
 import lombok.AllArgsConstructor;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -30,6 +33,8 @@ public class PayConfiguration {
 
     private final AliPayAccountConfig aliPayAccountConfig;
 
+    private final RemoteYuePayService remoteYuePayService;
+
     @Bean
     public WxPayConfig wxPayConfig() {
         WxPayConfig wxPayConfig = new WxPayConfig();
@@ -54,6 +59,13 @@ public class PayConfiguration {
     }
 
 
+    @Bean
+    @ConditionalOnMissingBean
+    public YuePayService yuePayService() {
+
+        return new YuePayService(remoteYuePayService);
+    }
+
     @Bean
     @ConditionalOnMissingBean
     public AliPayService aliPayService(AlipayClient alipayClient) {
@@ -70,9 +82,9 @@ public class PayConfiguration {
 
     @Bean
     @ConditionalOnMissingBean
-    public PaymentFactory paymentFactory(AliPayService aliPayService, WxPayService wxPayService) {
+    public PaymentFactory paymentFactory(AliPayService aliPayService, WxPayService wxPayService, YuePayService yuePayService) {
 
-        return new PaymentFactory(aliPayService, wxPayService);
+        return new PaymentFactory(aliPayService, wxPayService, yuePayService);
     }
 
     @Bean

+ 5 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayConstants.java

@@ -8,6 +8,11 @@ package com.kxs.common.pay.enums;
  */
 public interface PayConstants {
 
+    /**
+     * 余额支付成功
+     */
+    String YUE_PAY_SUCCESS = "success";
+
     /**
      * 阿里支付成功
      */

+ 2 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayPlatformEnum.java

@@ -14,7 +14,8 @@ import lombok.Getter;
 public enum PayPlatformEnum {
 
     ALIPAY("alipay", "支付宝"),
-    WX("wx", "微信");
+    WX("wx", "微信"),
+    YUEPAY("yuepay", "余额支付");
 
     //状态码
     private final String type;

+ 5 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/factory/PaymentFactory.java

@@ -5,6 +5,7 @@ import com.kxs.common.pay.enums.PayPlatformEnum;
 import com.kxs.common.pay.service.PayService;
 import com.kxs.common.pay.service.ali.AliPayService;
 import com.kxs.common.pay.service.wechat.WxPayService;
+import com.kxs.common.pay.service.yue.YuePayService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
@@ -22,11 +23,15 @@ public class PaymentFactory {
 
     private final WxPayService wxPayService;
 
+    private final YuePayService yuePayService;
+
     public PayService getPayService(String payMethod) {
         if (payMethod.equalsIgnoreCase(PayPlatformEnum.ALIPAY.getType())) {
             return aliPayService;
         } else if (payMethod.equalsIgnoreCase(PayPlatformEnum.WX.getType())) {
             return wxPayService;
+        } else if (payMethod.equalsIgnoreCase(PayPlatformEnum.YUEPAY.getType())) {
+            return yuePayService;
         } else {
             throw new GlobalCustomerException("Invalid payment method");
         }

+ 1 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/PayResponse.java

@@ -20,7 +20,7 @@ public class PayResponse {
     private PayPlatformEnum payPlatformEnum;
 
     /**
-     * 支付签名返回结果
+     * 支付返回结果
      */
     private String result;
 }

+ 29 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/YuePayMessage.java

@@ -0,0 +1,29 @@
+package com.kxs.common.pay.model;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 余额同步回调消息
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class YuePayMessage extends PayMessage {
+
+
+    /**
+     * 交易编号
+     */
+    private String tradeNo;
+
+    /**
+     * 交易订单号
+     */
+    private String outTradeNo;
+
+}

+ 20 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/PayService.java

@@ -1,6 +1,8 @@
 package com.kxs.common.pay.service;
 
+import cn.hutool.extra.spring.SpringUtil;
 import com.alipay.api.AlipayApiException;
+import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.pay.enums.PayPlatformEnum;
 import com.kxs.common.pay.handlers.PayMessageHandler;
 import com.kxs.common.pay.model.PayRequest;
@@ -8,6 +10,11 @@ import com.kxs.common.pay.model.PayResponse;
 import com.kxs.common.pay.model.QueryRequest;
 import com.kxs.common.pay.model.QueryResponse;
 import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.core.Ordered;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.Optional;
 
 /**
  * 支付公共接口服务
@@ -35,5 +42,17 @@ public interface PayService {
     /**
      * 获取支付回调handler
      */
-    public PayMessageHandler getPayMessageHandler(PayPlatformEnum payPlatformEnum);
+    default PayMessageHandler getPayMessageHandler(PayPlatformEnum payPlatformEnum){
+        Map<String, PayMessageHandler> payMessageHandlerMap = SpringUtil
+                .getBeansOfType(PayMessageHandler.class);
+        Optional<PayMessageHandler> optional = payMessageHandlerMap.values()
+                .stream()
+                .filter(service -> service.support(payPlatformEnum))
+                .max(Comparator.comparingInt(Ordered::getOrder));
+
+        if (optional.isEmpty()) {
+            throw new GlobalCustomerException("DefaultPayMessageHandler error , not register");
+        }
+        return optional.get();
+    }
 }

+ 0 - 15
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java

@@ -120,21 +120,6 @@ public class AliPayService implements PayService {
     }
 
 
-    @Override
-    public PayMessageHandler getPayMessageHandler(PayPlatformEnum payPlatformEnum) {
-        Map<String, PayMessageHandler> payMessageHandlerMap = SpringUtil
-                .getBeansOfType(PayMessageHandler.class);
-        Optional<PayMessageHandler> optional = payMessageHandlerMap.values()
-                .stream()
-                .filter(service -> service.support(payPlatformEnum))
-                .max(Comparator.comparingInt(Ordered::getOrder));
-
-        if (optional.isEmpty()) {
-            throw new GlobalCustomerException("DefaultPayMessageHandler error , not register");
-        }
-        return optional.get();
-    }
-
     /**
      * 获取通知参数
      *

+ 0 - 4
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/wechat/WxPayService.java

@@ -41,8 +41,4 @@ public class WxPayService implements PayService {
         return null;
     }
 
-    @Override
-    public PayMessageHandler getPayMessageHandler(PayPlatformEnum payPlatformEnum) {
-        return null;
-    }
 }

+ 64 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/yue/YuePayService.java

@@ -0,0 +1,64 @@
+package com.kxs.common.pay.service.yue;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.kxs.common.core.constant.enums.ErrorTypeEnum;
+import com.kxs.common.core.exception.GlobalCustomerException;
+import com.kxs.common.core.util.R;
+import com.kxs.common.core.util.RetOps;
+import com.kxs.common.pay.config.WechatAccountConfig;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.handlers.PayMessageHandler;
+import com.kxs.common.pay.model.*;
+import com.kxs.common.pay.service.PayService;
+import com.kxs.user.api.feign.RemoteKxsUserService;
+import com.kxs.user.api.feign.RemoteYuePayService;
+import com.kxs.user.api.model.KxsUser;
+import com.lly835.bestpay.config.WxPayConfig;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import org.springframework.core.Ordered;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 余额支付 服务
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-24
+ */
+@RequiredArgsConstructor
+public class YuePayService implements PayService {
+
+    private final RemoteYuePayService remoteYuePayService;
+
+    @Override
+    public PayResponse appPay(PayRequest payReq) {
+
+        R<PayMessage> result = remoteYuePayService.yuePay(payReq);
+        if(result.getStatus() != 1){
+            throw new GlobalCustomerException(result.getMsg());
+        }
+        PayMessage payMessage = RetOps.of(result)
+                .getData()
+                .orElseThrow(() -> new GlobalCustomerException("yue pay is empty"));
+
+        return PayResponse.builder()
+                .payPlatformEnum(PayPlatformEnum.YUEPAY)
+                .result(JSON.toJSONString(payMessage))
+                .build();
+    }
+
+    @Override
+    public QueryResponse query(QueryRequest queryReq) {
+        return null;
+    }
+
+    @Override
+    public String payBack(HttpServletRequest request) {
+        return null;
+    }
+
+}

+ 33 - 20
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.kxs.product.biz.service.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.alipay.api.AlipayApiException;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,24 +10,25 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
+import com.kxs.common.pay.enums.PayConstants;
 import com.kxs.common.pay.enums.PayPlatformEnum;
 import com.kxs.common.pay.factory.PaymentFactory;
 import com.kxs.common.pay.model.PayRequest;
 import com.kxs.common.pay.model.PayResponse;
-import com.kxs.common.pay.service.PayService;
 import com.kxs.common.security.util.SecurityUtils;
+import com.kxs.product.api.dto.kxsapp.shop.GoodsSubmitDTO;
 import com.kxs.product.api.model.KxsShopGoods;
+import com.kxs.product.api.model.KxsShopOrder;
 import com.kxs.product.api.model.KxsShopOrderInfo;
-import com.kxs.product.api.dto.kxsapp.shop.GoodsSubmitDTO;
 import com.kxs.product.api.vo.kxsapp.shop.*;
 import com.kxs.product.biz.constant.enums.KxsShopEnum;
 import com.kxs.product.biz.constant.enums.ProductErrorTypeEnum;
 import com.kxs.product.biz.mapper.KxsShopGoodsMapper;
 import com.kxs.product.biz.mapper.KxsShopOrderInfoMapper;
 import com.kxs.product.biz.mapper.KxsShopOrderMapper;
-import com.kxs.product.api.model.KxsShopOrder;
 import com.kxs.product.biz.service.KxsShopOrderService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -116,7 +118,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @GlobalTransactional(rollbackFor = Exception.class)
     public R payOrder(KxsShopOrder param) {
 
         if(param.getId() == null){
@@ -130,28 +132,48 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
             return R.failed(ProductErrorTypeEnum.ORDER_EMPTY.getDescription());
         }
         List<KxsShopOrderInfo> kxsShopOrderInfos = orderInfoMapper.selectList(Wrappers.<KxsShopOrderInfo>lambdaQuery().eq(KxsShopOrderInfo::getOrderId, order.getId()));
+        String subject = kxsShopOrderInfos.stream().map(KxsShopOrderInfo::getGoodsName).collect(Collectors.joining(","));
 
-        //修改订单内容
-        this.update(Wrappers.<KxsShopOrder>lambdaUpdate().eq(KxsShopOrder::getId, param.getId())
-                .set(KxsShopOrder::getPayType, param.getPayType())
+        LambdaUpdateWrapper<KxsShopOrder> lambdaUpdateWrapper = Wrappers.<KxsShopOrder>lambdaUpdate().eq(KxsShopOrder::getId, param.getId());
+        lambdaUpdateWrapper.set(KxsShopOrder::getPayType, param.getPayType())
                 .set(KxsShopOrder::getGetMode, param.getGetMode())
-                .set(KxsShopOrder::getRemark, param.getRemark()));
+                .set(KxsShopOrder::getRemark, param.getRemark());
 
         //余额支付
         if(param.getPayType().equals(KxsShopEnum.YUE_PAY.getType())){
-            return this.yuePay(order);
+            PayRequest payReq = new PayRequest();
+            payReq.setPayTypeEnum(PayPlatformEnum.ALIPAY);
+            payReq.setOutTradeNo(order.getOrderSn());
+            payReq.setSubject(subject);
+            payReq.setTotalAmount(param.getPayPrice().doubleValue());
+            try {
+                PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.YUEPAY.getType()).appPay(payReq);
+                if (PayConstants.YUE_PAY_SUCCESS.equals(payResponse.getResult())) {
+                    //支付成功
+                    lambdaUpdateWrapper.set(KxsShopOrder::getStatus, KxsShopEnum.ORDER_NO_SEND.getType());
+
+
+
+                }else{
+                    return R.failed(payResponse.getResult());
+                }
+            } catch (AlipayApiException e) {
+                throw new GlobalCustomerException("余额支付异常");
+            }
         }
+        //修改订单信息
+        this.update(lambdaUpdateWrapper);
 
         //支付宝支付
         if(param.getPayType().equals(KxsShopEnum.ALI_PAY.getType())){
-            String subject = kxsShopOrderInfos.stream().map(KxsShopOrderInfo::getGoodsName).collect(Collectors.joining(","));
             return this.aliPay(order, subject);
         }
 
-
         return R.failed("未知的支付方式!");
     }
 
+
+
     @Override
     public R cancelOrder(KxsShopOrder param) {
 
@@ -223,15 +245,6 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
 
     }
 
-    /**
-     * 余额支付
-     *
-     * @param param 参数
-     * @return {@link R}
-     */
-    private R yuePay(KxsShopOrder param){
-        return R.ok();
-    }
 
     /**
      * 支付宝支付

+ 5 - 0
kxs-user/kxs-user-api/pom.xml

@@ -50,5 +50,10 @@
             <groupId>com.kxs</groupId>
             <artifactId>kxs-common-seata</artifactId>
         </dependency>
+        <!-- seata -->
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-pay</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 0 - 2
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/RemoteKxsUserService.java

@@ -3,7 +3,6 @@ package com.kxs.user.api.feign;
 
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.util.R;
-import com.kxs.user.api.dto.kxsapp.user.RealUserDTO;
 import com.kxs.user.api.model.KxsLeader;
 import com.kxs.user.api.model.KxsUser;
 import com.kxs.user.api.model.KxsUserAdvance;
@@ -148,5 +147,4 @@ public interface RemoteKxsUserService {
 	@GetExchange("/leader/getDateBetweenLeaders")
 	R<List<KxsLeader>> getDateBetweenLeaders(@RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime, @RequestHeader(SecurityConstants.FROM) String from);
 
-
 }

+ 21 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/RemoteYuePayService.java

@@ -0,0 +1,21 @@
+
+package com.kxs.user.api.feign;
+
+import com.kxs.common.core.util.R;
+import com.kxs.common.pay.model.PayMessage;
+import com.kxs.common.pay.model.PayRequest;
+import com.kxs.common.pay.model.PayResponse;
+import org.springframework.web.service.annotation.PostExchange;
+
+/**
+ * @author Lxq
+ * @date 2023/6/22
+ */
+public interface RemoteYuePayService {
+
+	/**
+	 * 余额支付
+	 */
+	@PostExchange("/userAccount/yuePay")
+	R<PayMessage> yuePay(PayRequest payReq);
+}

+ 12 - 0
kxs-user/kxs-user-api/src/main/java/com/kxs/user/api/feign/config/KxsUserFeignClientConfiguration.java

@@ -3,6 +3,7 @@ package com.kxs.user.api.feign.config;
 import cn.hutool.core.text.CharSequenceUtil;
 import com.kxs.common.core.constant.ServiceNameConstants;
 import com.kxs.user.api.feign.RemoteKxsUserService;
+import com.kxs.user.api.feign.RemoteYuePayService;
 import io.seata.core.context.RootContext;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
@@ -81,4 +82,15 @@ public class KxsUserFeignClientConfiguration {
 		return factory.createClient(RemoteKxsUserService.class);
 	}
 
+	/**
+	 * 余额支付
+	 * @param client 客户端
+	 * @return 余额支付服务
+	 */
+	@Bean
+	RemoteYuePayService remoteYuePayService(@Qualifier("kxsUserFeignClient") WebClient client) {
+		HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
+		return factory.createClient(RemoteYuePayService.class);
+	}
+
 }