mirror of
https://github.com/shadcn-ui/taxonomy
synced 2026-05-24 09:48:32 +00:00
81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
import { NextApiRequest, NextApiResponse } from "next"
|
|
import Stripe from "stripe"
|
|
import rawBody from "raw-body"
|
|
|
|
import { stripe } from "@/lib/stripe"
|
|
import { db } from "@/lib/db"
|
|
|
|
export const config = {
|
|
api: {
|
|
// Turn off the body parser so we can access raw body for verification.
|
|
bodyParser: false,
|
|
},
|
|
}
|
|
|
|
export default async function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse
|
|
) {
|
|
const body = await rawBody(req)
|
|
const signature = req.headers["stripe-signature"]
|
|
|
|
let event: Stripe.Event
|
|
|
|
try {
|
|
event = stripe.webhooks.constructEvent(
|
|
body,
|
|
signature,
|
|
process.env.STRIPE_WEBHOOK_SECRET
|
|
)
|
|
} catch (error) {
|
|
return res.status(400).send(`Webhook Error: ${error.message}`)
|
|
}
|
|
|
|
const session = event.data.object as Stripe.Checkout.Session
|
|
|
|
if (event.type === "checkout.session.completed") {
|
|
// Retrieve the subscription details from Stripe.
|
|
const subscription = await stripe.subscriptions.retrieve(
|
|
session.subscription as string
|
|
)
|
|
|
|
// Update the user stripe into in our database.
|
|
// Since this is the initial subscription, we need to update
|
|
// the subscription id and customer id.
|
|
await db.user.update({
|
|
where: {
|
|
id: session.metadata.userId,
|
|
},
|
|
data: {
|
|
stripeSubscriptionId: subscription.id,
|
|
stripeCustomerId: subscription.customer as string,
|
|
stripePriceId: subscription.items.data[0].price.id,
|
|
stripeCurrentPeriodEnd: new Date(
|
|
subscription.current_period_end * 1000
|
|
),
|
|
},
|
|
})
|
|
}
|
|
|
|
if (event.type === "invoice.payment_succeeded") {
|
|
// Retrieve the subscription details from Stripe.
|
|
const subscription = await stripe.subscriptions.retrieve(
|
|
session.subscription as string
|
|
)
|
|
|
|
// Update the price id and set the new period end.
|
|
await db.user.update({
|
|
where: {
|
|
stripeSubscriptionId: subscription.id,
|
|
},
|
|
data: {
|
|
stripePriceId: subscription.items.data[0].price.id,
|
|
stripeCurrentPeriodEnd: new Date(
|
|
subscription.current_period_end * 1000
|
|
),
|
|
},
|
|
})
|
|
}
|
|
|
|
return res.json({})
|
|
}
|