Next.js

Payment Integration

Integrating Stripe checkout sessions in a Next.js application.

Stripe Checkout API: Creating a Stripe Checkout session via a Route Handler.
📄app/api/checkout/route.ts
TS
import { NextResponse } from 'next/server';
import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
  apiVersion: '2023-10-16',
});

export async function POST(request: Request) {
  try {
    const session = await stripe.checkout.sessions.create({
      payment_method_types: ['card'],
      line_items: [
        {
          price_data: {
            currency: 'usd',
            product_data: {
              name: 'Next.js Pro Course',
            },
            unit_amount: 9900, // $99.00
          },
          quantity: 1,
        },
      ],
      mode: 'payment',
      success_url: `${process.env.NEXT_PUBLIC_URL}/success?session_id={CHECKOUT_SESSION_ID}`,
      cancel_url: `${process.env.NEXT_PUBLIC_URL}/cancel`,
    });

    return NextResponse.json({ sessionId: session.id });
  } catch (err: any) {
    return NextResponse.json({ error: err.message }, { status: 500 });
  }
}
Client Checkout Button: A React component that triggers the checkout process and redirects to Stripe.
📄components/CheckoutButton.tsx
TSX
'use client';
import { loadStripe } from '@stripe/stripe-js';

const stripePromise = loadStripe(
  process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY!
);

export default function CheckoutButton() {
  const handleCheckout = async () => {
    const stripe = await stripePromise;
    
    const response = await fetch('/api/checkout', {
      method: 'POST',
    });
    
    const { sessionId } = await response.json();
    
    // Redirect to Stripe Checkout
    const result = await stripe?.redirectToCheckout({
      sessionId,
    });
    
    if (result?.error) {
      console.error(result.error.message);
    }
  };

  return (
    <button 
      onClick={handleCheckout}
      className="bg-blue-600 text-white px-4 py-2 rounded"
    >
      Buy Now
    </button>
  );
}