use-shopping-cart logouse-shopping-cart

redirectToCheckout()

Redirects the user to Stripe's Checkout page using a server-created session URL.

Signature

type RedirectToCheckoutInput =
  | string
  | { sessionUrl?: string; sessionId?: string }

redirectToCheckout(input: RedirectToCheckoutInput): Promise<
  { error: any } | undefined
>

Parameters

  • input (string or object, required):
    • sessionUrl (string): The session.url returned from your server endpoint (recommended)
    • sessionId (string): Legacy checkout session ID for older Stripe.js versions

How It Works

  1. Your server creates a Stripe checkout session
  2. Server returns the session.url
  3. Call redirectToCheckout(sessionUrl) on the client
  4. User is redirected to Stripe's checkout page

Basic Usage

import { useShoppingCart } from 'use-shopping-cart'

function CheckoutButton() {
  const { redirectToCheckout, cartDetails, cartCount } = useShoppingCart()

  const handleCheckout = async () => {
    if (cartCount === 0) return

    // 1. Call your server to create a checkout session
    const response = await fetch('/api/checkout', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ cartDetails })
    })

    const { sessionUrl } = await response.json()

    // 2. Redirect to Stripe checkout
    const result = await redirectToCheckout(sessionUrl)

    if (result?.error) {
      console.error('Redirect failed:', result.error)
    }
  }

  return (
    <button onClick={handleCheckout} disabled={cartCount === 0}>
      Proceed to Checkout
    </button>
  )
}

With Loading States

import { useState } from 'react'
import { useShoppingCart } from 'use-shopping-cart'

function CheckoutButton() {
  const { redirectToCheckout, cartDetails, cartCount } = useShoppingCart()
  const [isLoading, setIsLoading] = useState(false)
  const [error, setError] = useState<string | null>(null)

  const handleCheckout = async () => {
    if (cartCount === 0) return

    setIsLoading(true)
    setError(null)

    try {
      const response = await fetch('/api/checkout', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ cartDetails })
      })

      if (!response.ok) {
        throw new Error('Failed to create checkout session')
      }

      const { sessionUrl } = await response.json()
      const result = await redirectToCheckout(sessionUrl)

      if (result?.error) {
        setError('Unable to redirect to checkout')
      }
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Checkout failed')
    } finally {
      setIsLoading(false)
    }
  }

  return (
    <div>
      <button onClick={handleCheckout} disabled={cartCount === 0 || isLoading}>
        {isLoading ? 'Redirecting...' : 'Checkout'}
      </button>

      {error && <p className="error">{error}</p>}
    </div>
  )
}

Server Endpoint Example

Your server endpoint should create the checkout session and return the session.url:

// app/api/checkout/route.ts (Next.js App Router)
import { NextRequest, NextResponse } from 'next/server'
import Stripe from 'stripe'

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

export async function POST(req: NextRequest) {
  try {
    const { cartDetails } = await req.json()

    // Convert cart to line items
    const line_items = Object.values(cartDetails).map((item: any) => ({
      price_data: {
        currency: item.currency.toLowerCase(),
        product_data: {
          name: item.name,
          description: item.description,
          images: item.image ? [item.image] : []
        },
        unit_amount: item.price
      },
      quantity: item.quantity
    }))

    // Create checkout session
    const session = await stripe.checkout.sessions.create({
      mode: 'payment',
      line_items,
      success_url: `${req.nextUrl.origin}/success?session_id={CHECKOUT_SESSION_ID}`,
      cancel_url: req.nextUrl.origin
    })

    return NextResponse.json({ sessionUrl: session.url })
  } catch (error) {
    console.error('Checkout error:', error)
    return NextResponse.json(
      { error: 'Failed to create checkout session' },
      { status: 500 }
    )
  }
}

Notes

  • Requires a server endpoint to create Stripe checkout sessions
  • sessionUrl is required for Stripe.js v8+ (session IDs are legacy)
  • Stripe publishable key is only required when passing a sessionId
  • Returns error object if redirect fails

See Also

Shopping Cart

Your cart is empty

Try the interactive demos on the docs pages!