jojostx/larasubs

Laravel的灵活计划和管理系统,包含运行SAAS服务所需的所有工具

v0.1.5 2023-01-12 05:51 UTC

This package is auto-updated.

Last update: 2024-09-04 14:54:36 UTC


README

Banner

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

关于

此包提供了一种简单的接口来处理订阅和功能消费。

注意事项

  • 此包不包括支付功能。
  • 如果您需要覆盖某些辅助方法(如renew()cancel()等)背后的逻辑,则可能需要扩展一些核心模型。例如:在取消订阅时,您可能还想取消附加的定期支付。

安装

您可以通过composer安装此包

composer require jojostx/larasubs

发布资源(配置和迁移文件)

php artisan vendor:publish --provider="Jojostx\Larasubs\LarasubsServiceProvider" --tag=larasubs-config

php artisan vendor:publish --provider="Jojostx\Larasubs\LarasubsServiceProvider" --tag=larasubs-migrations

使用方法

要开始使用,只需将Jojostx\Larasubs\Models\Concerns\HasSubscriptions特质添加到您的User模型(或任何您希望具有订阅的模型)中

<?php
namespace App\Models;

use Jojostx\Larasubs\Models\Concerns\HasSubscriptions;

class User
{
    use HasSubscriptions;
}

就这些!

设置计划

首先,您必须定义您将提供的计划。在下面的示例中,我们创建了两个计划。

<?php
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Jojostx\Larasubs\Enums\IntervalType;
use Jojostx\Larasubs\Models\Models\Plan;

class PlanSeeder extends Seeder
{
    public function run()
    {
        $silver = Plan::create([
            'name'                    => 'silver',
            'description'             => 'Plan for medium businesses',
            'active'                  => true,
            'price'                   => 100000, // price in the lowest currency value (kobo)
            'currency'                => 'NGN',
            'interval'                => 6,
            'interval_type'           => IntervalType::YEAR,
            'trial_interval'          => 1,
            'trial_interval_type'     => IntervalType::MONTH,
            'grace_interval'          => 1,
            'grace_interval_type'     => IntervalType::MONTH,
            'sort_order' => 1,
        ]);

        $gold = Plan::create([
            'name'                    => 'gold',
            'description'             => 'Plan for large businesses',
            'active'                  => true,
            'price'                   => 10000000, // price in the lowest currency value (kobo)
            'currency'                => 'NGN',
            'interval'                => 6,
            'interval_type'           => IntervalType::YEAR,
            'trial_interval'          => 1,
            'trial_interval_type'     => IntervalType::MONTH,
            'grace_interval'          => 1,
            'grace_interval_type'     => IntervalType::MONTH
        ]);
    }
}

这里的一切都很简单,但值得强调的是:通过接收上面的间隔选项,这两个计划被定义为每年一次,有1个月的试用期和宽限期。

试用期

您可以为每个计划定义试用期,这样您的用户就可以在订阅开始之前试用计划。

宽限期

您可以为每个计划定义宽限期,这样您的用户在订阅结束时不会立即失去访问功能。

设置功能

接下来,您可能需要定义计划将提供的功能。在下面的示例中,我们创建了两个功能:一个用于处理每个用户可以使用的分钟数,以及他们是否可以使用子域名。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Jojostx\Larasubs\Enums\IntervalType;
use Jojostx\Larasubs\Models\Models\Feature;

class FeatureSeeder extends Seeder
{
    public function run()
    {
        $deployMinutes = Feature::create([
            'name'             => 'deploy-minutes',
            'consumable'       => true,
            'interval'      => 1,
            'interval_type' => IntervalType::DAY,
        ]);

        $customDomain = Feature::create([
            'name'       => 'custom-domain',
            'description' => 'Ability to create and use subdomains',
            'consumable' => false,
            'active' => true,
            'interval'      => 1,
            'interval_type' => IntervalType::DAY,
        ]);
    }
}

将计划与功能关联

由于每个功能可以属于多个计划(并且它们可以有多个功能),您必须将它们关联起来

use Jojostx\Larasubs\Models\Feature;

// ...

$deployMinutes = Feature::where('name', 'deploy-minutes')->first();
$subdomains    = Feature::where('name', 'subdomains')->first();

$silver->features()->attach($deployMinutes, ['units' => 15]);

$gold->features()->attach($deployMinutes, ['units' => 25]);
$gold->features()->attach($subdomains);

在将可消费功能与计划关联时,必须为units传递一个值。

在上面的示例中,我们为银用户提供15分钟的部署时间,为金用户提供25分钟。我们还允许金用户使用子域名。

订阅

现在,您已经有一组带有其功能的计划,是时候让用户订阅它们了。注册订阅很简单

<?php

namespace App\Listeners;

use App\Events\PaymentApproved;

class SubscribeUser
{
    public function handle(PaymentApproved $event)
    {
        $subscriber = $event->user;
        $plan       = $event->plan;
        $subscriptionName  = $user->name . strval(time()); // should be unique

        $subscriber->subscribeTo(
            $plan,
            $subscriptionName
        );
    }
}

在上面的示例中,我们模拟了一个在支付批准时注册其用户的程序。很容易看出,subscribeTo方法只需要两个参数

  • 用户订阅的计划。
  • 订阅的唯一名称。

您可以传递其他一些参数给它来处理我们将在下面介绍的特殊情况。

默认情况下,subscribeTo方法根据计划的“间隔”选项计算到期时间,因此您无需担心。

测试

composer test

安全策略

如果您发现任何与安全相关的问题,请发送电子邮件而不是使用问题跟踪器。

支持

以下支持渠道随时可供您使用

许可

本软件根据MIT许可(MIT)发布。

© 2022 Jojostx,部分版权所有。