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: "2025-10-29.clover", }); 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, shipping_address_collection: { allowed_countries: ["US", "CA"] }, 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 }; });