Laravel中基于Stripe库自定义订阅引擎的技术咨询
自定义Laravel + Stripe订阅引擎实现方案
我最近刚好在搭建订阅制SaaS平台时遇到了一模一样的问题——Laravel Cashier的预设逻辑没法满足我的定制需求,最后索性基于原生Stripe SDK自己实现了一套订阅引擎,分享下我的解决思路:
核心对接方式:Laravel模型事件联动Stripe
和你发现的一样,通过监听自定义Subscription模型的创建/删除事件,能非常优雅地实现Laravel与Stripe的状态同步:
- 当Laravel侧创建订阅记录时,触发事件调用Stripe SDK创建对应订阅对象
- 当Laravel侧删除订阅记录时,触发事件调用Stripe SDK执行取消订阅操作
这种方式能把支付网关逻辑和业务代码完全解耦,不会在业务层里塞满Stripe相关调用。
解决Stripe SDK静态方法依赖的小技巧
你提到的Stripe SDK大量依赖静态方法的问题,确实会导致代码难以测试和扩展,我是这么处理的:
- 封装Stripe服务类:把所有Stripe静态调用都包装到自定义服务类中,统一管理:
namespace App\Services; use Stripe\Subscription as StripeSubscription; class StripeSubscriptionService { public function create(array $params) { return StripeSubscription::create($params); } public function cancel(string $stripeSubscriptionId) { $subscription = StripeSubscription::retrieve($stripeSubscriptionId); return $subscription->cancel(); } // 可以根据需求扩展其他方法,比如更新订阅、获取订阅详情等 }
- 依赖注入解耦:在事件监听器中通过依赖注入调用服务类,而非直接调用Stripe静态方法,后续要换支付网关或写单元测试时,直接替换服务实现即可:
namespace App\Listeners; use App\Events\SubscriptionCreated; use App\Services\StripeSubscriptionService; class CreateStripeSubscription { public function __construct(protected StripeSubscriptionService $stripeService) {} public function handle(SubscriptionCreated $event) { $laravelSubscription = $event->subscription; // 调用封装的服务创建Stripe订阅 $stripeSubscription = $this->stripeService->create([ 'customer' => $laravelSubscription->user->stripe_customer_id, 'items' => [['price' => $laravelSubscription->plan->stripe_price_id]], // 按需添加自定义参数,比如试用周期、账单设置等 ]); // 将Stripe返回的订阅ID同步回Laravel的订阅记录 $laravelSubscription->update(['stripe_subscription_id' => $stripeSubscription->id]); } }
- 绑定事件与监听器:在
EventServiceProvider中完成事件和监听器的关联:
protected $listen = [ \App\Events\SubscriptionCreated::class => [ \App\Listeners\CreateStripeSubscription::class, ], \App\Events\SubscriptionDeleted::class => [ \App\Listeners\CancelStripeSubscription::class, ], ];
额外提示
- 别忘了处理Stripe的Webhook事件,比如订阅到期、付款失败、订阅升级降级等场景,需要同步更新Laravel侧的订阅状态
- 给所有Stripe接口调用加上异常捕获,避免因为Stripe服务波动导致Laravel的订阅记录状态不一致
内容的提问来源于stack exchange,提问作者Hedam
相关产品推荐
相关产品推荐

