mac пре 2 година
родитељ
комит
61bb617df1
18 измењених фајлова са 539 додато и 14 уклоњено
  1. 4 0
      kxs-common/kxs-common-pay/pom.xml
  2. 5 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/AliPayAccountConfig.java
  3. 3 2
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/PayConfig.java
  4. 20 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/enums/PayConstants.java
  5. 1 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/factory/PaymentFactory.java
  6. 34 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/DefaultPayMessageHandler.java
  7. 37 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/PayEventHandlers.java
  8. 28 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/PayMessageHandler.java
  9. 136 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/AliPayMessage.java
  10. 40 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/PayMessage.java
  11. 7 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/PayResponse.java
  12. 2 0
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/QueryResponse.java
  13. 16 2
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/PayService.java
  14. 125 7
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java
  15. 14 1
      kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/wechat/WxPayService.java
  16. 4 0
      kxs-product/kxs-product-biz/pom.xml
  17. 43 0
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/handlers/AliPayMessageHandler.java
  18. 20 1
      kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/service/impl/KxsShopOrderServiceImpl.java

+ 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>cn.hutool</groupId>
+            <artifactId>hutool-extra</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.alipay.sdk</groupId>
             <artifactId>alipay-sdk-java</artifactId>

+ 5 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/AliPayAccountConfig.java

@@ -40,4 +40,9 @@ public class AliPayAccountConfig {
      * 是否使用沙箱
      */
     private Boolean sandbox;
+
+    /**
+     * 签名类型
+     */
+    private String signType = "RSA2";
 }

+ 3 - 2
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/config/PayConfig.java

@@ -48,14 +48,15 @@ public class PayConfig {
         AlipayConfig aliPayConfig = new AlipayConfig();
         aliPayConfig.setAppId(aliPayAccountConfig.getAppId());
         aliPayConfig.setPrivateKey(aliPayAccountConfig.getPrivateKey());
+        aliPayConfig.setSignType(aliPayAccountConfig.getSignType());
         aliPayConfig.setAlipayPublicKey(aliPayAccountConfig.getAliPayPublicKey());
         return new DefaultAlipayClient(aliPayConfig);
     }
 
 
     @Bean
-    public PayService payService(AlipayClient alipayClient) {
+    public PayService payService(AlipayClient alipayClient, AliPayAccountConfig aliPayAccountConfig) {
 
-        return new AliPayService(alipayClient);
+        return new AliPayService(alipayClient, aliPayAccountConfig);
     }
 }

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

@@ -0,0 +1,20 @@
+package com.kxs.common.pay.enums;
+
+/**
+ * 支付常量
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+public interface PayConstants {
+
+    /**
+     * 阿里支付成功
+     */
+    String ALI_PAY_SUCCESS = "success";
+    /**
+     * 阿里支付失败
+     */
+    String ALI_PAY_FAIL = "fail";
+
+}

+ 1 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/PaymentFactory.java → kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/factory/PaymentFactory.java

@@ -1,4 +1,4 @@
-package com.kxs.common.pay.handlers;
+package com.kxs.common.pay.factory;
 
 import com.kxs.common.core.exception.GlobalCustomerException;
 import com.kxs.common.pay.enums.PayPlatformEnum;

+ 34 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/DefaultPayMessageHandler.java

@@ -0,0 +1,34 @@
+package com.kxs.common.pay.handlers;
+
+import com.alibaba.fastjson.JSON;
+import com.kxs.common.pay.enums.PayConstants;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.model.PayMessage;
+import com.kxs.common.pay.service.PayService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+/**
+ * 默认支付回调处理程序
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+@Slf4j
+public class DefaultPayMessageHandler implements PayMessageHandler<PayMessage, PayService> {
+
+    public DefaultPayMessageHandler() {
+    }
+
+    public String handle(PayMessage payMessage, PayService payService) {
+        log.info("回调支付消息处理器,回调消息:" + JSON.toJSONString(payMessage.getPayMessage()));
+
+        return PayConstants.ALI_PAY_SUCCESS;
+    }
+
+    @Override
+    public int getOrder() {
+        return Integer.MIN_VALUE;
+    }
+}

+ 37 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/PayEventHandlers.java

@@ -0,0 +1,37 @@
+package com.kxs.common.pay.handlers;
+
+import com.alipay.api.AlipayApiException;
+import com.kxs.common.pay.factory.PaymentFactory;
+import com.kxs.common.pay.service.PayService;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 支付事件处理程序
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+@RestController
+@RequestMapping("/pay")
+@RequiredArgsConstructor
+public class PayEventHandlers {
+
+    private final PaymentFactory paymentFactory;
+
+
+    @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 {
+            return payService.payBack(request);
+        } catch (AlipayApiException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}

+ 28 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/handlers/PayMessageHandler.java

@@ -0,0 +1,28 @@
+package com.kxs.common.pay.handlers;
+
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.model.PayMessage;
+import com.kxs.common.pay.service.PayService;
+import org.springframework.core.Ordered;
+
+import java.util.Map;
+
+/**
+ * 支付消息处理程序
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+public interface PayMessageHandler<M extends PayMessage, S extends PayService>  extends Ordered {
+
+    String handle(M var1, S var2);
+
+    /**
+     * 是否支持此支付平台
+     *
+     * @return boolean
+     */
+    default boolean support(PayPlatformEnum payPlatformEnum) {
+        return true;
+    }
+}

+ 136 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/AliPayMessage.java

@@ -0,0 +1,136 @@
+package com.kxs.common.pay.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 支付宝回调消息
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+public class AliPayMessage extends PayMessage {
+    @JSONField(
+            name = "notify_time"
+    )
+    private Date notifyTime;
+    @JSONField(
+            name = "notify_type"
+    )
+    private String notifyType;
+    @JSONField(
+            name = "notify_id"
+    )
+    private String notifyId;
+    @JSONField(
+            name = "app_id"
+    )
+    private String appId;
+    private String charset;
+    private String version;
+    @JSONField(
+            name = "sign_type"
+    )
+    private String signType;
+    private String sign;
+    @JSONField(
+            name = "trade_no"
+    )
+    private String tradeNo;
+    @JSONField(
+            name = "out_trade_no"
+    )
+    private String outTradeNo;
+    @JSONField(
+            name = "out_biz_no"
+    )
+    private String outBizNo;
+    @JSONField(
+            name = "buyer_id"
+    )
+    private String buyerId;
+    @JSONField(
+            name = "buyer_logon_id"
+    )
+    private String buyerLogonId;
+    @JSONField(
+            name = "seller_id"
+    )
+    private String sellerId;
+    @JSONField(
+            name = "seller_email"
+    )
+    private String sellerEmail;
+    @JSONField(
+            name = "trade_status"
+    )
+    private String tradeStatus;
+    @JSONField(
+            name = "total_amount"
+    )
+    private BigDecimal totalAmount;
+    @JSONField(
+            name = "receipt_amount"
+    )
+    private BigDecimal receiptAmount;
+    @JSONField(
+            name = "invoice_amount"
+    )
+    private BigDecimal invoiceAmount;
+    @JSONField(
+            name = "buyer_pay_amount"
+    )
+    private BigDecimal buyerPayAmount;
+    @JSONField(
+            name = "point_amount"
+    )
+    private BigDecimal pointAmount;
+    @JSONField(
+            name = "refund_fee"
+    )
+    private BigDecimal refundFee;
+    @JSONField(
+            name = "subject"
+    )
+    private String subject;
+    @JSONField(
+            name = "body"
+    )
+    private String body;
+    @JSONField(
+            name = "gmt_create"
+    )
+    private Date gmtCreate;
+    @JSONField(
+            name = "gmt_payment"
+    )
+    private Date gmtPayment;
+    @JSONField(
+            name = "gmt_refund"
+    )
+    private Date gmtRefund;
+    @JSONField(
+            name = "gmt_close"
+    )
+    private Date gmtClose;
+    @JSONField(
+            name = "fund_bill_list"
+    )
+    private String fundBillList;
+    @JSONField(
+            name = "passback_params"
+    )
+    private String passbackParams;
+    @JSONField(
+            name = "voucher_detail_list"
+    )
+    private String voucherDetailList;
+}

+ 40 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/PayMessage.java

@@ -0,0 +1,40 @@
+package com.kxs.common.pay.model;
+
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 支付回调公共
+ *
+ * @author 没秃顶的码农
+ * @date 2024-04-28
+ */
+@Data
+public class PayMessage implements Serializable {
+
+    private Map<String, String> payMessage = null;
+
+    /**
+     * 交易渠道类型
+     */
+    private PayPlatformEnum payType;
+
+    /**
+     * 交易类型(自定义)
+     */
+    private String tradeType;
+
+    /**
+     * 来源订单
+     */
+    private String fromPay;
+
+    /**
+     * 备注
+     */
+    private String describe;
+}

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

@@ -1,6 +1,7 @@
 package com.kxs.common.pay.model;
 
 import com.kxs.common.pay.enums.PayPlatformEnum;
+import lombok.Builder;
 import lombok.Data;
 
 /**
@@ -10,10 +11,16 @@ import lombok.Data;
  * @date 2024-04-24
  */
 @Data
+@Builder
 public class PayResponse {
 
     /**
      * 支付平台枚举
      */
     private PayPlatformEnum payPlatformEnum;
+
+    /**
+     * 支付签名返回结果
+     */
+    private String result;
 }

+ 2 - 0
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/model/QueryResponse.java

@@ -2,6 +2,7 @@ package com.kxs.common.pay.model;
 
 import com.kxs.common.pay.enums.PayPlatformEnum;
 import com.kxs.common.pay.enums.PayStatusCommEnum;
+import lombok.Builder;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -13,6 +14,7 @@ import java.math.BigDecimal;
  * @date 2024-04-24
  */
 @Data
+@Builder
 public class QueryResponse {
 
     /**

+ 16 - 2
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/PayService.java

@@ -1,9 +1,13 @@
 package com.kxs.common.pay.service;
 
+import com.alipay.api.AlipayApiException;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.handlers.PayMessageHandler;
 import com.kxs.common.pay.model.PayRequest;
 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;
 
 /**
  * 支付公共接口服务
@@ -16,10 +20,20 @@ public interface PayService {
     /**
      * 支付
      */
-    PayResponse pay(PayRequest payReq);
+    PayResponse appPay(PayRequest payReq) throws AlipayApiException;
 
     /**
      * 查询
      */
-    QueryResponse query(QueryRequest queryReq);
+    QueryResponse query(QueryRequest queryReq) throws AlipayApiException;
+
+    /**
+     * 回调
+     */
+    String payBack(HttpServletRequest request) throws AlipayApiException;
+
+    /**
+     * 获取支付回调handler
+     */
+    public PayMessageHandler getPayMessageHandler(PayPlatformEnum payPlatformEnum);
 }

+ 125 - 7
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/ali/AliPayService.java

@@ -1,13 +1,34 @@
 package com.kxs.common.pay.service.ali;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ClassUtil;
+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;
-import com.kxs.common.pay.model.PayRequest;
-import com.kxs.common.pay.model.PayResponse;
-import com.kxs.common.pay.model.QueryRequest;
-import com.kxs.common.pay.model.QueryResponse;
+import com.alipay.api.domain.AlipayTradeQueryModel;
+import com.alipay.api.internal.util.AlipaySignature;
+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;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.enums.PayStatusCommEnum;
+import com.kxs.common.pay.handlers.PayMessageHandler;
+import com.kxs.common.pay.model.*;
 import com.kxs.common.pay.service.PayService;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.Ordered;
+import org.springframework.security.authentication.InternalAuthenticationServiceException;
+
+import java.util.*;
 
 /**
  * 支付宝支付服务
@@ -16,17 +37,114 @@ import org.springframework.stereotype.Service;
  * @date 2024-04-24
  */
 @RequiredArgsConstructor
+@Slf4j
 public class AliPayService implements PayService {
 
     private final AlipayClient alipayClient;
 
+    private final AliPayAccountConfig aliPayAccountConfig;
+
     @Override
-    public PayResponse pay(PayRequest payReq) {
+    public PayResponse appPay(PayRequest payReq) throws AlipayApiException {
+
+        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
+        //回掉地址
+        request.setNotifyUrl(aliPayAccountConfig.getNotifyUrl());
+        JSONObject bizContent = new JSONObject();
+        //支付信息
+        bizContent.put("out_trade_no", payReq.getOutTradeNo());
+        bizContent.put("total_amount", payReq.getTotalAmount());
+        bizContent.put("subject", payReq.getSubject());
+        bizContent.put("product_code", "QUICK_MSECURITY_PAY");
+        //商品信息
+        bizContent.put("goods_detail", payReq.getGoodsDetail());
+        request.setBizContent(bizContent.toString());
+        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+        String orderStr = response.getBody();
+        if(response.isSuccess()){
+            return PayResponse.builder()
+                    .result(orderStr)
+                    .payPlatformEnum(PayPlatformEnum.ALIPAY).build();
+        }
         return null;
     }
 
     @Override
-    public QueryResponse query(QueryRequest queryReq) {
+    public QueryResponse query(QueryRequest queryReq) throws AlipayApiException {
+        // 构造请求参数以调用接口
+        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
+        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
+
+        // 设置订单支付时传入的商户订单号
+        model.setOutTradeNo(queryReq.getOutTradeNo());
+
+        request.setBizModel(model);
+        AlipayTradeQueryResponse response = alipayClient.execute(request);
+        if (response.isSuccess()) {
+            return QueryResponse.builder()
+                    .outTradeNo(response.getOutTradeNo())
+                    .tradeNo(response.getTradeNo())
+                    .buyerLogonId(response.getBuyerLogonId())
+                    .tradeStatus(PayStatusCommEnum.valueOf(response.getTradeStatus()))
+                    .payPlatformEnum(PayPlatformEnum.ALIPAY).build();
+        }
         return null;
     }
+
+
+    @Override
+    public String payBack(HttpServletRequest request) throws AlipayApiException {
+
+        Map<String, String> noticeParams = getNoticeParams(request);
+
+        boolean signVerified = AlipaySignature.rsaCheckV2(noticeParams, aliPayAccountConfig.getAliPayPublicKey(), "UTF-8", aliPayAccountConfig.getSignType());
+        if (!signVerified) {
+            log.info("alipay notifies that signature verification failed");
+            return PayConstants.ALI_PAY_FAIL;
+        }
+        AliPayMessage aliPayMessage = BeanUtil.toBean(noticeParams, AliPayMessage.class);
+        aliPayMessage.setPayMessage(noticeParams);
+        aliPayMessage.setPayType(PayPlatformEnum.ALIPAY);
+        PayMessageHandler payMessageHandler = getPayMessageHandler(PayPlatformEnum.ALIPAY);
+        return payMessageHandler.handle(aliPayMessage, this);
+    }
+
+
+    @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();
+    }
+
+    /**
+     * 获取通知参数
+     *
+     * @param request 请求
+     * @return {@link Map}< {@link String} , {@link String}>
+     */
+    public Map< String , String> getNoticeParams(HttpServletRequest request) {
+        Map< String , String > params = new HashMap<>();
+        Map<String, String[]> requestParams = request.getParameterMap();
+        for (String name : requestParams.keySet()) {
+            String[] values = requestParams.get(name);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
+            }
+            //乱码解决,这段代码在出现乱码时使用。
+            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
+            params.put(name, valueStr);
+        }
+        return params;
+    }
+
 }

+ 14 - 1
kxs-common/kxs-common-pay/src/main/java/com/kxs/common/pay/service/wechat/WxPayService.java

@@ -1,10 +1,13 @@
 package com.kxs.common.pay.service.wechat;
 
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.handlers.PayMessageHandler;
 import com.kxs.common.pay.model.PayRequest;
 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 jakarta.servlet.http.HttpServletRequest;
 
 /**
  * 微信支付 服务
@@ -14,7 +17,7 @@ import com.kxs.common.pay.service.PayService;
  */
 public class WxPayService implements PayService {
     @Override
-    public PayResponse pay(PayRequest payReq) {
+    public PayResponse appPay(PayRequest payReq) {
         return null;
     }
 
@@ -22,4 +25,14 @@ public class WxPayService implements PayService {
     public QueryResponse query(QueryRequest queryReq) {
         return null;
     }
+
+    @Override
+    public String payBack(HttpServletRequest request) {
+        return null;
+    }
+
+    @Override
+    public PayMessageHandler getPayMessageHandler(PayPlatformEnum payPlatformEnum) {
+        return null;
+    }
 }

+ 4 - 0
kxs-product/kxs-product-biz/pom.xml

@@ -83,6 +83,10 @@
             <groupId>com.kxs</groupId>
             <artifactId>kxs-common-idempotent</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.kxs</groupId>
+            <artifactId>kxs-common-pay</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 43 - 0
kxs-product/kxs-product-biz/src/main/java/com/kxs/product/biz/handlers/AliPayMessageHandler.java

@@ -0,0 +1,43 @@
+package com.kxs.product.biz.handlers;
+
+import com.kxs.common.pay.enums.PayConstants;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+import com.kxs.common.pay.handlers.PayMessageHandler;
+import com.kxs.common.pay.model.AliPayMessage;
+import com.kxs.common.pay.service.ali.AliPayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * 支付宝支付回调处理器
+ * @author mac
+ */
+@Component
+@Slf4j
+public class AliPayMessageHandler implements PayMessageHandler<AliPayMessage, AliPayService> {
+
+
+    /**
+     * 处理支付回调消息的处理器接口
+     *
+     * @param payMessage 支付消息
+     * @param payService 支付服务
+     * @return xml, text格式的消息,如果在异步规则里处理的话,可以返回null
+     */
+    @Override
+    public String handle(AliPayMessage payMessage, AliPayService payService) {
+
+        log.info("支付宝支付回调消息处理,订单号:{}", payMessage.getOutTradeNo());
+        return PayConstants.ALI_PAY_SUCCESS;
+    }
+
+    @Override
+    public boolean support(PayPlatformEnum payPlatformEnum) {
+        return PayPlatformEnum.ALIPAY.equals(payPlatformEnum);
+    }
+
+    @Override
+    public int getOrder() {
+        return Integer.MIN_VALUE + 1;
+    }
+}

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

@@ -2,11 +2,17 @@ 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.exception.GlobalCustomerException;
 import com.kxs.common.core.util.R;
+import com.kxs.common.pay.enums.PayPlatformEnum;
+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.model.KxsShopGoods;
 import com.kxs.product.api.model.KxsShopOrderInfo;
@@ -43,6 +49,8 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
 
     private final RemoteKxsUserService remoteKxsUserService;
 
+    private final PayService payService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R submitOrder(GoodsSubmitDTO param) {
@@ -211,7 +219,18 @@ public class KxsShopOrderServiceImpl extends ServiceImpl<KxsShopOrderMapper, Kxs
      * @return {@link R}
      */
     private R aliPay(KxsShopOrder param){
-        return R.ok();
+
+        try {
+            PayRequest payReq = new PayRequest();
+            payReq.setPayTypeEnum(PayPlatformEnum.ALIPAY);
+            payReq.setOutTradeNo(param.getOrderSn());
+            payReq.setSubject(param.getRemark());
+            payReq.setTotalAmount(param.getPayPrice().doubleValue());
+            PayResponse payResponse = payService.appPay(payReq);
+            return R.ok(payResponse);
+        } catch (AlipayApiException e) {
+            throw new GlobalCustomerException(e.getMessage());
+        }
     }