能否同时使用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
相关产品推荐
相关产品推荐

