Rocky_Mountain_Vending/app/api/stripe/webhook/route.ts

67 lines
2.3 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server"
import { getStripeClient } from "@/lib/stripe/client"
import Stripe from "stripe"
// This is your Stripe CLI webhook secret
const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET
async function handler(req: NextRequest) {
const body = await req.text()
const signature = req.headers.get("stripe-signature") || ""
const stripe = getStripeClient()
let event: Stripe.Event
try {
event = stripe.webhooks.constructEvent(body, signature, webhookSecret!)
} catch (err) {
console.error("Webhook signature verification failed:", err)
return NextResponse.json({ error: "Invalid signature" }, { status: 400 })
}
// Handle the event
switch (event.type) {
case "checkout.session.completed":
const checkoutSession = event.data.object as Stripe.Checkout.Session
console.log("Payment received for session:", checkoutSession.id)
console.log("Customer email:", checkoutSession.customer_email)
console.log("Amount:", checkoutSession.amount_total)
// TODO: Create order record in database
// TODO: Send confirmation email to customer
// TODO: Update inventory for physical products
break
case "payment_intent.succeeded":
const paymentIntent = event.data.object as Stripe.PaymentIntent
console.log("Payment succeeded for intent:", paymentIntent.id)
// TODO: Handle any post-payment logic
break
case "payment_intent.payment_failed":
const failedPayment = event.data.object as Stripe.PaymentIntent
console.log("Payment failed for intent:", failedPayment.id)
console.log("Failure reason:", failedPayment.last_payment_error?.message)
// TODO: Handle failed payment (notify customer, etc.)
break
case "invoice.payment_succeeded":
const invoice = event.data.object as Stripe.Invoice
console.log("Invoice payment succeeded for invoice:", invoice.id)
// TODO: Handle recurring payment success
break
case "invoice.payment_failed":
const failedInvoice = event.data.object as Stripe.Invoice
console.log("Invoice payment failed for invoice:", failedInvoice.id)
// TODO: Handle recurring payment failure
break
default:
console.log(`Unhandled event type: ${event.type}`)
}
return NextResponse.json({ received: true })
}
export { handler as POST }