Spark 默认情况下使用基于“用户”的计费。如果您的应用程序按团队或其他模型计费,则需要相应地调整 Spark 安装。我们将使用团队计费实现作为示例,在以下文档中逐步介绍这些调整。
要将 App\Models\Team
模型设为您的可计费模型,您首先需要调整 Spark 的默认迁移。
首先,将 2019_05_03_000001_add_spark_columns_to_users_table.php
文件重命名为 2020_05_03_000001_add_spark_columns_to_teams_table.php
。调整迁移的“年份”将确保迁移在数据库中创建 teams
表后运行。
重命名迁移后,您可以更新其内容,使其更新 teams
表而不是 users
表的表定义。此外,更新第一个列,使其在 teams
表而不是 remember_token
上的字段之后添加。
接下来,更新 subscriptions
表迁移,使其包含 team_id
而不是 user_id
。您还应确保更新迁移索引中的列。
现在迁移已更新,我们应该更新 SparkServiceProvider
以引用 Team
模型而不是 User
模型。
use App\Models\Team;
use Laravel\Cashier\Cashier;
use Spark\Spark;
class SparkServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
// Instruct Cashier to use the `Team` model instead of the `User` model...
Cashier::useCustomerModel(Team::class);
// Resolve the current team...
Spark::billable(Team::class)->resolve(function (Request $request) {
return $request->user()->currentTeam;
});
// Verify that the current user owns the team...
Spark::billable(Team::class)->authorize(function (Team $billable, Request $request) {
return $request->user() &&
$request->user()->id == $billable->user_id;
});
Spark::billable(Team::class)->checkPlanEligibility(function (Team $billable, Plan $plan) {
// ...
});
}
}
现在我们可以更新 Team
模型以使用 Spark\Billable
特性并实现一个 stripeEmail
方法,该方法返回团队所有者的电子邮件地址,以便在 Stripe 仪表板中显示为客户标识符。
use Spark\Billable;
class Team extends JetstreamTeam
{
use Billable;
public function stripeEmail(): string|null
{
return $this->owner->email;
}
}
最后,更新应用程序的 config/spark.php
配置文件,使其定义一个 team
可计费模型。
use App\Models\Team;
'billables' => [
'team' => [
'model' => Team::class,
'plans' => [
// ...
],
],
]