55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import { NextResponse } from "next/server"
|
|
import Stripe from "stripe"
|
|
|
|
export const runtime = "edge"
|
|
|
|
export async function GET() {
|
|
try {
|
|
const stripeSecretKey = process.env.STRIPE_SECRET_KEY?.trim()
|
|
|
|
if (!stripeSecretKey) {
|
|
return NextResponse.json({ error: "Stripe configuration missing" }, { status: 500 })
|
|
}
|
|
|
|
if (stripeSecretKey === "sk_test_your_secret_key_here" || stripeSecretKey.includes("your_secret_key_here")) {
|
|
return NextResponse.json({ error: "Please configure your actual Stripe secret key" }, { status: 500 })
|
|
}
|
|
|
|
const stripe = new Stripe(stripeSecretKey, {
|
|
apiVersion: "2024-06-20",
|
|
})
|
|
|
|
// Fetch products and their prices
|
|
const products = await stripe.products.list({
|
|
active: true,
|
|
expand: ["data.default_price"],
|
|
})
|
|
|
|
// Filter for one-time payment products (not recurring subscriptions)
|
|
const oneTimeProducts = products.data.filter((product) => {
|
|
const price = product.default_price as Stripe.Price
|
|
return price && price.type === "one_time"
|
|
})
|
|
|
|
const productsWithPrices = oneTimeProducts.map((product) => {
|
|
const price = product.default_price as Stripe.Price
|
|
return {
|
|
id: product.id,
|
|
name: product.name,
|
|
description: product.description,
|
|
images: product.images,
|
|
price: {
|
|
id: price.id,
|
|
amount: price.unit_amount,
|
|
currency: price.currency,
|
|
},
|
|
}
|
|
})
|
|
|
|
return NextResponse.json({ products: productsWithPrices })
|
|
} catch (error) {
|
|
console.error("[v0] Error fetching products:", error)
|
|
return NextResponse.json({ error: "Failed to fetch products" }, { status: 500 })
|
|
}
|
|
}
|