StripePay
Stripe是一家全球在线支付服务商,主要为企业提供在线支付处理、商业贷款及自动化税务计算等服务
引入依赖pom.xml:
xml
<dependency>
<groupId>com.stripe</groupId>
<artifactId>stripe-java</artifactId>
<version>31.0.0</version>
</dependency>结构体:
java
@Data
@Accessors(chain = true)
public class StripeOrderVO {
/**
* 订单号,和完成付款的订单号不一样
*/
private String id;
/**
* 状态
* "open"代表成功
*/
private String status;
/**
* 回调Url
*/
private String url;
/**
* 支付状态
*/
private String paymentStatus;
/**
* 异常状态码
*/
private Integer statusCode;
/**
* 请求是否成功
*/
public boolean isRequestSuccess() {
return "open".equals(status) && statusCode == null;
}
/**
* 用户是否已经支付完成
*/
public boolean isPaid() {
return "paid".equals(paymentStatus);
}
}创建支付订单会话
官方文档:Create a Checkout Session | Stripe API Reference
默认只支持
card,所有支持的付款方式如下:Payment method integration options | Stripe 文档可以通过代码去添加:
javaSessionCreateParams.builder() .addPaymentMethodType(SessionCreateParams.PaymentMethodType.CARD)
java
private SessionCreateParams buildParams(BigDecimal payment, String currency, String subject) {
return SessionCreateParams.builder()
.setSuccessUrl("https://dicloak.com")
.addLineItem(
SessionCreateParams.LineItem.builder()
// 数量,最终金额为商品价格乘以数量
.setQuantity(1L)
.setPriceData(
SessionCreateParams.LineItem.PriceData.builder()
// 货币
.setCurrency(currency)
// 默认美分
.setUnitAmountDecimal(payment.multiply(new BigDecimal(100)))
.setProductData(SessionCreateParams.LineItem.PriceData.ProductData.builder()
.setName(subject)
.build()
)
.build()
)
.build()
)
.addPaymentMethodType(SessionCreateParams.PaymentMethodType.CARD)
.addPaymentMethodType(SessionCreateParams.PaymentMethodType.LINK)
.setMode(SessionCreateParams.Mode.PAYMENT)
.build();
}
public StripeOrderVO createCheckoutSession(BigDecimal payment, String orderId, String currency, String subject) {
try {
StripeClient client = new StripeClient(apiKey);
SessionCreateParams params = buildParams(payment, currency, subject);
Session session = client.v1().checkout().sessions().create(params);
StripeOrderVO stripeOrderVO = JSON.parseObject(JSON.toJSONString(session), StripeOrderVO.class);
log.info("session {}", JSON.toJSON(session));
return stripeOrderVO;
} catch (StripeException e) {
log.error("StripeServiceImpl createCheckoutSession error ", e);
}
return null;
}
SpringUtil.getBean(StripeService.class).createCheckoutSession(new BigDecimal(10), "1000001", "USD", "productName");参考session的内容:
json{ "adaptivePricing": { "enabled": true }, "amountSubtotal": 1000, "amountTotal": 1000, "automaticTax": { "enabled": false }, "brandingSettings": { "backgroundColor": "#ffffff", "borderStyle": "rounded", "buttonColor": "#0074d4", "displayName": "New business 沙盒", "fontFamily": "default" }, "created": 1765782459, "currency": "usd", "customFields": [ ], "customText": { }, "customerCreation": "if_required", "discounts": [ ], "expiresAt": 1765868859, "id": "cs_test_xxxxx", "invoiceCreation": { "enabled": false, "invoiceData": { "metadata": { } } }, "livemode": false, "metadata": { }, "mode": "payment", "object": "checkout.session", "paymentMethodCollection": "if_required", "paymentMethodOptions": { "card": { "requestThreeDSecure": "automatic" } }, "paymentMethodTypes": [ "card", "link" ], "paymentStatus": "unpaid", "phoneNumberCollection": { "enabled": false }, "shippingOptions": [ ], "status": "open", "successUrl": "https://xxx.com", "totalDetails": { "amountDiscount": 0, "amountShipping": 0, "amountTax": 0 }, "uiMode": "hosted", "url": "https://checkout.stripe.com/c/pay/cs_test_xxxxx" }
支付回调
java
@Data
@Accessors(chain = true)
@JSONType(naming = NamingStrategy.SnakeCase)
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class StripeOrderCallbackReq {
private String id;
private StripeOrderCallbackData data;
@Data
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class StripeOrderCallbackData {
private StripeOrderCallbackDataObject object;
@Data
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class StripeOrderCallbackDataObject {
/**
* 创建订单时的id
*/
private String id;
/**
* 支付完成的id(能够通过此id在平台后台查询支付订单)
*/
private String paymentIntent;
private String paymentStatus;
private String status;
}
}
public boolean isPaidSuccess() {
return data != null && data.getObject() != null
&& "complete".equals(data.getObject().getStatus())
&& "paid".equals(data.getObject().getPaymentStatus());
}
}序列化时需要使用(下划线的属性转骆驼峰):
javaobjectMapper.readValue(body, StripeOrderCallbackReq.class);
查询订单状态
java
public StripeOrderVO createCheckoutSession(BigDecimal payment, String orderId, String currency, String subject) {
try {
StripeClient client = new StripeClient(apiKey);
SessionCreateParams params = buildParams(payment, currency, subject);
Session session = client.v1().checkout().sessions().create(params);
StripeOrderVO stripeOrderVO = JSON.parseObject(JSON.toJSONString(session), StripeOrderVO.class);
System.out.println(session);
return stripeOrderVO;
} catch (StripeException e) {
log.error("StripeServiceImpl createCheckoutSession error ", e);
}
return null;
}退款
java
public void refund(String id) {
try {
StripeClient client = new StripeClient(apiKey);
RefundCreateParams params =
RefundCreateParams.builder()
.setAmount(1L)
.setCharge(id)
// or
// .setPaymentIntent(id)
.build();
Refund refund = client.v1().refunds().create(params);
} catch (StripeException e) {
log.error("StripeServiceImpl createCheckoutSession error ", e);
}
}

