63 lines
1.7 KiB
TypeScript
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 }
|
|
})
|