You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel 8中集成Stripe Checkout Session并实现运费传递

Laravel 8 集成 Stripe Checkout Session 实现运费配置方案

你之前使用的是 Stripe 旧版 Charge API,本身不支持运费自动展示功能,切换为官方推荐的 Checkout Session API 即可实现运费传递需求,具体实现步骤如下:

第一步:控制器逻辑改造

首先确保你已经通过 Composer 安装了 Stripe PHP SDK:
composer require stripe/stripe-php

替换原有 Charge 相关代码为 Checkout Session 实现:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class StripeController extends Controller
{
    public function createCheckoutSession(Request $request)
    {
        // 密钥建议放在.env文件中调用,不要硬编码在代码里
        \Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));

        // 商品金额单位为分,可替换为你自己的订单金额计算逻辑
        $productAmount = $request->input('total_amount') * 100;
        // 运费金额单位为分,可替换为你自己的物流规则计算结果
        $shippingAmount = 1000; // 示例对应10美元运费

        $session = \Stripe\Checkout\Session::create([
            'payment_method_types' => ['card'],
            // 商品明细配置
            'line_items' => [
                [
                    'price_data' => [
                        'currency' => 'usd',
                        'product_data' => [
                            'name' => '你的商品名称',
                        ],
                        'unit_amount' => $productAmount,
                    ],
                    'quantity' => 1,
                ],
                // 方式1:直接把运费作为单独明细展示,适合固定运费场景
                [
                    'price_data' => [
                        'currency' => 'usd',
                        'product_data' => [
                            'name' => '标准配送运费',
                        ],
                        'unit_amount' => $shippingAmount,
                    ],
                    'quantity' => 1,
                ]
            ],
            'mode' => 'payment',
            // 支付成功、取消的跳转地址,替换为你自己的业务路由
            'success_url' => route('checkout.success').'?session_id={CHECKOUT_SESSION_ID}',
            'cancel_url' => route('checkout.cancel'),
            // 方式2:如果需要支持用户选择不同运费等级,用下方shipping_options配置,不需要的话删除即可
            /*
            'shipping_options' => [
                [
                    'shipping_rate_data' => [
                        'type' => 'fixed_amount',
                        'fixed_amount' => [
                            'amount' => $shippingAmount,
                            'currency' => 'usd',
                        ],
                        'display_name' => '标准配送',
                        'delivery_estimate' => [
                            'minimum' => ['unit' => 'business_day', 'value' => 3],
                            'maximum' => ['unit' => 'business_day', 'value' => 5],
                        ],
                    ]
                ],
                [
                    'shipping_rate_data' => [
                        'type' => 'fixed_amount',
                        'fixed_amount' => [
                            'amount' => 2000, // 20美元次日达
                            'currency' => 'usd',
                        ],
                        'display_name' => '次日达',
                        'delivery_estimate' => [
                            'minimum' => ['unit' => 'business_day', 'value' => 1],
                            'maximum' => ['unit' => 'business_day', 'value' => 1],
                        ],
                    ]
                ]
            ],
            */
            'metadata' => [
                'order_id' => uniqid(), // 替换为你自己的自定义订单号
            ]
        ]);

        // 返回session id给前端调用
        return response()->json([
            'id' => $session->id
        ]);
    }

    // 支付成功回调逻辑,可根据业务需求调整
    public function success(Request $request)
    {
        $sessionId = $request->get('session_id');
        $session = \Stripe\Checkout\Session::retrieve($sessionId);
        // 此处可添加订单状态更新、库存扣减等业务逻辑
        return view('checkout.success', compact('session'));
    }

    // 支付取消回调逻辑,可根据业务需求调整
    public function cancel()
    {
        return view('checkout.cancel');
    }
}

添加对应路由到routes/web.php:

Route::get('/checkout', [StripeController::class, 'showCheckout'])->name('checkout.show');
Route::post('/create-checkout-session', [StripeController::class, 'createCheckoutSession'])->name('checkout.session');
Route::get('/checkout/success', [StripeController::class, 'success'])->name('checkout.success');
Route::get('/checkout/cancel', [StripeController::class, 'cancel'])->name('checkout.cancel');

第二步:前端JavaScript逻辑

不需要依赖Express.js,直接在Laravel的Blade模板中添加如下代码即可:
首先在模板head中引入Stripe官方JS:

<script src="https://js.stripe.com/v3/"></script>

页面中添加支付按钮:

<button id="checkout-button">支付订单</button>

添加JS调用逻辑:

// 初始化Stripe,公钥建议放在.env中调用,不要硬编码
const stripe = Stripe('{{ config("services.stripe.key") }}');

document.getElementById('checkout-button').addEventListener('click', async () => {
    // 调用后端接口获取session id
    const response = await fetch('{{ route("checkout.session") }}', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-CSRF-TOKEN': '{{ csrf_token() }}' // 必须携带Laravel的CSRF令牌
        },
        body: JSON.stringify({
            total_amount: 100 // 替换为你实际的订单金额,从页面变量读取即可
        })
    });

    const session = await response.json();

    // 跳转到Stripe Checkout托管页面
    const result = await stripe.redirectToCheckout({
        sessionId: session.id
    });

    if (result.error) {
        // 自定义错误处理逻辑,比如提示用户
        alert(result.error.message);
    }
});

补充配置说明

在config/services.php中添加Stripe配置,方便统一调用密钥:

'stripe' => [
    'key' => env('STRIPE_KEY'),
    'secret' => env('STRIPE_SECRET'),
]

之后在.env文件中填入对应的Stripe公钥、密钥即可。如果需要自动收集用户配送地址,可在createCheckoutSession参数中添加'shipping_address_collection' => ['allowed_countries' => ['US', 'CN']],指定允许配送的国家,Stripe会自动完成地址收集逻辑。

内容的提问来源于stack exchange,提问作者D.T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:45:05