Laravel Cashier 对接Stripe报错:No Such Customer问题求助
嘿,我之前在做Laravel Cashier整合Stripe订阅的时候也踩过这个坑!结合你的情况——Token生成正常、Stripe控制台有客户、数据库也存了Stripe ID,但订阅时提示找不到客户——给你几个针对性的排查和解决方向:
1. 先确认Stripe环境是否完全一致
这绝对是最容易踩的坑!Laravel Cashier会根据你.env文件里的配置自动切换Stripe的测试/生产环境:
- 检查
.env里的STRIPE_KEY和STRIPE_SECRET:测试环境密钥前缀是sk_test_,生产环境是sk_live_,要和你在Stripe控制台看到那个cus_xxxxxx客户的环境完全匹配(比如你在测试模式下创建的客户,代码却用了生产密钥,那肯定找不到) - 可以临时在代码里打印当前使用的密钥来验证:
dd(\Stripe\Stripe::getApiKey());
2. 验证用户模型的Stripe ID关联是否正确
Laravel Cashier依赖用户模型的stripe_id字段来关联Stripe客户,这里要确认两点:
- 数据库里用户的
stripe_id字段确实存的是正确的cus_xxxxxx,没有多余空格、拼写错误或者截断 - 调用订阅方法时,你是从已正确加载的用户实例发起的:比如用
Auth::user()获取当前登录用户,而不是新建了一个空的User对象,或者加载了错误的用户记录。举个正确的调用示例:$user = Auth::user(); $subscription = $user->newSubscription('default', $planId) ->create($stripeToken);
3. 检查手动创建客户的逻辑(如果有的话)
如果你是手动调用Stripe API创建客户,而不是让Cashier自动创建,一定要注意:
- 创建客户后,必须把Stripe返回的
id(也就是cus_xxxxxx)保存到用户的stripe_id字段,并且执行$user->save()写入数据库,不能只在内存里赋值 - Cashier的
create方法逻辑是:如果用户已有stripe_id,就直接关联该客户;如果没有,才会自动创建新客户。要是你手动创建了客户但没同步到用户模型,Cashier就会找不到对应的客户记录。
4. 查看Stripe API请求日志定位问题
可以通过日志来确认实际发送的请求参数是否正确:
- 在
.env里开启Stripe调试日志:STRIPE_LOG_LEVEL=debug,然后查看storage/logs/laravel.log里的Stripe请求详情,看看发送的customer参数是不是你预期的cus_xxxxxx - 也可以直接登录Stripe控制台,进入【开发者】->【日志】,查看对应的API请求,确认请求使用的密钥环境、客户ID和你手里的信息一致。
5. 清除配置缓存(避免旧配置干扰)
有时候配置缓存会导致Stripe密钥没更新:
- 执行Artisan命令清除配置缓存:
php artisan config:clear - 如果是用队列处理订阅逻辑,别忘了重启队列Worker,确保它使用的是最新的配置。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

