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支付集成的有价值信息。如果您有任何疑问或需要进一步的帮助,请随时与我们联系。祝您在在线支付领域取得成功!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lsllsl后端学者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值