Laravel Stripe Cashier 删除客户

问题描述 投票:0回答:3

如何使用 Laravel 的 Cashier 内置方法删除 Stripe 中的客户?

我知道有一种方法可以通过 Stripe 的 API 删除客户 - https://stripe.com/docs/api/customers/delete但是我想使用 Laravel 的 Cashier 方法,因为它在我的代码中更干净,而不是创建另一个使用 Guzzle 处理 Stripe API 的代码。

非常感谢任何帮助或提示!谢谢!

php laravel stripe-payments laravel-cashier
3个回答
1
投票
private function deleteStripeCustomer($user): void
{
    if ($user->stripe_id) {
        $user->asStripeCustomer()->delete();
    }
}

这会起作用


0
投票

使用 Laravel Cashier 的客户似乎没有删除方法。您需要直接对 Stripe 进行 API 调用。


0
投票

正确的配置应该如下所示。

应用\模型\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;          
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.