stripe 实例

一、引入stripe-java包

pom.xml文件中引入stripe-java包27.0.0

二、订阅支付

java 复制代码
// 初始化创建session所需参数 product为产品参数
List<SessionCreateParams.LineItem> prices = initPrice({{product}});
SessionCreateParams.Builder builder = SessionCreateParams.builder()
        //支付方式
        .setMode(SessionCreateParams.Mode.SUBSCRIPTION)
        //支付成功
        .setSuccessUrl({{stripeSuccessUrl}})
        //支付完成
        .setCancelUrl({{stripeCancelUrl}})
        //推销码
        .setAllowPromotionCodes(true)
         //购物集合
        .addAllLineItem({{prices}});
// 设置订阅免费试用期
SessionCreateParams.SubscriptionData.Builder subscriptionBuilder = SessionCreateParams.SubscriptionData.builder();
subscriptionBuilder.setTrialPeriodDays({{product.getTrialPeriodDays()}});
// 赋值订阅metadata
builder.setSubscriptionData(subscriptionBuilder.putMetadata("order_id", orderId).build());
// 添加折扣
builder.addDiscount(SessionCreateParams.Discount.builder().setCoupon({{couponId}}).build());
params = builder.build();
// 初始化checkout session
Session session = Session.create(params);
// 创建订单URL连接
return Result.SUCCESS(session.getUrl());

三、一次性支付

java 复制代码
// 初始化创建session所需参数 product为产品参数 quantity 份数参数
List<SessionCreateParams.LineItem> prices = initPrice({{product}},{{quantity}});
params = SessionCreateParams.builder()
         //一次性支付类型
        .setMode(SessionCreateParams.Mode.PAYMENT)
        .setPaymentIntentData(SessionCreateParams.PaymentIntentData.builder().putMetadata("order_id", orderId).build())
        //支付成功 
        .setSuccessUrl({{stripeSuccessUrl}})
        //支付完成 
        .setCancelUrl({{stripeCancelUrl}})
        //推销码 
        .setAllowPromotionCodes(true)
         //购物集合 
        .addAllLineItem({{prices}});
        .build();
// 初始化checkout session
Session session = Session.create(params);
// 创建订单URL连接
return Result.SUCCESS(session.getUrl());

四、webhook

java 复制代码
  public String handleWebhook(String payload, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Event event = null;
        String sigHeader = request.getHeader("Stripe-Signature");
        if ({{stripeEndpointSecret}} != null && sigHeader != null) {
            try {
                event = Webhook.constructEvent(
                        payload, sigHeader, {{stripeEndpointSecret}}
                );
            } catch (SignatureVerificationException e) {
                response.setStatus(400);
                return "";
            }
        }
        EventDataObjectDeserializer dataObjectDeserializer = event.getDataObjectDeserializer();
        StripeObject stripeObject = null;
        if (dataObjectDeserializer.getObject().isPresent()) {
            stripeObject = dataObjectDeserializer.getObject().get();
        } else {
            response.setStatus(200);
            return "";
        }
        // Handle the event
        switch (event.getType()) {
            case "payment_intent.canceled": {
                PaymentIntent paymentIntent = (PaymentIntent) stripeObject;
                String orderId = paymentIntent.getMetadata().get("order_id");
				log.info("============orderId:{}",orderId);
                break;
            }
            case "payment_intent.succeeded": {
                PaymentIntent paymentIntent = (PaymentIntent) stripeObject;
                String orderId = paymentIntent.getMetadata().get("order_id");
				log.info("============orderId:{}",orderId);
                break;
            }
            case "customer.subscription.created": {
                Subscription subscription = (Subscription) stripeObject;
                break;
            }
            case "invoice.payment_succeeded": {
                Invoice invoice = (Invoice) stripeObject;
                String orderId = invoice.getSubscriptionDetails().getMetadata().get("order_id");
				log.info("============orderId:{}",orderId);
                break;
            }
            case "checkout.session.completed": {
                Session session = (Session) stripeObject;
                break;
            }
            case "checkout.session.async_payment_succeeded": {
                Session session = (Session) stripeObject;
                break;
            }
            case "checkout.session.async_payment_failed": {
                Session session = (Session) stripeObject;
                break;
            }
            case "customer.subscription.updated": {
                Subscription subscription = (Subscription) stripeObject;
                String orderId = subscription.getMetadata().get("order_id");
				log.info("============orderId:{}",orderId);
                break;
            }
            case "customer.subscription.deleted": {
                Subscription subscription = (Subscription) stripeObject;
                String orderId = subscription.getMetadata().get("order_id");
				log.info("============orderId:{}",orderId);
                break;
            }
            default:
                break;
        }
        response.setStatus(200);
        return "";
    }

以上内容仅够参考,期待与大家一起学习讨论。

相关推荐
czq_26867194874 分钟前
Python打卡第46天
开发语言·python
杨凯凡30 分钟前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard1 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android1 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤1 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Evand J2 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter4 小时前
ZPL文件预览
开发语言·c++
aiks_yuan4 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang5 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang6 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j