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

能否同时使用Laravel Cashier对接Braintree与Stripe支付网关?

Laravel Cashier 区分 Stripe 和 Braintree 支付网关的原理

嘿,其实Laravel Cashier已经内置了区分不同支付网关的机制,核心就藏在你共用的subscriptions表中——具体来说是**provider字段**。下面给你拆解清楚:

1. 自动填充的provider字段

当你用Cashier创建订阅时,不管是Stripe还是Braintree,框架都会自动给subscriptions表的provider字段填充对应的网关标识:

  • 用Stripe创建订阅时,provider会被设为stripe
  • 用Braintree创建订阅时,provider会被设为braintree

你完全不用手动设置这个字段——Cashier在执行create()方法时,会根据当前使用的支付驱动自动完成填充。比如你现在的代码:

// Braintree订阅,自动设置provider = 'braintree'
$user->newSubscription('paypalPlaneName', $paypal_plan_id)->create($nonce);

// Stripe订阅,自动设置provider = 'stripe'
$user->newSubscription('stripePlaneName', $Stripe_plan_id)->create($stripeToken);

2. 基于provider的驱动适配

Cashier的Subscription模型(默认是Laravel\Cashier\Subscription)会根据provider字段的值,自动加载对应的支付网关驱动。当你后续对订阅执行操作(比如取消、续订、查询状态)时,Cashier会判断provider,然后调用对应网关的逻辑,完全不会出现混淆。

如果想针对不同网关的订阅做差异化处理,直接读取这个字段就行:

foreach ($user->subscriptions as $subscription) {
    if ($subscription->provider === 'stripe') {
        // 处理Stripe订阅的专属逻辑,比如获取Stripe发票
        $invoice = $subscription->invoice();
    } elseif ($subscription->provider === 'braintree') {
        // 处理Braintree订阅的专属逻辑,比如生成Braintree客户ID
        $customerId = $subscription->customer->id;
    }
}

3. 配置层面的注意事项

要确保你的.env文件中同时配置了Stripe和Braintree的密钥信息,Cashier会根据这些配置初始化对应的驱动实例,但最终还是靠subscriptions表的provider字段来绑定具体订阅的网关。

举个配置示例:

# Stripe配置
STRIPE_KEY=pk_test_xxxxxx
STRIPE_SECRET=sk_test_xxxxxx

# Braintree配置
BRAINTREE_ENV=sandbox
BRAINTREE_MERCHANT_ID=xxxxxx
BRAINTREE_PUBLIC_KEY=xxxxxx
BRAINTREE_PRIVATE_KEY=xxxxxx

这样一来,你共用users和subscriptions表完全没问题,Cashier会通过provider字段精准区分每个订阅对应的支付网关~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:56:58