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

同时为两个Stripe账户创建客户仅第一账户生效如何解决

问题原因

  • 代码中自行实例化的\Stripe\StripeClient对象$stripe未被后续的业务方法使用:createOrGetStripeCustomer、updateDefaultPaymentMethodFromStripe是Laravel Cashier提供的内置方法,默认读取项目全局配置的STRIPE_SECRET密钥发起请求,因此所有操作只会指向第一个Stripe账户。
  • 遍历过程中没有动态切换Cashier使用的Stripe密钥,也没有将自定义的Stripe客户端传递给操作方法,导致全局配置始终没有变更,所有循环都执行了相同的逻辑。

解决方法

方案1:动态切换Cashier全局配置

遍历每个账户密钥时,临时修改Cashier的全局配置,强制使用当前遍历到的密钥生成Stripe客户端:

foreach ($stripe_accounts as $item) {
    // 动态修改当前使用的Stripe密钥
    config(['cashier.secret' => $item]);
    // 重置Cashier内置的Stripe客户端实例
    \Laravel\Cashier\Cashier::useStripeClient(new \Stripe\StripeClient($item));
    
    $hotel = session('hotel');
    $stripeUser = $hotel->createOrGetStripeCustomer();
    $hotel->updateDefaultPaymentMethodFromStripe();
}

方案2:修改业务方法支持传入自定义Stripe客户端

如果createOrGetStripeCustomer是你自行封装的方法,可以调整方法参数,支持传入Stripe客户端实例,遍历的时候传入当前实例即可:

// 调整自定义方法,接收Stripe客户端参数
public function createOrGetStripeCustomer(\Stripe\StripeClient $stripe)
{
    // 原有逻辑中所有调用Stripe API的地方替换为传入的$stripe对象
}

// 遍历时代码调整为
foreach ($stripe_accounts as $item) {
    $stripe = new \Stripe\StripeClient($item);
    $hotel = session('hotel');
    // 传入当前账户对应的Stripe客户端
    $stripeUser = $hotel->createOrGetStripeCustomer($stripe);
    $hotel->updateDefaultPaymentMethodFromStripe($stripe);
}

额外注意事项

  • 需要给Hotel模型新增对应不同Stripe账户的客户ID存储字段,例如stripe_customer_id_account1、stripe_customer_id_account2,避免后续循环的执行结果覆盖前一次存储的客户ID,导致数据丢失。
  • 所有账户操作完成后,如果后续还有其他Stripe相关业务,可以将Cashier配置改回默认值,避免影响其他业务逻辑的正常执行。

内容的提问来源于stack exchange,提问作者GPiter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:54:02