From 45b736bb0161e4964e9e2c76a14b86e90a6469cc Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 6 Feb 2024 11:11:26 +0100 Subject: [PATCH] fix: stripe webhooks --- bootstrap/helpers/shared.php | 4 +--- config/sentry.php | 2 +- config/version.php | 2 +- routes/webhooks.php | 43 ++++++++++++++++++++++-------------- versions.json | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index ad64b2550..a6d8a4ae5 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -298,10 +298,8 @@ function validate_cron_expression($expression_to_validate): bool function send_internal_notification(string $message): void { try { - $baseUrl = config('app.name'); $team = Team::find(0); - $team?->notify(new GeneralNotification("👀 {$baseUrl}: " . $message)); - ray("👀 {$baseUrl}: " . $message); + $team?->notify(new GeneralNotification($message)); } catch (\Throwable $e) { ray($e->getMessage()); } diff --git a/config/sentry.php b/config/sentry.php index 2d8f7c7f3..18b1b1fc0 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -7,7 +7,7 @@ return [ // The release version of your application // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) - 'release' => '4.0.0-beta.209', + 'release' => '4.0.0-beta.210', // When left empty or `null` the Laravel environment will be used 'environment' => config('app.env'), diff --git a/config/version.php b/config/version.php index ff1387709..6dde1069a 100644 --- a/config/version.php +++ b/config/version.php @@ -1,3 +1,3 @@ members->where('id', $userId)->first(); if (!$found->isAdmin()) { - throw new Exception("User {$userId} is not an admin or owner of team {$team->id}."); + send_internal_notification("User {$userId} is not an admin or owner of team {$team->id}, customerid: {$customerId}, subscriptionid: {$subscriptionId}."); + throw new Exception("User {$userId} is not an admin or owner of team {$team->id}, customerid: {$customerId}, subscriptionid: {$subscriptionId}."); } $subscription = Subscription::where('team_id', $teamId)->first(); if ($subscription) { @@ -819,25 +819,35 @@ Route::post('/payments/stripe/events', function () { break; case 'invoice.payment_failed': $customerId = data_get($data, 'customer'); - $subscription = Subscription::where('stripe_customer_id', $customerId)->firstOrFail(); + $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); + if (!$subscription) { + send_internal_notification('invoice.payment_failed failed but no subscription found in Coolify for customer: ' . $customerId); + return response('No subscription found in Coolify.'); + } $team = data_get($subscription, 'team'); if (!$team) { - throw new Exception('No team found for subscription: ' . $subscription->id); + send_internal_notification('invoice.payment_failed failed but no team found in Coolify for customer: ' . $customerId); + return response('No team found in Coolify.'); } if (!$subscription->stripe_invoice_paid) { SubscriptionInvoiceFailedJob::dispatch($team); - send_internal_notification('Invoice payment failed: ' . $subscription->team->id); + send_internal_notification('Invoice payment failed: ' . $customerId); } else { - send_internal_notification('Invoice payment failed but already paid: ' . $subscription->team->id); + send_internal_notification('Invoice payment failed but already paid: ' . $customerId); } break; case 'payment_intent.payment_failed': $customerId = data_get($data, 'customer'); - $subscription = Subscription::where('stripe_customer_id', $customerId)->firstOrFail(); - $subscription->update([ - 'stripe_invoice_paid' => false, - ]); - send_internal_notification('Subscription payment failed: ' . $subscription->team->id); + $subscription = Subscription::where('stripe_customer_id', $customerId)->first(); + if (!$subscription) { + send_internal_notification('payment_intent.payment_failed, no subscription found in Coolify for customer: ' . $customerId); + return response('No subscription found in Coolify.'); + } + if ($subscription->stripe_invoice_paid) { + send_internal_notification('payment_intent.payment_failed but invoice is active for customer: ' . $customerId); + return; + } + send_internal_notification('Subscription payment failed for customer: ' . $customerId); break; case 'customer.subscription.updated': $customerId = data_get($data, 'customer'); @@ -868,7 +878,7 @@ Route::post('/payments/stripe/events', function () { $subscription->update([ 'stripe_invoice_paid' => false, ]); - send_internal_notification('Subscription paused or incomplete for team: ' . $subscription->team->id); + send_internal_notification('Subscription paused or incomplete for customer: ' . $customerId); } // Trial ended but subscribed, reactive servers @@ -878,7 +888,7 @@ Route::post('/payments/stripe/events', function () { } if ($feedback) { - $reason = "Cancellation feedback for {$subscription->team->id}: '" . $feedback . "'"; + $reason = "Cancellation feedback for {$customerId}: '" . $feedback . "'"; if ($comment) { $reason .= ' with comment: \'' . $comment . "'"; } @@ -888,7 +898,7 @@ Route::post('/payments/stripe/events', function () { if ($cancelAtPeriodEnd) { // send_internal_notification('Subscription cancelled at period end for team: ' . $subscription->team->id); } else { - send_internal_notification('Subscription resumed for team: ' . $subscription->team->id); + send_internal_notification('customer.subscription.updated for customer: ' . $customerId); } } break; @@ -905,9 +915,10 @@ Route::post('/payments/stripe/events', function () { 'stripe_invoice_paid' => false, 'stripe_trial_already_ended' => true, ]); - // send_internal_notification('Subscription cancelled: ' . $subscription->team->id); + send_internal_notification('customer.subscription.deleted for customer: ' . $customerId); break; case 'customer.subscription.trial_will_end': + // Not used for now $customerId = data_get($data, 'customer'); $subscription = Subscription::where('stripe_customer_id', $customerId)->firstOrFail(); $team = data_get($subscription, 'team'); @@ -929,7 +940,7 @@ Route::post('/payments/stripe/events', function () { 'stripe_invoice_paid' => false, ]); SubscriptionTrialEndedJob::dispatch($team); - send_internal_notification('Subscription paused for team: ' . $subscription->team->id); + send_internal_notification('Subscription paused for customer: ' . $customerId); break; default: // Unhandled event type diff --git a/versions.json b/versions.json index c074128e2..bb86e0435 100644 --- a/versions.json +++ b/versions.json @@ -4,7 +4,7 @@ "version": "3.12.36" }, "v4": { - "version": "4.0.0-beta.209" + "version": "4.0.0-beta.210" } } }