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

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大量依赖静态方法的问题,确实会导致代码难以测试和扩展,我是这么处理的:

  1. 封装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();
    }

    // 可以根据需求扩展其他方法,比如更新订阅、获取订阅详情等
}
  1. 依赖注入解耦:在事件监听器中通过依赖注入调用服务类,而非直接调用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]);
    }
}
  1. 绑定事件与监听器:在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:27:46