lyhzzz 4 months ago
parent
commit
3180fc68eb

+ 27 - 9
src/main/java/com/fdkankan/pay/controller/StripeController.java

@@ -6,10 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.pay.common.AutoPayUtil;
 import com.fdkankan.pay.common.ResultData;
 import com.fdkankan.pay.entity.*;
-import com.fdkankan.pay.service.IAutopayOrderService;
-import com.fdkankan.pay.service.IAutopayOrderSonService;
-import com.fdkankan.pay.service.IOrderService;
-import com.fdkankan.pay.service.IStripeWebhookLogService;
+import com.fdkankan.pay.service.*;
 import com.fdkankan.pay.util.CacheUtil;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
 import lombok.extern.slf4j.Slf4j;
@@ -46,9 +43,11 @@ public class StripeController {
     IAutopayOrderSonService autopayOrderSonService;
     @Autowired
     RabbitMqProducer rabbitMqProducer;
+    @Autowired
+    IStripeCustomerService stripeCustomerService;
 
     @PostMapping("/webhook")
-    public ResultData webhook(@RequestBody JSONObject webhookObj){
+    public synchronized ResultData webhook(@RequestBody JSONObject webhookObj){
         StripeWebhookLog stripeWebhookLog = new StripeWebhookLog();
         String type = webhookObj.getString("type");
         stripeWebhookLog.setEventType(type);
@@ -62,7 +61,10 @@ public class StripeController {
         String trade_no = null;
         String status = null;
         String orderId = null;
+        String customer = null;
+        String customer_email = null;
         AutopayOrder autopayOrder = null;
+        Order order = null;
         switch (type){
             case "checkout.session.completed"://支付完成
                 jsonObject = webhookObj.getJSONObject("data");
@@ -72,12 +74,21 @@ public class StripeController {
                 String mode = jsonObject1.getString("mode");
                 subscriptionId = jsonObject1.getString("subscription");
                 status = jsonObject1.getString("status");
+                customer = jsonObject1.getString("customer");
+                customer_email = jsonObject1.getString("customer_email");
                 JSONObject jsonObject2 = jsonObject1.getJSONObject("metadata");
                 orderId = jsonObject2.getString("orderId");
-                log.info("订单号为:id:{},trade_no:{},orderId:{}",id,trade_no,orderId);
-                Order order = orderService.getByOrderSn(orderId);
+
+                stripeCustomerService.saveByEmail(customer_email,customer);
+
+                log.info("订单号为:id:{},trade_no:{},orderId:{},subscriptionId:{}",id,trade_no,orderId,subscriptionId);
+                order = orderService.getByOrderSn(orderId);
                 if( order != null){
-                    orderService.payResult(order,true,trade_no,null);
+                    if("subscription".equals(mode)){
+                        orderService.payResult(order,true,subscriptionId,null);
+                    }else {
+                        orderService.payResult(order,true,trade_no,null);
+                    }
                 }
                 break;
             case "checkout.session.expired"://过期
@@ -105,12 +116,19 @@ public class StripeController {
             default:
                 break;
         }
+        if(subscriptionId == null){
+            return ResultData.ok();
+        }
         String autoEven = AutoPayUtil.getAutoEven(type);
 
-        autopayOrder = autopayOrderService.getBySubscriptionId(subscriptionId);
+        autopayOrder = autopayOrderService.getByOrderSn(orderId);
         if(autopayOrder == null ){
             return ResultData.ok();
         }
+        if(autopayOrder.getSubscriptionId() == null){
+            autopayOrderService.setSubscriptionId(autopayOrder.getId(),subscriptionId);
+            return ResultData.ok();
+        }
 
         AutopayOrderSon orderSnSon = null;
         if("PAY.COMPLETED".equals(autoEven)){

+ 49 - 0
src/main/java/com/fdkankan/pay/entity/StripeCustomer.java

@@ -0,0 +1,49 @@
+package com.fdkankan.pay.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2025-04-18
+ */
+@Getter
+@Setter
+@TableName("t_stripe_customer")
+public class StripeCustomer implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("customer")
+    private String customer;
+
+    @TableField("customer_email")
+    private String customerEmail;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/pay/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"pay", getTables(new String[]{
-                "t_stripe_price",      "t_stripe_product",      "t_stripe_webhook_log"
+                "t_stripe_customer"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/pay/mapper/IStripeCustomerMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.pay.mapper;
+
+import com.fdkankan.pay.entity.StripeCustomer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2025-04-18
+ */
+@Mapper
+public interface IStripeCustomerMapper extends BaseMapper<StripeCustomer> {
+
+}

+ 3 - 1
src/main/java/com/fdkankan/pay/service/IAutopayOrderService.java

@@ -15,7 +15,9 @@ public interface IAutopayOrderService extends IService<AutopayOrder> {
 
      AutopayOrder getByOrderSn(String orderSn) ;
 
-     void saveAutoOrder(String orderSn, String productId, String planId, String subscriptionId);
+     void saveAutoOrder(String orderSn, String productId, String planId, String subscriptionId,String webUrl);
 
      AutopayOrder getBySubscriptionId(String subscriptionId);
+
+     void setSubscriptionId(Integer id, String subscriptionId);
 }

+ 19 - 0
src/main/java/com/fdkankan/pay/service/IStripeCustomerService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.pay.service;
+
+import com.fdkankan.pay.entity.StripeCustomer;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2025-04-18
+ */
+public interface IStripeCustomerService extends IService<StripeCustomer> {
+
+    StripeCustomer getByUserName(String userName);
+
+    void saveByEmail(String customerEmail,String customer);
+}

+ 13 - 6
src/main/java/com/fdkankan/pay/service/impl/AutopayOrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.fdkankan.pay.service.impl;
 import java.util.Date;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fdkankan.pay.entity.AutopayOrder;
 import com.fdkankan.pay.mapper.IAutopayOrderMapper;
 import com.fdkankan.pay.service.IAutopayOrderService;
@@ -20,16 +21,14 @@ import org.springframework.stereotype.Service;
 public class AutopayOrderServiceImpl extends ServiceImpl<IAutopayOrderMapper, AutopayOrder> implements IAutopayOrderService {
 
     @Override
-    public void saveAutoOrder(String orderSn, String productId, String planId, String subscriptionId) {
-        AutopayOrder autopayOrder = this.getByOrderSn(orderSn);
-        if(autopayOrder == null){
-            autopayOrder = new AutopayOrder();
-        }
+    public void saveAutoOrder(String orderSn, String productId, String planId, String subscriptionId,String webUrl) {
+        AutopayOrder autopayOrder = new AutopayOrder();
         autopayOrder.setOrderSn(orderSn);
         autopayOrder.setProductId(productId);
         autopayOrder.setPlanId(planId);
         autopayOrder.setSubscriptionId(subscriptionId);
-        this.saveOrUpdate(autopayOrder);
+        autopayOrder.setSubscriptionHref(webUrl);
+        this.save(autopayOrder);
     }
 
     @Override
@@ -45,4 +44,12 @@ public class AutopayOrderServiceImpl extends ServiceImpl<IAutopayOrderMapper, Au
         wrapper.eq(AutopayOrder::getSubscriptionId,subscriptionId);
         return this.getOne(wrapper);
     }
+
+    @Override
+    public void setSubscriptionId(Integer id, String subscriptionId) {
+        LambdaUpdateWrapper<AutopayOrder> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(AutopayOrder::getId,id);
+        wrapper.set(AutopayOrder::getSubscriptionId,subscriptionId);
+        this.update(wrapper);
+    }
 }

+ 38 - 0
src/main/java/com/fdkankan/pay/service/impl/StripeCustomerServiceImpl.java

@@ -0,0 +1,38 @@
+package com.fdkankan.pay.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.pay.entity.StripeCustomer;
+import com.fdkankan.pay.mapper.IStripeCustomerMapper;
+import com.fdkankan.pay.service.IStripeCustomerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2025-04-18
+ */
+@Service
+public class StripeCustomerServiceImpl extends ServiceImpl<IStripeCustomerMapper, StripeCustomer> implements IStripeCustomerService {
+
+    @Override
+    public StripeCustomer getByUserName(String userName) {
+        LambdaQueryWrapper<StripeCustomer> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StripeCustomer::getCustomerEmail,userName);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public void saveByEmail(String customerEmail,String customer) {
+        StripeCustomer byUserName = this.getByUserName(customerEmail);
+        if(byUserName == null){
+            byUserName = new StripeCustomer();
+            byUserName.setCustomerEmail(customerEmail);
+            byUserName.setCustomer(customer);
+            this.save(byUserName);
+        }
+    }
+}

+ 1 - 7
src/main/java/com/fdkankan/pay/util/paypal/sdk/PaypalService.java

@@ -460,7 +460,6 @@ public class PaypalService {
             return openPayResponse;
         }
 
-        autopayOrder = new AutopayOrder();
         AutopayPlan autopayPlan = autopayPlanService.getByOrder(order);
 
         if(autopayPlan == null){
@@ -491,9 +490,6 @@ public class PaypalService {
             autopayPlanService.save(autopayPlan);
         }
 
-        autopayOrder.setProductId(autopayPlan.getProductId());
-        autopayOrder.setPlanId(autopayPlan.getPlanId());
-        autopayOrder.setOrderSn(order.getOrderSn());
 
         DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss+08:00");  //ISO8601
         String time = null;
@@ -518,9 +514,7 @@ public class PaypalService {
 
         SubscriptionVo subscription = restApiPaypalService.createSubscription(paypalConfig, order);
         log.info("创建订阅支付链接:"+subscription);
-        autopayOrder.setSubscriptionId(subscription.getSubscriptionId());
-        autopayOrder.setSubscriptionHref(subscription.getSubscriptionHref());
-        autopayOrderService.saveOrUpdate(autopayOrder);
+        autopayOrderService.saveAutoOrder(order.getOrderSn(),autopayPlan.getProductId(),autopayPlan.getPlanId(),subscription.getSubscriptionId(),subscription.getSubscriptionHref());
 
         openPayResponse.setH5Url(subscription.getSubscriptionHref());
         openPayResponse.setQrCodeUrl(subscription.getSubscriptionHref());

+ 27 - 7
src/main/java/com/fdkankan/pay/util/stripe/StripeService.java

@@ -2,11 +2,11 @@ package com.fdkankan.pay.util.stripe;
 
 import com.fdkankan.pay.common.ResultCode;
 import com.fdkankan.pay.config.PayConfig;
-import com.fdkankan.pay.entity.Order;
-import com.fdkankan.pay.entity.PaypalConfig;
-import com.fdkankan.pay.entity.StripeConfig;
+import com.fdkankan.pay.entity.*;
 import com.fdkankan.pay.exception.BusinessException;
 import com.fdkankan.pay.response.OpenPayResponse;
+import com.fdkankan.pay.service.IAutopayOrderService;
+import com.fdkankan.pay.service.IStripeCustomerService;
 import com.fdkankan.pay.service.IStripePriceService;
 import com.fdkankan.pay.service.IStripeProductService;
 import com.fdkankan.pay.util.CacheUtil;
@@ -38,6 +38,10 @@ public class StripeService {
     IStripeProductService stripeProductService;
     @Autowired
     IStripePriceService stripePriceService;
+    @Autowired
+    IStripeCustomerService stripeCustomerService;
+    @Autowired
+    IAutopayOrderService autopayOrderService;
 
     public Object openPay(Order param, String ipAddr,String lang) {
 
@@ -56,6 +60,19 @@ public class StripeService {
 
     public Object createPay(Order param,StripeConfig stripeConfig,String lang){
         try {
+            OpenPayResponse openPayResponse = new OpenPayResponse();
+            openPayResponse.setOrderSn(param.getOrderSn());
+            openPayResponse.setPayType(6);
+            if(param.getAutoPay() == 1){
+                AutopayOrder autopayOrder = autopayOrderService.getByOrderSn(param.getOrderSn());
+                openPayResponse.setAutoPay(1);
+                if(autopayOrder !=null){
+                    openPayResponse.setH5Url(autopayOrder.getSubscriptionHref());
+                    openPayResponse.setQrCodeUrl(autopayOrder.getSubscriptionHref());
+                    return openPayResponse;
+                }
+            }
+
             String productName = StringUtils.isBlank(param.getProductName()) ? "product" :param.getProductName();
             String productId = stripeProductService.getByName(productName);
             if(StringUtils.isBlank(productId)){
@@ -66,6 +83,8 @@ public class StripeService {
                 throw new BusinessException(ResultCode.STRIPE_ERROR);
             }
 
+            StripeCustomer stripeCustomer = stripeCustomerService.getByUserName(param.getUserName());
+
             SessionCreateParams.Mode mode = SessionCreateParams.Mode.PAYMENT;
             if(param.getAutoPay() == 1){
                 mode = SessionCreateParams.Mode.SUBSCRIPTION;
@@ -81,20 +100,21 @@ public class StripeService {
                     .setCancelUrl(stripeConfig.getCancelUrl())
                     .setLocale(locale)
                     .setCustomerEmail(param.getUserName())
+                    .setCustomer(stripeCustomer!=null ?stripeCustomer.getCustomer():null)
                     .addLineItem(
                             SessionCreateParams.LineItem.builder()
                                     .setQuantity(1L)
                                     .setPrice(priceId)
                                     .build()).putMetadata("orderId", param.getOrderSn())
                     .build();
-
             Session session = Session.create(params4);
 
-            OpenPayResponse openPayResponse = new OpenPayResponse();
             openPayResponse.setH5Url(session.getUrl());
-            openPayResponse.setOrderSn(param.getOrderSn());
-            openPayResponse.setPayType(6);
+            openPayResponse.setQrCodeUrl(session.getUrl());
 
+            if(param.getAutoPay() == 1){
+                autopayOrderService.saveAutoOrder(param.getOrderSn(),productId,priceId,null,session.getUrl());
+            }
             return openPayResponse;
 
 

+ 5 - 0
src/main/resources/mapper/pay/StripeCustomerMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.pay.mapper.IStripeCustomerMapper">
+
+</mapper>