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): Thesession.urlreturned from your server endpoint (recommended)sessionId(string): Legacy checkout session ID for older Stripe.js versions
How It Works
- Your server creates a Stripe checkout session
- Server returns the
session.url - Call
redirectToCheckout(sessionUrl)on the client - 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
sessionUrlis 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
- Getting Started - Complete setup guide
- Stripe Checkout Sessions - Stripe API documentation
- Checkout Sessions object -
session.urlreference
