如何在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
相关产品推荐
相关产品推荐

