Procházet zdrojové kódy

stripe登录校验支付状态

lyhzzz před 2 roky
rodič
revize
38f6e76c66

+ 5 - 0
pom.xml

@@ -170,6 +170,11 @@
         </dependency>
 
 
+        <dependency>
+            <groupId>com.stripe</groupId>
+            <artifactId>stripe-java</artifactId>
+            <version>22.5.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 21 - 0
src/main/java/com/fdkankan/ucenter/controller/StripeConfigController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.ucenter.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+@RestController
+@RequestMapping("/ucenter/stripeConfig")
+public class StripeConfigController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/ucenter/controller/StripeUserEmailController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.ucenter.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+@RestController
+@RequestMapping("/ucenter/stripeUserEmail")
+public class StripeUserEmailController {
+
+}
+

+ 66 - 0
src/main/java/com/fdkankan/ucenter/entity/StripeConfig.java

@@ -0,0 +1,66 @@
+package com.fdkankan.ucenter.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 2023-07-28
+ */
+@Getter
+@Setter
+@TableName("t_stripe_config")
+public class StripeConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * stripe账号
+     */
+    @TableField("stripe_user_name")
+    private String stripeUserName;
+
+    /**
+     * stripe密码
+     */
+    @TableField("stripe_password")
+    private String stripePassword;
+
+    /**
+     * 公钥
+     */
+    @TableField("stripe_public")
+    private String stripePublic;
+
+    /**
+     * 私钥
+     */
+    @TableField("stripe_private")
+    private String stripePrivate;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 51 - 0
src/main/java/com/fdkankan/ucenter/entity/StripeUserEmail.java

@@ -0,0 +1,51 @@
+package com.fdkankan.ucenter.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 2023-07-28
+ */
+@Getter
+@Setter
+@TableName("t_stripe_user_email")
+public class StripeUserEmail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    /**
+     * 支付邮箱
+     */
+    @TableField("stripe_pay_email")
+    private String stripePayEmail;
+
+    @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/ucenter/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") ;
 
         generate(path,"ucenter", getTables(new String[]{
-                "t_company",
+                "t_stripe_user_email","t_stripe_config",
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/ucenter/mapper/IStripeConfigMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.ucenter.mapper;
+
+import com.fdkankan.ucenter.entity.StripeConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+@Mapper
+public interface IStripeConfigMapper extends BaseMapper<StripeConfig> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/ucenter/mapper/IStripeUserEmailMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.ucenter.mapper;
+
+import com.fdkankan.ucenter.entity.StripeUserEmail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+@Mapper
+public interface IStripeUserEmailMapper extends BaseMapper<StripeUserEmail> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/ucenter/service/IStripeConfigService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.ucenter.service;
+
+import com.fdkankan.ucenter.entity.StripeConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+public interface IStripeConfigService extends IService<StripeConfig> {
+
+}

+ 19 - 0
src/main/java/com/fdkankan/ucenter/service/IStripeUserEmailService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.ucenter.service;
+
+import com.fdkankan.ucenter.entity.StripeUserEmail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+public interface IStripeUserEmailService extends IService<StripeUserEmail> {
+
+    List<StripeUserEmail> getByUserId(Long userId);
+}

+ 5 - 0
src/main/java/com/fdkankan/ucenter/service/impl/AppService.java

@@ -46,6 +46,8 @@ public class AppService {
     ICameraService cameraService;
     @Autowired
     LoginService loginService;
+    @Autowired
+    StripeService stripeService;
 
 
     public LoginVo login(LoginParam param) {
@@ -60,6 +62,9 @@ public class AppService {
         if(!user.getPassword().equals(passwordCode)){
             throw new BusinessException(LoginConstant.FAILURE_CODE_3014, LoginConstant.FAILURE_MSG_3014);
         }
+        if(!stripeService.checkUserStripePay(user.getId(),user.getUserName())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3016, LoginConstant.FAILURE_MSG_3016);
+        }
         String token = this.redisLogin(user.getUserName(), JSONObject.toJSONString(user),21800L);
         LoginVo loginVo = commonLogin(user, param, token);
         loginVo.getUser().setPassword(param.getPassword());

+ 20 - 0
src/main/java/com/fdkankan/ucenter/service/impl/StripeConfigServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.fdkankan.ucenter.entity.StripeConfig;
+import com.fdkankan.ucenter.mapper.IStripeConfigMapper;
+import com.fdkankan.ucenter.service.IStripeConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+@Service
+public class StripeConfigServiceImpl extends ServiceImpl<IStripeConfigMapper, StripeConfig> implements IStripeConfigService {
+
+}

+ 147 - 0
src/main/java/com/fdkankan/ucenter/service/impl/StripeService.java

@@ -0,0 +1,147 @@
+package com.fdkankan.ucenter.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.fdkankan.ucenter.entity.StripeConfig;
+import com.fdkankan.ucenter.entity.StripeUserEmail;
+import com.fdkankan.ucenter.service.IStripeConfigService;
+import com.fdkankan.ucenter.service.IStripeUserEmailService;
+import com.fdkankan.ucenter.util.DateUserUtil;
+import com.stripe.Stripe;
+import com.stripe.exception.StripeException;
+import com.stripe.model.Customer;
+import com.stripe.model.CustomerSearchResult;
+import com.stripe.model.PaymentIntent;
+import com.stripe.model.PaymentIntentSearchResult;
+import com.stripe.param.CustomerSearchParams;
+import com.stripe.param.PaymentIntentSearchParams;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class StripeService {
+
+    @Autowired
+    IStripeConfigService stripeConfigService;
+    @Autowired
+    IStripeUserEmailService stripeUserEmailService;
+
+    @PostConstruct
+    public void setStripeConfig(){
+        List<StripeConfig> list = stripeConfigService.list();
+        if(CollectionUtil.isEmpty(list)){
+            log.info("setStripeConfig-error:数据库未初始化stripe配置");
+        }
+        StripeConfig stripeConfig = list.get(0);
+        Stripe.apiKey = stripeConfig.getStripePrivate();
+    }
+
+    public boolean checkUserStripePay(Long userId,String userName){
+        List<String> emailList =  new ArrayList<>();
+        emailList.add(userName);
+        List<StripeUserEmail> list = stripeUserEmailService.getByUserId(userId);
+        if(CollectionUtil.isNotEmpty(list)){
+            for (StripeUserEmail stripeUserEmail : list) {
+                emailList.add(stripeUserEmail.getStripePayEmail());
+            }
+        }
+        for (String email : emailList) {
+            if(checkEmailStripePay(email)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    public boolean checkEmailStripePay(String email){
+        List<String> customer = this.getCustomerByEmail(email);
+        if(CollectionUtil.isNotEmpty(customer)){
+            for (String customerId : customer) {
+                List<PaymentIntent> paymentIntents = this.searchPaySuccess(customerId);
+                if(CollectionUtil.isNotEmpty(paymentIntents)){
+                    for (PaymentIntent paymentIntent : paymentIntents) {
+                        Long created = paymentIntent.getCreated();
+                        Date date = new Date(created);
+                        Date addOneYear = DateUserUtil.dateAddOneYear(date, 1);
+                        if(addOneYear.getTime() > new Date().getTime()){
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+
+    private List<String>  getCustomerByEmail(String email) {
+        try {
+            CustomerSearchParams params =
+                    CustomerSearchParams
+                            .builder()
+                            .setQuery("email:'"+email+"'")
+                            .setLimit(100L)
+                            .build();
+            CustomerSearchResult result = Customer.search(params);
+            List<Customer> data = result.getData();
+            List<String> resultList = new ArrayList<>(data.stream().map(Customer::getId).collect(Collectors.toList()));
+
+            while (StringUtils.isNotBlank(result.getNextPage())){
+                params = CustomerSearchParams
+                        .builder()
+                        .setQuery("email:'"+email+"'")
+                        .setPage(result.getNextPage())
+                        .setLimit(100L)
+                        .build();
+                result = Customer.search(params);
+                data = result.getData();
+                resultList.addAll(data.stream().map(Customer::getId).collect(Collectors.toList()));
+            }
+            return resultList;
+        }catch (Exception e){
+            log.info("stripe-getCustomerByEmail-error:",e);
+        }
+        return null;
+    }
+
+
+    private List<PaymentIntent> searchPaySuccess(String customerId)  {
+        try {
+            PaymentIntentSearchParams params = PaymentIntentSearchParams
+                            .builder()
+                            .setQuery("status:'succeeded' AND customer:'" + customerId+"'")
+                            //.setQuery("status:'succeeded'")
+                            .setLimit(100L)
+                            .build();
+
+            PaymentIntentSearchResult result = PaymentIntent.search(params);
+            List<PaymentIntent> resultList = new ArrayList<>(result.getData());
+
+            while (StringUtils.isNotBlank(result.getNextPage())){
+                params = PaymentIntentSearchParams
+                        .builder()
+                        .setQuery("status:'succeeded' AND customer:'" + customerId+"'")
+                        .setPage(result.getNextPage())
+                        .setLimit(100L)
+                        .build();
+                result  = PaymentIntent.search(params);
+                resultList.addAll(result.getData());
+            }
+
+            return resultList;
+        }catch (Exception e){
+            log.info("stripe-searchPaySuccess-error:",e);
+        }
+     return null;
+    }
+
+}

+ 29 - 0
src/main/java/com/fdkankan/ucenter/service/impl/StripeUserEmailServiceImpl.java

@@ -0,0 +1,29 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.ucenter.entity.StripeUserEmail;
+import com.fdkankan.ucenter.mapper.IStripeUserEmailMapper;
+import com.fdkankan.ucenter.service.IStripeUserEmailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-28
+ */
+@Service
+public class StripeUserEmailServiceImpl extends ServiceImpl<IStripeUserEmailMapper, StripeUserEmail> implements IStripeUserEmailService {
+
+    @Override
+    public List<StripeUserEmail> getByUserId(Long userId) {
+        LambdaQueryWrapper<StripeUserEmail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StripeUserEmail::getUserId,userId);
+        return this.list(wrapper);
+    }
+}

+ 12 - 0
src/main/java/com/fdkankan/ucenter/util/DateUserUtil.java

@@ -8,7 +8,9 @@ import org.joda.time.DateTime;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.util.Calendar;
 import java.util.Date;
+import java.util.GregorianCalendar;
 
 public class DateUserUtil {
 
@@ -97,4 +99,14 @@ public class DateUserUtil {
                 .toLocalDateTime().plusMonths(month);
         return  Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
     }
+
+    /*日期加+1年*/
+    public static Date dateAddOneYear(Date date,Integer i) {
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        calendar.add(Calendar.YEAR,i); //把日期往后增加一天,整数  往后推,负数往前移动
+        date=calendar.getTime(); //这个时间就是日期往后推一天的结果
+        return date;
+
+    }
 }

+ 5 - 0
src/main/resources/mapper/ucenter/StripeConfigMapper.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.ucenter.mapper.IStripeConfigMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/ucenter/StripeUserEmailMapper.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.ucenter.mapper.IStripeUserEmailMapper">
+
+</mapper>