diff --git a/stripe_to_invoice/app/api/stripe/subscription/checkout/route.ts b/stripe_to_invoice/app/api/stripe/subscription/checkout/route.ts index 28720b5..4990566 100644 --- a/stripe_to_invoice/app/api/stripe/subscription/checkout/route.ts +++ b/stripe_to_invoice/app/api/stripe/subscription/checkout/route.ts @@ -2,12 +2,12 @@ import { NextRequest, NextResponse } from "next/server"; import { eq } from "drizzle-orm"; import { randomUUID } from "crypto"; -import { getStripe } from "@/lib/stripe/service"; +import { getStripeBilling } from "@/lib/stripe/service"; import { getUserFromSession } from "@/lib/auth/get-user"; import { db } from "@/lib/db"; import { subscriptions } from "@/lib/schema"; -const stripe = getStripe(); +const stripe = getStripeBilling(); const SUBSCRIPTION_PRICE_ID = process.env.STRIPE_SUBSCRIPTION_PRICE_ID!; const ORIGIN = process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000"; diff --git a/stripe_to_invoice/app/api/stripe/subscription/portal/route.ts b/stripe_to_invoice/app/api/stripe/subscription/portal/route.ts index a2b8ade..81a16c4 100644 --- a/stripe_to_invoice/app/api/stripe/subscription/portal/route.ts +++ b/stripe_to_invoice/app/api/stripe/subscription/portal/route.ts @@ -1,12 +1,12 @@ import { NextRequest, NextResponse } from "next/server"; import { eq } from "drizzle-orm"; -import { getStripe } from "@/lib/stripe/service"; +import { getStripeBilling } from "@/lib/stripe/service"; import { getUserFromSession } from "@/lib/auth/get-user"; import { db } from "@/lib/db"; import { subscriptions } from "@/lib/schema"; -const stripe = getStripe(); +const stripe = getStripeBilling(); const ORIGIN = process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000"; export async function POST(req: NextRequest) { diff --git a/stripe_to_invoice/app/api/stripe/subscription/webhook/route.ts b/stripe_to_invoice/app/api/stripe/subscription/webhook/route.ts index 3f08ee7..0f8f573 100644 --- a/stripe_to_invoice/app/api/stripe/subscription/webhook/route.ts +++ b/stripe_to_invoice/app/api/stripe/subscription/webhook/route.ts @@ -6,11 +6,11 @@ import { NextRequest, NextResponse } from "next/server"; import Stripe from "stripe"; import { eq } from "drizzle-orm"; -import { getStripe } from "@/lib/stripe/service"; +import { getStripeBilling } from "@/lib/stripe/service"; import { db } from "@/lib/db"; import { subscriptions, payments } from "@/lib/schema"; -const stripe = getStripe(); +const stripe = getStripeBilling(); export async function POST(req: NextRequest) { try { @@ -32,7 +32,7 @@ export async function POST(req: NextRequest) { event = stripe.webhooks.constructEvent( body, sig, - process.env.STRIPE_WEBHOOK_SECRET! + process.env.STRIPE_BILLING_WEBHOOK_SECRET! ); console.log("✅ [SUBSCRIPTION WEBHOOK] Signature verified", { eventType: event.type }); } catch (err: any) { diff --git a/stripe_to_invoice/deployment/secrets/.env b/stripe_to_invoice/deployment/secrets/.env index 0888fb2..7774d01 100644 --- a/stripe_to_invoice/deployment/secrets/.env +++ b/stripe_to_invoice/deployment/secrets/.env @@ -31,6 +31,7 @@ PROD_SES_FROM_EMAIL=no-reply@juntekim.com PROD_STRIPE_REDIRECT_URI=https://stripetoinvoice.com/api/stripe/callback PROD_STRIPE_WEBHOOK_SECRET=whsec_KU2qQlJGdpZHqcaUyV8ChqsGOFhLH0Bi + # PROD - Stripe Billing (Platform) PROD_STRIPE_BILLING_SECRET_KEY=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 PROD_STRIPE_BILLING_WEBHOOK_SECRET=whsec_n0JCnC9dLCD6itdSnjRtyylGsEmplsJM diff --git a/stripe_to_invoice/lib/stripe/service.ts b/stripe_to_invoice/lib/stripe/service.ts index d455070..2ca635e 100644 --- a/stripe_to_invoice/lib/stripe/service.ts +++ b/stripe_to_invoice/lib/stripe/service.ts @@ -1,9 +1,10 @@ import Stripe from "stripe"; let stripe: Stripe | null = null; +let stripeBilling: Stripe | null = null; /** - * Server-only Stripe client. + * Server-only Stripe client for main Stripe Connect. * Lazy-initialised to avoid build-time crashes. */ export function getStripe(): Stripe { @@ -17,3 +18,20 @@ export function getStripe(): Stripe { return stripe; } + +/** + * Server-only Stripe client for billing/subscriptions. + * Uses a separate Stripe account for billing. + * Lazy-initialised to avoid build-time crashes. + */ +export function getStripeBilling(): Stripe { + if (!process.env.STRIPE_BILLING_SECRET_KEY) { + throw new Error("STRIPE_BILLING_SECRET_KEY missing"); + } + + if (!stripeBilling) { + stripeBilling = new Stripe(process.env.STRIPE_BILLING_SECRET_KEY); + } + + return stripeBilling; +}