如何使用 Laravel 的 Cashier 内置方法删除 Stripe 中的客户?
我知道有一种方法可以通过 Stripe 的 API 删除客户 - https://stripe.com/docs/api/customers/delete但是我想使用 Laravel 的 Cashier 方法,因为它在我的代码中更干净,而不是创建另一个使用 Guzzle 处理 Stripe API 的代码。
非常感谢任何帮助或提示!谢谢!
private function deleteStripeCustomer($user): void
{
if ($user->stripe_id) {
$user->asStripeCustomer()->delete();
}
}
这会起作用
使用 Laravel Cashier 的客户似乎没有删除方法。您需要直接对 Stripe 进行 API 调用。
正确的配置应该如下所示。
应用\模型\User.php
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Cashier\Billable;
use Laravel\Cashier\Cashier;
class User extends Authenticatable
{
use Billable;
// ...
protected static function booted(): void
{
// Stripe if user is created
static::created(function (User $user) {
if (!$user->hasStripeId()) {
$user->createAsStripeCustomer();
}
});
// Delete on Stripe if local delete
static::deleted(function (User $user) {
if ($user->hasStripeId() && Cashier::findBillable($user->stripeId())) {
$user->asStripeCustomer()->delete();
}
});
// Fresh Stripe if data is changed
static::updated(function (User $user) {
if ($user->hasStripeId()) {
$user->syncStripeCustomerDetails();
}
});
}
}
建议启用 webhook
App\Listeners\StripeEventListener.php
<?php
namespace App\Listeners;
use App\Models\User;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;
use Laravel\Cashier\Events\WebhookReceived;
class StripeEventListener
{
use InteractsWithQueue;
public function handle(WebhookReceived $event): void
{
switch ($event->payload['type']) {
case "customer.updated":
// Update Database user if Stripe user changed
$customerId = $event->payload['data']['object']['id'];
$customer = $event->payload['data']['object'];
$user = User::where('stripe_id', $customerId)->first();
$user->update([
'name' => $customer['name'],
'email' => $customer['email']
]);
Log::info("customer.updated");
break;
case "customer.deleted":
// Delete Database user if Stripe user is deleted
$customerId = $event->payload['data']['object']['id'];
User::where('stripe_id', $customerId)->delete();
Log::info("customer.deleted");
break;
}
}
}