Laravel Cashier使用自定义AppUser模型创建订阅报资源ID为空错误如何解决
错误原因
你遇到的Stripe\Exception\InvalidArgumentException报错核心是Cashier在调用Stripe接口时无法拿到有效的用户Stripe ID,触发这个问题有几个明确的配置错误:
- 自定义了Subscription、SubscriptionItem模型,但没有在Cashier中注册,导致Cashier仍然使用默认的内置模型处理关联逻辑,关联外键不匹配。
- Subscription模型的
owner关联没有显式指定你自定义的app_user_id外键,默认会查找user_id字段,导致无法正确关联到AppUser模型,进而取不到用户的stripe_id值。 - SubscriptionItem模型中引入Cashier基类时存在拼写错误,把
Cashier写成了Cachier,会导致关联逻辑异常。 - 多余的动态配置冲突:已经在AppServiceProvider中全局配置了自定义用户模型,又在控制器中动态修改
cashier.model配置,可能引发逻辑异常。
解决方法
按照以下步骤逐一修正即可:
- 修正SubscriptionItem的拼写错误
把SubscriptionItem模型中的引入代码改为正确拼写:use Laravel\Cashier\SubscriptionItem as CashierSubscriptionItem; - 在AppServiceProvider中注册所有自定义模型
在boot方法中补充自定义订阅、订阅项模型的注册代码:Cashier::useCustomerModel(AppUser::class); // 补充下面两行 Cashier::useSubscriptionModel(\App\Models\Subscription::class); Cashier::useSubscriptionItemModel(\App\Models\SubscriptionItem::class); - 修正Subscription模型的owner关联外键
显式指定关联的外键为你自定义的app_user_id:public function owner() { return $this->belongsTo(AppUser::class, 'app_user_id'); } - 删除控制器中多余的配置代码
删掉控制器中config(['cashier.model' => 'App\Models\AppUser']);这一行,全局配置已经生效,重复配置容易引发冲突。 - (可选)修正auth配置的冗余问题
你当前usersprovider用的是database驱动指向app_users表,如果不需要保留默认User模型的逻辑,建议统一改为eloquent驱动,避免后续权限相关逻辑冲突:'providers' => [ 'app_users' => [ 'driver' => 'eloquent', 'model' => App\Models\AppUser::class, ], 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\AppUser::class, ], ], - (必要检查)确认app_users表字段齐全
确保你的app_users表已经包含Cashier要求的字段:stripe_id、pm_type、pm_last_four、trial_ends_at,如果字段名你做了自定义,需要在AppUser模型中重写对应的getter方法,比如自定义stripe_id字段名的话补充:public function getStripeIdName() { return '你自定义的stripe_id字段名'; }
内容的提问来源于stack exchange,提问作者Asha V
相关产品推荐
相关产品推荐

