Laravel Cashier 是 Laravel 与 Stripe 的集成胶水层,自动处理订阅生命周期、发票、Webhook 验证和数据库同步;需配置环境、发布迁移、引入 Billable trait、手动创建 Stripe 产品价格、前端用 Stripe.js 传 payment_method、后端调用 newSubscription()->create(),并正确配置 Webhook 路由与事件监听。

用 Laravel Cashier 接 Stripe 订阅,核心是把 Cashier 当作 Laravel 和 Stripe 的“胶水层”,它帮你自动处理订阅生命周期、发票、Webhook 验证、数据库同步等重复逻辑。关键不是手写 API 调用,而是按 Cashier 的约定建模和配置。
1. 安装与基础配置
确保项目已使用 Laravel 9+(Cashier v14+),PHP 8.0+,且已配置好数据库和队列(Webhook 处理强烈依赖队列)。
- 运行
composer require laravel/cashier - 发布迁移:执行
php artisan vendor:publish --tag="cashier-migrations",再php artisan migrate - 在
.env中填入 Stripe 密钥:STRIPE_KEY=sk_test_...STRIPE_SECRET=sk_test_...STRIPE_WEBHOOK_SECRET=whsec_...(需在 Stripe Dashboard → Developers → Webhooks 创建并复制) - 在
App\Models\User(或你用的模型)中引入Billabletrait:use Laravel\Cashier\Billable;class User extends Authenticatable { use Billable; }
2. 创建 Stripe 产品与价格(后台操作)
Cashier 不负责创建 Stripe 后台资源,这步必须手动完成:
- 登录 Stripe Dashboard
- Products → + Add product(如 “Pro Plan”)→ Save
- 点击刚建的产品 → Pricing → + Add price(选 Recurring,设置周期、金额、货币)→ Publish
- 记下 Price ID(如
price_1Q...xyz),后续代码中会用到
3. 前端订阅流程(精简示例)
用户点击订阅按钮时,不直接传卡信息给后端,而是用 Stripe.js 创建 paymentMethod 或 setupIntent,再把 token 交给 Laravel 处理。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
立即学习“PHP免费学习笔记(深入)”;
- 前端引入 Stripe.js:
<script src="https://js.stripe.com/v3/"></script> - 用
stripe.createPaymentMethod()或elements.submit()获取 payment_method ID - 发 POST 请求到你的 Laravel 路由(如
/user/subscribe),附带price_id和payment_method - 后端控制器中调用:
$user->newSubscription('default', $request->price_id)<br> ->create($request->payment_method);
成功后,Cashier 自动创建 Subscription 记录、关联 Stripe 订阅,并触发 Webhook 同步状态。
4. Webhook 设置与安全验证
Stripe 会通过 Webhook 主动通知事件(如付款成功、订阅取消)。Cashier 提供了开箱即用的路由和控制器,但必须正确启用:
- 在
routes/web.php中添加:Route::stripeWebhooks('stripe-webhook'); - 在
APP_URL对应域名下配置 Webhook endpoint:https://yoursite.com/stripe-webhook(注意不能是 localhost) - 确保该路由未被中间件拦截(如 auth、VerifyCsrfToken),Cashier 内部已做签名验证
- 可监听特定事件,例如在
App\Providers\EventServiceProvider中注册:'stripe.webhook.subscription.updated' => [HandleSubscriptionUpdated::class]
只要模型用了 Billable,数据库有迁移表,Stripe 密钥正确,Webhook 地址配对无误,整个订阅流程就能跑通。重点不是写多少代码,而是让 Cashier 的约定和 Stripe 后台保持一致。


















