应直接使用 Laravel 官方推荐的 laravel/cashier 而非 spatie/laravel-stripe,因其原生支持订阅、发票、Webhook 验证及模型绑定;安装前须确认 PHP ≥8.1(v14+)与 Stripe SDK 版本匹配,否则易报 Class 'Stripe\Stripe' not found;安装后需执行迁移、配置 .env 中的 STRIPE_KEY/SECRET、在 User 模型中引入 Billable trait,并手动注册 Route::stripeWebhooks('webhook/stripe') 路由(避免 CSRF),本地调试建议用 stripe-cli。

直接用 Composer 安装 Cashier,别碰 spatie/laravel-stripe
你搜到的 spatie/laravel-stripe 是个轻量封装,但 Laravel 官方推荐、生态最稳、文档最全的 Stripe 集成方案是 laravel/cashier。它原生支持订阅、发票、Webhook 验证、模型绑定(如 $user->subscribed()),而 Spatie 那个包只做基础 API 调用,没订阅生命周期管理——真要上线支付,绕开 Cashier 会自己补一堆胶水代码。
运行 composer require laravel/cashier 前必须确认 PHP 和 Stripe SDK 版本
Cashier v14+(适配 Laravel 10/11)要求:php >= 8.1,且会自动拉取 stripe/stripe-php ^12.0。如果你项目还卡在 PHP 7.4 或 Laravel 8,得降级:composer require laravel/cashier:^13.0(对应 Stripe SDK ^10.0)。常见错误现象:Class 'Stripe\Stripe' not found,大概率是版本不匹配导致自动加载失败。
- 检查当前 PHP 版本:
php -v - 查清 Laravel 版本:
php artisan --version - 运行前先删掉
vendor/stripe/stripe-php(如果手动装过旧版)
发布迁移并配置 STRIPE_KEY 后,别忘了设置 BILLABLE 模型
Cashier 不是装完就能用。它默认假设你的用户模型(比如 App\Models\User)实现了 Billable trait,并且数据库有 stripe_id 字段存客户 ID。否则调用 $user->createAsStripeCustomer() 会报错:Call to undefined method createAsStripeCustomer()。
- 执行迁移:
php artisan cashier:install(Laravel 11+)或php artisan vendor:publish --tag="cashier-migrations"+php artisan migrate - 在
.env中填好:STRIPE_KEY=sk_test_...和STRIPE_SECRET=sk_test_... - 在 User 模型里加:
use Laravel\Cashier\Billable;和use Billable;
Webhook 处理路径 /webhook/stripe 默认不生效,必须显式注册路由
Cashier 不自动注册 Webhook 路由。你照着文档把 STRIPE_WEBHOOK_SECRET 配好了,Stripe 控制台也设置了 endpoint,但收不到事件?因为 Laravel 根本没监听那个 URL。错误现象:Stripe Dashboard 显示 404 或 CSRF token mismatch(后者是因为没关 CSRF 验证)。
- 在
routes/web.php或routes/api.php中加:Route::stripeWebhooks('webhook/stripe'); - 确保该路由不在
web中间件组里(避免 CSRF);推荐放api组或单独用middleware('verified')替代 - 本地调试用
stripe-cli转发事件,别等生产环境出问题才试
Webhook 密钥和路由路径必须完全一致,多一个斜杠、大小写错一个字母,Stripe 就验签失败。这是上线前最容易漏掉的一环。











