springboot项目对接stripe国际支付


前言

最近的接了一个国外的开发项目,需要对接stripe支付,由于网上资料比较少,所有在这里记录一下。

Stripe支持多种支付方式,包括信用卡、Apple Pay、Google Pay和更多。它还提供了许多功能,如订阅管理、反欺诈保护和实时数据分析,以帮助企业提供最佳的支付体验。

无论您是新手开发人员还是有经验的Java开发者,都将从本博客中获得有关Spring Boot和Stripe支付集成的宝贵信息。接下来,我们将详细介绍如何开始使用Stripe,并为您提供实现在线支付的步骤和最佳实践。让我们开始这个激动人心的旅程吧!


一、pom文件引入jar包

        <dependency>
            <groupId>com.stripe</groupId>
            <artifactId>stripe-java</artifactId>
            <version>23.2.0</version>
        </dependency>

提示:这里的版本建议选23的版本,最新版本会出现问题,目前还没解决:

二、stripe平台账号开通与配置

1.公钥与私钥

在这里插入图片描述
开通stripe账号后,首页页面可以查看测试的公钥和私钥,线上再替换成正式的就行。

2.配置webhook支付成功回调

点击开发人员——>webhook——>添加端点

  • 端点url:你的回调路径
  • 监听事件:选择不同的监听事件,触发不同的事件回调,此处直接搜索选 payment_intent.succeeded

完成效果如下

在这里插入图片描述

二、代码编写

此处需要编写三个接口:

  • 一个获取stripe公钥接口
  • 一个下单接口
  • 一个webhook回调接口

2.获取stripe公钥接口

    @Operation(summary = "获取公钥")
    @GetMapping(value = "/config")
    public ResultMessage<String> config() {
        Setting setting = settingService.get(SettingEnum.PAYMENT_SETTING.name());
        PaymentSetting paymentSetting = JSONUtil.toBean(setting.getSettingValue(), PaymentSetting.class);
        return ResultUtil.data(paymentSetting.getPublicKey());
    }

为了文章的完整性,我这里就粘贴一下我的代码,此处大家自己编写就行,返回公钥是因为前端需要调支付页面时需要。

2.下单接口

    public String createOrder(BigDecimal flowPrice, String orderSn,int type) throws StripeException {
        Setting setting = settingService.get(SettingEnum.PAYMENT_SETTING.name());
        PaymentSetting paymentSetting = JSONUtil.toBean(setting.getSettingValue(), PaymentSetting.class);
        Stripe.apiKey=paymentSetting.getPrivateKey();
//此处传入自己的订单需要自定义的参数
        HashMap<String, String> map = new HashMap<>();
        map.put("order_sn", orderSn);
        map.put("order_type", String.valueOf(type));
        long longValue = flowPrice.multiply(new BigDecimal(100)).longValue();
        PaymentIntentCreateParams params = PaymentIntentCreateParams.builder()
                .setAutomaticPaymentMethods(
                        PaymentIntentCreateParams.AutomaticPaymentMethods.builder()
                                .setEnabled(true)
                                .build()
                )
                .setCurrency("USD") //设置金额类型,此处为美元
                .setAmount(longValue) //设置金额,按分结算
                .putAllMetadata(map)  //添加自定义的参数
                .build();
        // Create a PaymentIntent with the order amount and currency
        PaymentIntent intent = PaymentIntent.create(params);
        // Send PaymentIntent details to client
        return intent.getClientSecret();
    }

此处为下单接口的核心代码,大家按自己的页面类型,修改即可。

3.webhook回调接口

    public void callback(String jsonString, HttpServletRequest request) throws IOException {
        Setting setting = settingService.get(SettingEnum.PAYMENT_SETTING.name());
        PaymentSetting paymentSetting = JSONUtil.toBean(setting.getSettingValue(), PaymentSetting.class);
        String sigHeader = request.getHeader("Stripe-Signature");
        String endpointSecret = paymentSetting.getWebhookSecret();

        Event event = null;
        try {
            event = Webhook.constructEvent(jsonString, sigHeader, endpointSecret);
        } catch (SignatureVerificationException e) {
            log.info("stripe 验签,获取事件异常, errorMsg=" + e.getMessage());
            throw new ServiceException("Invalid payload");
        }

        log.info("事件json{}",event.toJson());
        JSONObject jsonObject = JSONUtil.parseObj(event.toJson());
        Map<String,String> metadata = (Map<String,String>)jsonObject.get("metadata");
        //获取支付业务订单号
        String orderSn = metadata.get("order_sn");
        String orderType = metadata.get("order_type");
        //获取stripe平台订单号
        String stripeOrderSn = jsonObject.getStr("id");

        switch (event.getType()) {

            case "payment_intent.created"://创建订单,不做处理
                break;
            case "payment_intent.canceled"://取消订单
                break;
            case "payment_intent.succeeded"://支付成功
 				//在这里编写你的支持成功处理逻辑
            default:
                log.info("订单回调处理失败,错误的类型{}",event.getType());
        }
    }
}

以上是回调接口核心代码,包含验签流程。

可以熟系stripe支付的小伙伴可以问为什么不用dataObjectDeserializer.getObject().get()来获取自定义参数,因为不知道申没原因导致dataObjectDeserializer.getObject().isPresent()false导致获取不到PaymentIntent对象,所有只能用字符串转json的形式来获取订单信息了。

欢迎大牛来指正原因。

总结

感谢您阅读本博客,并希望您能够从中获得有关Spring Boot和Stripe支付集成的有价值信息。如果您有任何疑问或需要进一步的帮助,请随时与我们联系。祝您在在线支付领域取得成功!

Spring Boot是一个用于构建Java应用程序的开源框架,它简化了Java应用程序的开发过程。Stripe是一家提供在线支付解决方案的公司,它提供了一套API和工具,帮助开发者轻松地集成支付功能到他们的应用程序中。 要在Spring Boot应用程序中集成Stripe,可以按照以下步骤进行操作: 1. 添加Stripe依赖:在项目的pom.xml文件中添加Stripe的依赖项。可以通过在<dependencies>标签内添加以下代码来实现: ```xml <dependency> <groupId>com.stripe</groupId> <artifactId>stripe-java</artifactId> <version>20.60.0</version> </dependency> ``` 2. 配置Stripe API密钥:在应用程序的配置文件(如application.properties或application.yml)中添加Stripe的API密钥。可以在Stripe的开发者控制台中获取API密钥。 ```properties stripe.apiKey=YOUR_STRIPE_API_KEY ``` 3. 创建Stripe服务:创建一个StripeService类,用于处理与Stripe API的交互。可以使用Stripe的Java库来执行各种操作,如创建支付Intent、创建订阅等。 ```java @Service public class StripeService { @Value("${stripe.apiKey}") private String apiKey; public PaymentIntent createPaymentIntent(int amount, String currency) throws StripeException { Stripe.apiKey = apiKey; PaymentIntentCreateParams params = new PaymentIntentCreateParams.Builder() .setAmount(amount) .setCurrency(currency) .build(); return PaymentIntent.create(params); } // 其他Stripe相关操作的方法... } ``` 4. 使用Stripe服务:在需要使用Stripe支付的地方,注入StripeService并调用相应的方法。 ```java @RestController public class PaymentController { @Autowired private StripeService stripeService; @PostMapping("/payment") public PaymentIntent createPayment(@RequestParam int amount, @RequestParam String currency) throws StripeException { return stripeService.createPaymentIntent(amount, currency); } // 其他支付相关的接口... } ``` 这样,你就可以在Spring Boot应用程序中使用Stripe进行支付了。当然,以上只是一个简单的示例,实际使用中可能还需要处理更多的逻辑和错误情况。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lsllsl后端学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值