Skip to content

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 文档

可以通过代码去添加:

java
SessionCreateParams.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"
}

image-20251215173026033

支付回调

efb79f39-ed16-45f6-87ac-7504051513d0

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());
    }
}

序列化时需要使用(下划线的属性转骆驼峰):

java
objectMapper.readValue(body, StripeOrderCallbackReq.class);

查询订单状态

Retrieve a Checkout Session | Stripe API Reference

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;
    }

退款

Create a refund | Stripe API Reference

退款并取消付款 | Stripe 文档

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);
        }
    }