Files
slipmatz-web/server/api/checkout.session.post.ts

63 lines
1.7 KiB
TypeScript

import Stripe from 'stripe'
export default defineEventHandler(async (event) => {
const config = useRuntimeConfig()
const stripeSecretKey = config.stripeSecretKey
if (!stripeSecretKey) {
throw createError({ statusCode: 500, statusMessage: 'Stripe secret key not configured' })
}
const stripe = new Stripe(stripeSecretKey, {
apiVersion: '2024-10-28.acacia',
})
const body = await readBody<{
designId: string
templateId?: string
designName?: string
amount: number
currency?: string
successUrl: string
cancelUrl: string
customerEmail?: string
}>(event)
if (!body?.designId || !body?.amount || !body?.successUrl || !body?.cancelUrl) {
throw createError({ statusCode: 400, statusMessage: 'Missing required fields' })
}
const { currency = 'usd' } = body
const session = await stripe.checkout.sessions.create({
mode: 'payment',
payment_method_types: ['card'],
billing_address_collection: 'auto',
customer_email: body.customerEmail,
line_items: [
{
quantity: 1,
price_data: {
currency,
unit_amount: Math.round(body.amount * 100),
product_data: {
name: body.designName ?? `Slipmat design ${body.designId}`,
metadata: {
designId: body.designId,
...(body.templateId ? { templateId: body.templateId } : {}),
},
},
},
},
],
metadata: {
designId: body.designId,
...(body.templateId ? { templateId: body.templateId } : {}),
},
success_url: body.successUrl,
cancel_url: body.cancelUrl,
})
return { id: session.id, url: session.url }
})