Spring Boot 怎么接入 Stripe 支付?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本文介绍了如何在 Spring Boot 应用中接入 Stripe 支付,提供了一个基本框架,并展示了处理 Webhook 的代码示例。通过捕获异常返回错误信息,成功处理事件则返回确认消息。作者 JustinNeil 在文中还提到可根据需求扩展更多功能,如订阅管理和优惠券应用等。

前言

Stripe 是一个全球知名的支付处理平台,它为个人或企业提供了一种简单、安全的方式来接收和处理在线支付。Stripe 提供了丰富的API,支持多种支付方式,包括信用卡、借记卡、电子钱包等。在本教程中,我们将介绍如何在 Spring Boot 应用程序中集成 Stripe 支付,并实现常见的支付操作。

环境准备

  1. 注册 Stripe 账号并获取 API 密钥。
  2. 在 Stripe Dashboard 中配置 Webhook 以接收支付事件通知。

集成步骤

1. 添加 Stripe 依赖

在 Spring Boot 项目的 pom.xml 文件中添加 Stripe 的 Java 库依赖:

xml

代码解读

复制代码

<dependency>
    <groupId>com.stripe</groupId>
    <artifactId>stripe-java</artifactId>
    <version>22.29.0</version> <!-- 请使用最新版本 -->
</dependency>

2. 配置 Stripe API 密钥

application.propertiesapplication.yml 中配置 Stripe 的 API 密钥:

ini

代码解读

复制代码

stripe.api.key=sk_test_你的密钥

3. 创建 Stripe 服务

创建一个服务类,用于封装 Stripe API 的调用:

java

代码解读

复制代码

@Service
public class StripeService {
    private final String apiKey;

    @Autowired
    public StripeService(@Value("${stripe.api.key}") String apiKey) {
        this.apiKey = apiKey;
    }

    public Customer createCustomer(String email, String token) throws StripeException {
        Stripe.apiKey = apiKey;
        Map<String, Object> customerParams = new HashMap<>();
        customerParams.put("description", "Customer for " + email);
        customerParams.put("email", email);
        customerParams.put("source", token); // 通过 Stripe.js 获取
        return Customer.create(customerParams);
    }

    public Charge createCharge(String customerId, int amount) throws StripeException {
        Stripe.apiKey = apiKey;
        Map<String, Object> chargeParams = new HashMap<>();
        chargeParams.put("amount", amount);
        chargeParams.put("currency", "usd");
        chargeParams.put("customer", customerId);
        return Charge.create(chargeParams);
    }

    public Refund createRefund(String chargeId, int amount) throws StripeException {
        Stripe.apiKey = apiKey;
        Map<String, Object> refundParams = new HashMap<>();
        refundParams.put("charge", chargeId);
        refundParams.put("amount", amount);
        return Refund.create(refundParams);
    }

    // 添加失败重试机制
    @Retryable(value = {Exception.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000))
    public Charge createChargeWithRetry(String customerId, int amount) throws StripeException {
        return createCharge(customerId, amount);
    }

    // 重试失败后的恢复方法
    @Recover
    public Charge recoverFromChargeFailure(Exception e) {
        // 记录日志、发送警报或执行其他恢复操作
        return null;
    }
}

4. 创建控制器

创建一个控制器,用于处理支付请求:

java

代码解读

复制代码

@RestController
@RequestMapping("/api/payments")
public class PaymentController {
    private final StripeService stripeService;

    @Autowired
    public PaymentController(StripeService stripeService) {
        this.stripeService = stripeService;
    }

    @PostMapping("/create-customer")
    public ResponseEntity<?> createCustomer(@RequestBody Map<String, String> payload) {
        try {
            String customerId = stripeService.createCustomer(payload.get("email"), payload.get("token"));
            return ResponseEntity.ok(customerId);
        } catch (StripeException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    }

    @PostMapping("/create-charge")
    public ResponseEntity<?> createCharge(@RequestBody Map<String, Object> payload) {
        try {
            String chargeId = stripeService.createChargeWithRetry((String) payload.get("customerId"), (int) payload.get("amount"));
            return ResponseEntity.ok(chargeId);
        } catch (StripeException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    }

    @PostMapping("/refund")
    public ResponseEntity<?> createRefund(@RequestBody Map<String, Object> payload) {
        try {
            String refundId = stripeService.createRefund((String) payload.get("chargeId"), (int) payload.get("amount"));
            return ResponseEntity.ok(refundId);
        } catch (StripeException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    }

    // 其他支付 API 的端点...
}

5. 处理回调

Stripe 通过 Webhook 发送支付事件通知。你需要创建一个端点来接收这些事件:

java

代码解读

复制代码

@RestController
public class WebhookController {
    private final StripeService stripeService;

    @Autowired
    public WebhookController(StripeService stripeService) {
        this.stripeService = stripeService;
    }

    @PostMapping("/webhook")
    public ResponseEntity<String> handleWebhook(@RequestBody String payload, @RequestParam String signature) {
        Event event = null;
        try {
            event = Webhook.constructEvent(payload, signature, apiKey);
            switch (event.getType()) {
                case "payment_intent.succeeded":
                    stripeService.handlePaymentIntentSuccess(event);
                    break;
                case "charge.refunded":
                    stripeService.handleChargeRefunded(event);
                    break;
                // 其他事件处理...
            }
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Webhook error: " + e.getMessage());
        }
        return ResponseEntity.ok("Event processed successfully");
    }
}

总结

以上步骤提供了一个基本的 Spring Boot 应用接入 Stripe 支付的框架。你可以根据具体需求,添加更多的 Stripe API 功能,如订阅管理、优惠券应用等。

转载来源:https://juejin.cn/post/7418363736413601802

相关文章
|
Java
Springboot集成第三方jar快速实现微信、支付宝等支付场景
Springboot集成第三方jar快速实现微信、支付宝等支付场景
724 0
Springboot集成第三方jar快速实现微信、支付宝等支付场景
SpringBoot+支付宝:实现沙箱支付全过程
SpringBoot+支付宝:实现沙箱支付全过程
864 0
|
5月前
|
Java 测试技术 Spring
支付系统15-----支付宝支付,引入支付参数,如何使支付宝的配置信息变成SpringBoot相关的配置信息
支付系统15-----支付宝支付,引入支付参数,如何使支付宝的配置信息变成SpringBoot相关的配置信息
|
6月前
|
测试技术 数据安全/隐私保护 Java
基于SpringBoot+Vue+uniapp的金融支付终端管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的金融支付终端管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
JSON Java 数据格式
支付系统---微信支付15------创建SpringBoot项目
支付系统---微信支付15------创建SpringBoot项目
|
7月前
|
消息中间件 JSON Java
Springboot支付宝沙箱支付---完整详细步骤
Springboot支付宝沙箱支付---完整详细步骤
1429 0
|
7月前
|
Java 开发工具
Springboot接入微信支付、支付宝支付
Springboot接入微信支付、支付宝支付
372 0
|
7月前
|
消息中间件 数据库 RocketMQ
Springboot+RocketMQ通过事务消息优雅的实现订单支付功能
RocketMQ的事务消息,是指发送消息事件和其他事件需要同时成功或同时失败。比如银行转账, A银行的某账户要转一万元到B银行的某账户。A银行发送“B银行账户增加一万元”这个消息,要和“从A银 行账户扣除一万元”这个操作同时成功或者同时失败。RocketMQ采用两阶段提交的方式实现事务消息。
271 0
|
7月前
|
Java 关系型数据库 MySQL
|
7月前
|
Java 开发工具
解决SpringBoot集成支付宝支付中文订单描述验签错误问题
解决SpringBoot集成支付宝支付中文订单描述验签错误问题
79 0