Files
memefast/app/Helpers/FirstParty/Purchase/SubscriptionHelper.php
2025-07-02 01:08:11 +08:00

90 lines
2.8 KiB
PHP

<?php
namespace App\Helpers\FirstParty\Purchase;
use App\Helpers\FirstParty\Stripe\StripeHelper;
use App\Models\Plan;
use App\Models\UserPlan;
use Illuminate\Support\Facades\Log;
use Laravel\Cashier\Events\WebhookReceived;
class SubscriptionHelper
{
public static function handleSubscriptionWebhookEvents(WebhookReceived $event)
{
switch ($event->payload['type']) {
case 'customer.subscription.created':
case 'customer.subscription.updated':
self::handleSubscriptionUpsert($event);
break;
case 'customer.subscription.deleted':
self::handleSubscriptionDelete($event);
break;
}
}
private static function handleSubscriptionUpsert(WebhookReceived $event)
{
$object = $event->payload['data']['object'];
//dump($object);
$ignore_statuses = ['incomplete_expired', 'incomplete'];
if (in_array($object['status'], $ignore_statuses)) {
return;
}
$user = StripeHelper::getUserByStripeID($object['customer']);
if ($user) {
foreach ($object['items']['data'] as $line_item) {
//dump($line_item);
$stripe_price_id = $line_item['plan']['id'];
$current_period_end = $line_item['current_period_end'];
$cancel_at = null;
$canceled_at = null;
if ($line_item['subscription'] == $object['id']) {
$cancel_at = $object['cancel_at'];
$canceled_at = $object['canceled_at'];
}
$subscription_config = PurchaseHelper::getSubscriptionPlanByStripePriceID($stripe_price_id);
$plan = Plan::where('tier', $subscription_config['id'])->first();
if ($plan) {
$user_plan = UserPlan::where('user_id', $user->id)->first();
if ($user_plan) {
$user_plan->update([
'plan_id' => $plan->id,
'current_period_end' => $current_period_end,
'cancel_at' => $cancel_at,
'canceled_at' => $canceled_at,
]);
} else {
$user_plan = UserPlan::create([
'user_id' => $user->id,
'plan_id' => $plan->id,
'current_period_end' => $current_period_end,
'cancel_at' => $cancel_at,
'canceled_at' => $canceled_at,
]);
}
}
}
}
}
private static function handleSubscriptionDelete(WebhookReceived $event)
{
// /
}
}