Bladeren bron

支付宝支付已调起支付

mac 2 jaren geleden
bovenliggende
commit
b335a1e8d3

+ 5 - 0
kxs-common/kxs-common-core/src/main/java/com/kxs/common/core/constant/CommonConstants.java

@@ -91,6 +91,11 @@ public interface CommonConstants {
 	 */
 	String KXS_WITHDRAWAL_PREFIX = "BC";
 
+	/**
+	 * KXS提现订单号前缀
+	 */
+	String KXS_SHOP_PREFIX = "BM";
+
 	/**
 	 * KXS提现订单号前缀
 	 */

+ 36 - 14
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/PayConfig.java → kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/PayConfiguration.java

@@ -4,13 +4,13 @@ import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.AlipayConfig;
 import com.alipay.api.DefaultAlipayClient;
-import com.kxs.common.pay.service.PayService;
+import com.kxs.common.pay.factory.PaymentFactory;
+import com.kxs.common.pay.handlers.PayEventHandlers;
 import com.kxs.common.pay.service.ali.AliPayService;
-import com.lly835.bestpay.config.AliPayConfig;
+import com.kxs.common.pay.service.wechat.WxPayService;
 import com.lly835.bestpay.config.WxPayConfig;
-import com.lly835.bestpay.service.impl.BestPayServiceImpl;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -24,22 +24,22 @@ import org.springframework.context.annotation.Configuration;
 @Configuration(proxyBeanMethods = false)
 @EnableConfigurationProperties({AliPayAccountConfig.class, WechatAccountConfig.class})
 @AllArgsConstructor
-public class PayConfig {
+public class PayConfiguration {
 
-    private final WechatAccountConfig accountConfig;
+    private final WechatAccountConfig wechatAccountConfig;
 
     private final AliPayAccountConfig aliPayAccountConfig;
 
     @Bean
     public WxPayConfig wxPayConfig() {
         WxPayConfig wxPayConfig = new WxPayConfig();
-        wxPayConfig.setAppId(accountConfig.getMpAppId());
-        wxPayConfig.setMiniAppId(accountConfig.getMiniAppId());
-        wxPayConfig.setMchId(accountConfig.getMchId());
-        wxPayConfig.setMchKey(accountConfig.getMchKey());
-        wxPayConfig.setKeyPath(accountConfig.getKeyPath());
-        wxPayConfig.setNotifyUrl(accountConfig.getNotifyUrl());
-        wxPayConfig.setAppAppId(accountConfig.getAppAppId());
+        wxPayConfig.setAppId(wechatAccountConfig.getMpAppId());
+        wxPayConfig.setMiniAppId(wechatAccountConfig.getMiniAppId());
+        wxPayConfig.setMchId(wechatAccountConfig.getMchId());
+        wxPayConfig.setMchKey(wechatAccountConfig.getMchKey());
+        wxPayConfig.setKeyPath(wechatAccountConfig.getKeyPath());
+        wxPayConfig.setNotifyUrl(wechatAccountConfig.getNotifyUrl());
+        wxPayConfig.setAppAppId(wechatAccountConfig.getAppAppId());
         return wxPayConfig;
     }
 
@@ -55,8 +55,30 @@ public class PayConfig {
 
 
     @Bean
-    public PayService payService(AlipayClient alipayClient, AliPayAccountConfig aliPayAccountConfig) {
+    @ConditionalOnMissingBean
+    public AliPayService aliPayService(AlipayClient alipayClient) {
 
         return new AliPayService(alipayClient, aliPayAccountConfig);
     }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxPayService wxPayService(WxPayConfig wxPayConfig) {
+
+        return new WxPayService(wxPayConfig, wechatAccountConfig);
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public PaymentFactory paymentFactory(AliPayService aliPayService, WxPayService wxPayService) {
+
+        return new PaymentFactory(aliPayService, wxPayService);
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    public PayEventHandlers payEventHandlers(PaymentFactory paymentFactory) {
+
+        return new PayEventHandlers(paymentFactory);
+    }
 }

+ 1 - 2
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/PayEventHandlers.java

@@ -25,9 +25,8 @@ public class PayEventHandlers {
 
     @RequestMapping(value = "payBack/{platform}")
     public String payBack(HttpServletRequest request, @PathVariable String platform) {
-        PayService payService = paymentFactory.getPayService(platform);
-        //业务处理在对应的PayMessageHandler里面处理,在哪里设置PayMessageHandler,详情查看com.egzosn.pay.common.api.PayService.setPayMessageHandler()
         try {
+            PayService payService = paymentFactory.getPayService(platform);
             return payService.payBack(request);
         } catch (AlipayApiException e) {
             throw new RuntimeException(e);

+ 5 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/PayRequest.java

@@ -36,4 +36,9 @@ public class PayRequest {
      * 订单包含的商品列表信息,json格式
      */
     private String goodsDetail;
+
+    /**
+     * 公用回传参数
+     */
+    private String passbackParams;
 }

+ 18 - 8
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java

@@ -1,9 +1,10 @@
 package com.kxs.common.pay.service.ali;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.ClassUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
@@ -13,7 +14,6 @@ import com.alipay.api.request.AlipayTradeAppPayRequest;
 import com.alipay.api.request.AlipayTradeQueryRequest;
 import com.alipay.api.response.AlipayTradeAppPayResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
-import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.pay.config.AliPayAccountConfig;
 import com.kxs.common.pay.enums.PayConstants;
@@ -26,9 +26,12 @@ import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.Ordered;
-import org.springframework.security.authentication.InternalAuthenticationServiceException;
 
-import java.util.*;
+import java.time.LocalDateTime;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
 
 /**
  * 支付宝支付服务
@@ -56,8 +59,15 @@ public class AliPayService implements PayService {
         bizContent.put("total_amount", payReq.getTotalAmount());
         bizContent.put("subject", payReq.getSubject());
         bizContent.put("product_code", "QUICK_MSECURITY_PAY");
+        bizContent.put("time_expire", LocalDateTimeUtil.format(LocalDateTime.now().plusMinutes(20), DatePattern.NORM_DATETIME_PATTERN));
         //商品信息
-        bizContent.put("goods_detail", payReq.getGoodsDetail());
+        if(StrUtil.isNotBlank(payReq.getGoodsDetail())){
+            bizContent.put("goods_detail", payReq.getPassbackParams());
+        }
+        //扩展参数
+        if(StrUtil.isNotBlank(payReq.getPassbackParams())){
+            bizContent.put("passback_params", payReq.getPassbackParams());
+        }
         request.setBizContent(bizContent.toString());
         AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
         String orderStr = response.getBody();
@@ -66,7 +76,7 @@ public class AliPayService implements PayService {
                     .result(orderStr)
                     .payPlatformEnum(PayPlatformEnum.ALIPAY).build();
         }
-        return null;
+        return PayResponse.builder().payPlatformEnum(PayPlatformEnum.ALIPAY).build();
     }
 
     @Override
@@ -99,7 +109,7 @@ public class AliPayService implements PayService {
 
         boolean signVerified = AlipaySignature.rsaCheckV2(noticeParams, aliPayAccountConfig.getAliPayPublicKey(), "UTF-8", aliPayAccountConfig.getSignType());
         if (!signVerified) {
-            log.info("alipay notifies that signature verification failed");
+            log.error("alipay notifies that signature verification failed");
             return PayConstants.ALI_PAY_FAIL;
         }
         AliPayMessage aliPayMessage = BeanUtil.toBean(noticeParams, AliPayMessage.class);

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

@@ -1,5 +1,6 @@
 package com.kxs.common.pay.service.wechat;
 
+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.PayRequest;
@@ -7,7 +8,9 @@ import com.kxs.common.pay.model.PayResponse;
 import com.kxs.common.pay.model.QueryRequest;
 import com.kxs.common.pay.model.QueryResponse;
 import com.kxs.common.pay.service.PayService;
+import com.lly835.bestpay.config.WxPayConfig;
 import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
 
 /**
  * 微信支付 服务
@@ -15,7 +18,14 @@ import jakarta.servlet.http.HttpServletRequest;
  * @author 没秃顶的码农
  * @date 2024-04-24
  */
+@RequiredArgsConstructor
 public class WxPayService implements PayService {
+
+    private final WxPayConfig wxPayConfig;
+
+    private final WechatAccountConfig wechatAccountConfig;
+
+
     @Override
     public PayResponse appPay(PayRequest payReq) {
         return null;

+ 1 - 1
kxs-common/kxs-common-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -1 +1 @@
-com.kxs.common.pay.config.PayConfig
+com.kxs.common.pay.config.PayConfiguration

+ 41 - 14
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java

@@ -1,15 +1,16 @@
 package com.kxs.product.biz.service.impl;
 
-import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.IdUtil;
 import com.alipay.api.AlipayApiException;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.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;
@@ -27,11 +28,14 @@ import com.kxs.product.api.model.KxsShopOrder;
 import com.kxs.product.biz.service.KxsShopOrderService;
 import com.kxs.user.api.feign.RemoteKxsUserService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * 商城订单表(KxsShopOrder)表服务实现类
@@ -41,6 +45,7 @@ import java.util.List;
  */
 @Service("kxsShopOrderService")
 @RequiredArgsConstructor
+@Slf4j
 public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, KxsShopOrder> implements KxsShopOrderService {
 
     private final KxsShopGoodsMapper goodsMapper;
@@ -49,7 +54,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
 
     private final RemoteKxsUserService remoteKxsUserService;
 
-    private final PayService payService;
+    private final PaymentFactory paymentFactory;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -58,20 +63,20 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
         Long userId = SecurityUtils.getUser().getId();
 
         //订单号
-        Snowflake snowflake = IdUtil.getSnowflake(1, userId);
-        long orderSn = snowflake.nextId();
+        String orderSn = CommonConstants.KXS_SHOP_PREFIX + IdUtil.getSnowflakeNextIdStr();
 
         KxsShopOrder order = new KxsShopOrder();
         //参数赋值
         BeanUtils.copyProperties(param, order);
         order.setUserId(userId);
-        order.setOrderSn(String.valueOf(orderSn));
+        order.setOrderSn(orderSn);
         //支付金额
         order.setPayPrice(order.getTotalPrice());
         baseMapper.insert(order);
 
         //查询商品
         KxsShopGoods goods = goodsMapper.selectById(param.getGoodsId());
+        Optional.ofNullable(goods).orElseThrow(() -> new GlobalCustomerException("商品不存在"));
         //订单详情
         KxsShopOrderInfo orderInfo = new KxsShopOrderInfo();
         orderInfo.setNumber(param.getNumber());
@@ -84,7 +89,7 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
         orderInfo.setOrderId(order.getId());
         orderInfoMapper.insert(orderInfo);
 
-        return R.ok(Boolean.TRUE);
+        return R.ok(order.getId());
 
     }
 
@@ -111,24 +116,40 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public R payOrder(KxsShopOrder param) {
 
+        if(param.getId() == null){
+            return R.failed(ProductErrorTypeEnum.ORDER_EMPTY.getDescription());
+        }
+        if(param.getPayType() == null){
+            return R.failed("请选择支付方式");
+        }
         KxsShopOrder order = baseMapper.selectById(param.getId());
         if(order == null){
             return R.failed(ProductErrorTypeEnum.ORDER_EMPTY.getDescription());
         }
+        List<KxsShopOrderInfo> kxsShopOrderInfos = orderInfoMapper.selectList(Wrappers.<KxsShopOrderInfo>lambdaQuery().eq(KxsShopOrderInfo::getOrderId, order.getId()));
+
+        //修改订单内容
+        this.update(Wrappers.<KxsShopOrder>lambdaUpdate().eq(KxsShopOrder::getId, param.getId())
+                .set(KxsShopOrder::getPayType, param.getPayType())
+                .set(KxsShopOrder::getGetMode, param.getGetMode())
+                .set(KxsShopOrder::getRemark, param.getRemark()));
 
         //余额支付
         if(param.getPayType().equals(KxsShopEnum.YUE_PAY.getType())){
-            return this.yuePay(param);
+            return this.yuePay(order);
         }
 
         //支付宝支付
         if(param.getPayType().equals(KxsShopEnum.ALI_PAY.getType())){
-            return this.aliPay(param);
+            String subject = kxsShopOrderInfos.stream().map(KxsShopOrderInfo::getGoodsName).collect(Collectors.joining(","));
+            return this.aliPay(order, subject);
         }
 
-        return R.failed();
+
+        return R.failed("未知的支付方式!");
     }
 
     @Override
@@ -215,21 +236,27 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
     /**
      * 支付宝支付
      *
-     * @param param 参数
+     * @param param   参数
+     * @param subject 订单标题。
      * @return {@link R}
      */
-    private R aliPay(KxsShopOrder param){
+    private R aliPay(KxsShopOrder param, String subject){
 
         try {
             PayRequest payReq = new PayRequest();
             payReq.setPayTypeEnum(PayPlatformEnum.ALIPAY);
             payReq.setOutTradeNo(param.getOrderSn());
-            payReq.setSubject(param.getRemark());
+            payReq.setSubject(subject);
             payReq.setTotalAmount(param.getPayPrice().doubleValue());
-            PayResponse payResponse = payService.appPay(payReq);
+            //扩展参数
+            payReq.setPassbackParams("shop_order");
+
+            PayResponse payResponse = paymentFactory.getPayService(PayPlatformEnum.ALIPAY.getType()).appPay(payReq);
+
             return R.ok(payResponse);
         } catch (AlipayApiException e) {
-            throw new GlobalCustomerException(e.getMessage());
+            log.error("支付宝支付异常:{}", param.getOrderSn(), e);
+            throw new GlobalCustomerException("支付宝参数异常");
         }
     }
 

+ 1 - 2
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsTicketTransferServiceImpl.java

@@ -62,8 +62,7 @@ public class KxsTicketTransferServiceImpl extends ServiceImpl<KxsTicketTransferM
         Integer userId = SecurityUtils.getUser().getId().intValue();
 
         //订单号
-        Snowflake snowflake = IdUtil.getSnowflake(1, userId);
-        String orderSn = "SC" + snowflake.nextId();
+        String orderSn = "SC" + IdUtil.getSnowflakeNextIdStr();
 
         //查询用户信息
         R<KxsUser> sendResult = remoteKxsUserService.loadUserById(userId, SecurityConstants.FROM_IN);