有关为您的应用程序定义付款套餐的更多信息,请参阅 套餐配置文档。
默认情况下,应用程序的config/spark.php
配置文件中的计划配置包含一个trial_days
选项,其值为5
。此配置选项决定用户在免费试用期内可以使用应用程序的时间。您可以根据应用程序的需要自由修改此配置值;但是,如果配置了试用期,Stripe Checkout 要求试用期至少为两天。
实际上,此配置选项只是确定可计费模型的onTrial
方法何时开始返回false
而不是true
。
$user = Auth::user();
if ($user->onTrial()) {
// The user is still within their trial period...
}
某些应用程序可能需要在开始免费试用之前预先要求付款方式。Spark 的 Stripe 版本支持此行为。要开始使用,您需要将trial_days
配置选项添加到各个计划配置数组中,并删除可计费配置数组中的trial_days
配置选项。
'user' => [
'model' => User::class,
// 'trial_days' => 5, Remove this configuration option...
'plans' => [
[
'name' => 'Standard',
'short_description' => 'This is a short, human friendly description of the plan.',
'trial_days' => 5,
// ...
],
],
],
现在,在可计费模型的初始注册之后,模型实例提供的trialDays
方法将返回false
。您可以检查subscribed
方法的结果,以有条件地向用户显示警报,告知他们应该在开始使用应用程序之前选择订阅计划。例如,如果您使用的是 Blade 模板语言
@if (! Auth::user()->subscribed())
<div>
You must <a href="/billing">select a subscription plan</a> before continuing.
</div>
@endif
有时,您可能希望对特定计费计划设置限制。例如,项目管理应用程序可能会限制特定计费计划上的用户最多创建 10 个项目,而价格更高的计划可能会允许创建最多 20 个项目。
如果您选择采用这种计费方式,您需要指示 Spark 如何确定给定的可计费模型是否有资格加入特定计费计划。您可以通过修改应用程序的App\Providers\SparkServiceProvider
类中注册的checkPlanEligibility
回调来实现这一点。当可计费模型尝试订阅或切换到新的订阅计划时,将调用此回调。
use App\Models\User;
use Illuminate\Validation\ValidationException;
use Spark\Plan;
use Spark\Spark;
Spark::billable(User::class)->checkPlanEligibility(function ($billable, Plan $plan) {
if (count($billable->projects) > 10 && $plan->name == 'Basic') {
throw ValidationException::withMessages([
'plan' => 'You have too many projects for the selected plan.'
]);
}
});
一些应用程序按“座位”收费,而不是固定月费。例如,一个项目管理应用程序可能每月收取 **每个项目** 10 美元,因此如果用户管理五个项目,他们每月将被收取 50 美元。
如果您的应用程序将使用按座位计费,您可能需要在应用程序的 config/spark.php
配置文件中定义一个单一的每月计划。此外,您需要指示 Spark 如何计算可计费模型当前使用的“座位”数量。
您可以在配置可计费模型时,通过 chargePerSeat
方法指示 Spark 如何计算可计费模型当前使用的“座位”数量。通常,此方法应在应用程序的 App\Providers\SparkServiceProvider
类的 boot
方法中调用。
use App\Models\User;
use Spark\Spark;
Spark::billable(User::class)->chargePerSeat('project', function ($billable) {
return $billable->projects()->count();
});
chargePerSeat
方法接受的第一个参数是您的应用程序用来指代“座位”的术语。在项目管理应用程序的情况下,这将是“项目”。传递给 chargePerSeat
方法的第二个参数应该是一个闭包,它接受可计费模型并返回该模型当前占用的“座位”数量。
配置按座位计费后,Spark 将自动更新应用程序计费门户中的措辞,以告知用户计费是按座位计算的。
上面解释的 chargePerSeat
回调将告知 Spark 客户启动订阅时应使用的当前座位数量。但是,您仍然需要在用户使用您的应用程序时告知 Spark 何时添加或删除座位。例如,如果您正在构建一个按项目计费的项目管理应用程序,您需要在用户创建或删除项目时告知 Spark。您可以通过调用 addSeat
和 removeSeat
方法来实现这一点。
$user->addSeat();
$user->removeSeat();
有时,增加座位的付款可能会失败,因为银行可能需要对卡付款进行额外的确认检查。发生这种情况时,您应该捕获发生的 IncompletePayment
异常并通过重定向到 Cashier 的付款页面来处理它,同时提供一个 redirect
位置,返回到触发 addSeat
调用的页面。
<?php
use Laravel\Cashier\Exceptions\IncompletePayment;
try {
$user->addSeat();
} catch (IncompletePayment $exception) {
return redirect()->route(
'cashier.payment',
[$exception->payment->id, 'redirect' => route('spark.portal')]
);
}
有关处理失败付款的更多信息,请参阅 Cashier 文档。
在构建应用程序时,您通常需要检查用户的订阅状态和计划,以确定他们是否被允许执行给定的操作。例如,您可能不想让用户创建项目,如果他们订阅的计费计划只允许创建特定数量的项目。首先,您应该查看 Spark 提供的 订阅验证中间件。
此外,您始终可以使用 Laravel Cashier 提供的方法 手动检查可计费模型的订阅状态,这对于验证用户是否订阅了特定计划特别有用。
if ($user->subscribed()) {
// The user has an active subscription...
}
if ($user->subscribedToPrice($planId = 'price_id')) {
// The user has a subscription to a plan with a Stripe plan / price ID of "price_id"...
}
Spark 允许您定义计划“激励”文本以显示给您的用户。例如,您可能希望显示选择使用年度计划与每月计划相比节省的金额。激励文本显示在计划卡片的右上角。
要定义激励文本,您可以在计划定义中添加 monthly_incentive
和/或 yearly_incentive
配置选项。
[
'name' => 'Standard',
'short_description' => 'This is a short, human friendly description of the plan.',
'monthly_id' => env('SPARK_STANDARD_MONTHLY_PLAN', 'price_id'),
'yearly_id' => env('SPARK_STANDARD_YEARLY_PLAN', 'price_id'),
'yearly_incentive' => 'Save 10%',
'features' => [
'Feature 1',
'Feature 2',
'Feature 3',
],
],
有时您可能希望访问给定可计费的 Spark 计划实例,以确定该计划有哪些选项可用。例如,如果您的计划定义包含以下内容
[
'name' => 'Standard',
'short_description' => 'This is a short, human friendly description of the plan.',
'monthly_id' => env('SPARK_STANDARD_MONTHLY_PLAN', 'price_id'),
'yearly_id' => env('SPARK_STANDARD_YEARLY_PLAN', 'price_id'),
'features' => [
// ...
],
'options' => [
'database_backups' => true,
],
],
您可以像这样访问计划和选项
if ($user->sparkPlan()) {
$canCreateBackups = $user->sparkPlan()->options['database_backups'] ?? false;
}
如果您计划“存档”或停用应用程序的特定计划,您应该将 archived
配置选项添加到计划的配置数组中。如果您允许应用程序中已订阅该计划的现有用户继续其订阅,则不应完全删除该计划的配置。
'plans' => [
[
'name' => 'Standard',
// ...
'archived' => true,
],
],
如果您的应用程序允许用户完全删除其帐户数据,您应该确保在删除其数据之前取消用户订阅的任何订阅计划。否则,即使您删除了用户的数据,用户也可能会继续被收费。您可以使用 Laravel Cashier 的典型订阅管理方法取消其订阅。根据您的应用程序使用的可计费类型,您可能需要根据应用程序的独特需求调整此代码。
if (optional($user->subscription())->recurring()) {
$user->subscription()->cancelNow();
}