Laravel Cashier集成Stripe报错No such plan: Monthly 求助
解决Laravel Cashier集成Stripe新Product/Price系统的「No such plan」错误
嘿,我来帮你搞定这个问题!我之前也踩过类似的坑,核心原因是你搞混了Stripe新旧套餐系统的调用方式——现在Stripe用的是Product + Price模型,而Laravel Cashier需要的是Stripe生成的Price ID,不是你自定义的套餐名称(比如'Monthly')。
问题根源
Stripe在新版API里废弃了旧的独立Plan概念,改成了「Product(产品)」下挂多个「Price(定价方案,比如月付、年付)」的结构。你代码里传入的'Monthly'是你给套餐起的名称,但Cashier根本识别不了,它要的是Stripe后台自动生成的Price ID(格式是price_xxxxxx)。
一步步解决
1. 拿到正确的Price ID
- 登录你的Stripe仪表盘,找到你创建的Product
- 展开该Product下的「定价方案」列表,复制对应月付套餐的Price ID(比如
price_1KbXyzABC123) - 注意:每个不同的计费周期(月付、年付)对应一个独立的Price ID,别拿成Product ID哦
2. 修正你的订阅代码
把代码里的'Monthly'替换成刚才复制的Price ID,示例如下:
public function store(Request $request) { $token = $request->stripeToken; // 把第二个参数换成你的Stripe Price ID auth()->user()->newSubscription('main', 'price_1KbXyzABC123')->create($token); return 'Done'; }
这里的'main'是订阅的标识名称(你可以改成'membership'之类的自定义名称),第二个参数必须是Stripe的Price ID。
3. 额外排查点
- 更新Cashier版本:旧版本的Cashier可能不兼容Stripe新的Product/Price模型,运行
composer update laravel/cashier确保是最新版 - 验证Stripe密钥:检查
.env文件里的STRIPE_KEY和STRIPE_SECRET是否正确,且对应你创建产品的环境(测试/生产) - 确认Token有效性:确保前端的Stripe Elements正确生成了
stripeToken,可以在Stripe仪表盘的「测试数据」里查看token是否合法
4. 验证结果
提交请求后,先去Stripe仪表盘查看是否生成了订阅记录,再检查Laravel的subscriptions表是否有新增数据。如果还是有问题,可以开启Cashier的日志:在config/cashier.php里设置'logging' => true,查看详细的请求日志来定位问题。
内容的提问来源于stack exchange,提问作者jmike
相关产品推荐
相关产品推荐

