fix: update stripe webhooks to handle past due subscriptions (#20466)

* handle case for past due subscriptions

* update user subscription again if active

---------

Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
This commit is contained in:
Rajiv Sahal
2025-05-27 13:06:42 +00:00
committed by GitHub
co-authored by Anik Dhabal Babu
parent 2aafa1c163
commit a1007398f6
2 changed files with 27 additions and 0 deletions
@@ -124,6 +124,9 @@ export class BillingController {
case "checkout.session.completed":
await this.billingService.handleStripeCheckoutEvents(event);
break;
case "customer.subscription.updated":
await this.billingService.handleStripePaymentPastDue(event);
break;
case "customer.subscription.deleted":
await this.billingService.handleStripeSubscriptionDeleted(event);
break;
@@ -216,6 +216,30 @@ export class BillingService implements OnModuleDestroy {
}
}
async handleStripePaymentPastDue(event: Stripe.Event) {
const invoice = event.data.object as Stripe.Invoice;
const subscriptionId = this.getSubscriptionIdFromInvoice(invoice);
const customerId = this.getCustomerIdFromInvoice(invoice);
if (subscriptionId && customerId) {
const existingUserSubscription = await this.stripeService
.getStripe()
.subscriptions.retrieve(subscriptionId);
if (existingUserSubscription.status === "past_due") {
await this.billingRepository.updateBillingOverdue(subscriptionId, customerId, true);
}
if (existingUserSubscription.status === "active") {
await this.billingRepository.updateBillingOverdue(subscriptionId, customerId, false);
}
}
if (!subscriptionId || !customerId) {
this.logger.log(`SubscriptionId: ${subscriptionId} or customerId: ${customerId} missing`);
}
}
async handleStripeCheckoutEvents(event: Stripe.Event) {
const checkoutSession = event.data.object as Stripe.Checkout.Session;