ai-flash-card / src / app / api / checkout_sessions / route.js
route.js
Raw
import { NextResponse } from 'next/server'
import Stripe from 'stripe'

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY)

export async function POST(req) {

    const { plan, amount } = await req.json();
    const params = {
        mode: 'subscription',
        payment_method_types: ['card'],
        line_items: [
            {
                price_data: {
                    currency: 'usd',
                    product_data: {
                        name: plan,
                    },
                    unit_amount: Math.round(amount * 100),
                    recurring: {
                        interval: 'month',
                        interval_count: 1,
                    },
                },
                quantity: 1,
            },
        ],
        success_url: `${req.headers.get(
            'Referer',
        )}/result?session_id={CHECKOUT_SESSION_ID}`,
        cancel_url: `${req.headers.get(
            'Referer',
        )}/result?session_id={CHECKOUT_SESSION_ID}`,
    }

    try {
        const checkoutSession = await stripe.checkout.sessions.create(params)

        return NextResponse.json(checkoutSession, {
            status: 200,
        })
    } catch (error) {
        console.error('Error creating checkout session:', error)
        return new NextResponse(JSON.stringify({ error: { message: error.message } }), {
            status: 500,
        })
    }
}

export async function GET(req) {
    const searchParams = req.nextUrl.searchParams
    const session_id = searchParams.get('session_id')

    try {
        if (!session_id) {
            throw new Error('Session ID is required')
        }

        const checkoutSession = await stripe.checkout.sessions.retrieve(session_id)

        return NextResponse.json(checkoutSession)
    } catch (error) {
        console.error('Error retrieving checkout session:', error)
        return NextResponse.json({ error: { message: error.message } }, { status: 500 })
    }
}