You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:30:35