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 "";
    }

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

相关推荐
墨子夕1 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
骇客野人1 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
_菜鸟果果1 小时前
高德地图 JS API 2.0 在国产 Linux/ARM 电脑上渲染失败 的排查与解决
linux·开发语言·javascript
.Bryce.1 小时前
MCP+A2A+ANP,Agent通信协议的完整知识地图
java·人工智能·后端·agent·通信协议
SL_staff1 小时前
规则引擎选型陷阱:为什么QPS不是JVS-Rules对比Drools的核心指标
java·开源·全栈
LMT流氓兔1 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
昂好的day2 小时前
VisionMaster(VM) 标定工具详解(上):为什么必须标定 + 九点标定手眼标定
开发语言·数码相机·c#
eleven_4u2 小时前
RocketMQ相关问题
java·运维·中间件
严谨的麻辣烫2 小时前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查
开发语言·python·http·网络安全