文章目录
前言
最近的接了一个国外的开发项目,需要对接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支付集成的有价值信息。如果您有任何疑问或需要进一步的帮助,请随时与我们联系。祝您在在线支付领域取得成功!