AlertBayTrumpeter-website/app/api/create-checkout-session/route.ts

168 lines
5.5 KiB
TypeScript

import { type NextRequest, NextResponse } from "next/server"
import Stripe from "stripe"
export const runtime = "edge"
function getBaseUrl(request: NextRequest): string {
// Use environment variable if set, otherwise construct from headers
if (process.env.NEXT_PUBLIC_BASE_URL) {
return process.env.NEXT_PUBLIC_BASE_URL
}
const host = request.headers.get("host") || request.headers.get("x-forwarded-host")
const protocol = request.headers.get("x-forwarded-proto") || "https"
if (host) {
return `${protocol}://${host}`
}
return "https://alertbaytrumpeter.com"
}
export async function POST(request: NextRequest) {
try {
const baseUrl = getBaseUrl(request)
const stripeSecretKey = process.env.STRIPE_SECRET_KEY
if (!stripeSecretKey) {
return NextResponse.json({ error: "STRIPE_SECRET_KEY environment variable is not set" }, { status: 500 })
}
const trimmedKey = stripeSecretKey.trim()
// Check if it's still the placeholder value
if (trimmedKey === "sk_test_your_secret_key_here" || trimmedKey.includes("your_secret_key_here")) {
return NextResponse.json(
{
error:
"Please replace the placeholder STRIPE_SECRET_KEY with your actual Stripe secret key from your Stripe dashboard",
},
{ status: 500 },
)
}
// Validate that it's a proper Stripe key format
if (!trimmedKey.startsWith("sk_test_") && !trimmedKey.startsWith("sk_live_")) {
return NextResponse.json(
{ error: "Invalid Stripe key format. Must start with sk_test_ or sk_live_" },
{ status: 500 },
)
}
const stripe = new Stripe(trimmedKey, {
apiVersion: "2024-06-20",
})
const body = await request.json()
const { lookup_key, priceId, sponsorTier, productId, productName, price, currency, description, mode } = body
if (mode === "subscription" && productId && price) {
console.log("[v0] Creating subscription checkout for product:", productName)
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [
{
price_data: {
currency: currency || "cad",
product_data: {
name: productName,
description: description || `Monthly subscription to support Jerry Higginson, the Alert Bay Trumpeter`,
},
unit_amount: price,
recurring: {
interval: "month",
},
},
quantity: 1,
},
],
success_url: `${baseUrl}/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${baseUrl}/cancel`,
})
console.log("[v0] Subscription checkout session created successfully:", session.id)
return NextResponse.json({ url: session.url })
}
if (priceId === "buck_a_month" || sponsorTier === "Monthly Supporter") {
console.log("[v0] Creating monthly subscription checkout session")
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [
{
price_data: {
currency: "cad",
product_data: {
name: "Buck-A-Month Sponsor - Alert Bay Trumpeter",
description: "Monthly $1 CAD subscription to support Jerry Higginson, the Alert Bay Trumpeter",
},
unit_amount: 100, // $1.00 CAD in cents
recurring: {
interval: "month",
},
},
quantity: 1,
},
],
success_url: `${baseUrl}/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${baseUrl}/cancel`,
})
console.log("[v0] Monthly subscription checkout session created successfully:", session.id)
return NextResponse.json({ url: session.url })
}
if (!lookup_key) {
return NextResponse.json({ error: "Missing lookup_key for sponsor tier" }, { status: 400 })
}
// Define price mapping for sponsor tiers
const priceMap: { [key: string]: number } = {
copper: 1000, // $10.00 in cents
bronze: 2500, // $25.00 in cents
silver: 5000, // $50.00 in cents
gold: 10000, // $100.00 in cents
}
const tierNames: { [key: string]: string } = {
copper: "Copper Sponsor",
bronze: "Bronze Sponsor",
silver: "Silver Sponsor",
gold: "Gold Sponsor",
}
const amount = priceMap[lookup_key]
const tierName = tierNames[lookup_key]
if (!amount || !tierName) {
return NextResponse.json({ error: "Invalid sponsor tier" }, { status: 400 })
}
console.log("[v0] Creating checkout session for:", tierName, "Amount:", amount)
const session = await stripe.checkout.sessions.create({
mode: "payment",
line_items: [
{
price_data: {
currency: "cad",
product_data: {
name: `${tierName} - Alert Bay Trumpeter`,
description: `Support Jerry Higginson, the Alert Bay Trumpeter, with a ${tierName.toLowerCase()} donation.`,
},
unit_amount: amount,
},
quantity: 1,
},
],
success_url: `${baseUrl}/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${baseUrl}/cancel`,
})
console.log("[v0] Checkout session created successfully:", session.id)
return NextResponse.json({ url: session.url })
} catch (error: any) {
console.error("[v0] Error creating checkout session:", error.message)
return NextResponse.json({ error: error.message }, { status: 500 })
}
}