gaurv007's picture
Replace Stripe with Razorpay: subscriptions, webhooks, checkout modal, INR pricing
fbf3514 verified
import { NextRequest, NextResponse } from "next/server";
import { validatePaymentVerification } from "razorpay/dist/utils/razorpay-utils";
import { createClient } from "@/lib/supabase/server";
export async function POST(req: NextRequest) {
try {
const { razorpay_payment_id, razorpay_subscription_id, razorpay_signature } = await req.json();
const isValid = validatePaymentVerification(
{ payment_id: razorpay_payment_id, subscription_id: razorpay_subscription_id },
razorpay_signature,
process.env.RAZORPAY_KEY_SECRET!
);
if (!isValid) {
return NextResponse.json({ error: "Invalid payment signature" }, { status: 400 });
}
// Activate the plan
const supabase = await createClient();
const { data: { user } } = await supabase.auth.getUser();
if (user) {
// Get plan from profile's stored subscription
const { data: profile } = await supabase
.from("profiles")
.select("razorpay_subscription_id")
.eq("id", user.id)
.single();
// Fetch subscription to get plan details from notes
const { getRazorpay } = await import("@/lib/razorpay");
const rp = getRazorpay();
const sub = await rp.subscriptions.fetch(razorpay_subscription_id);
const plan = (sub.notes as any)?.plan || "pro";
await supabase
.from("profiles")
.update({
plan,
razorpay_subscription_id,
updated_at: new Date().toISOString(),
})
.eq("id", user.id);
}
return NextResponse.json({ success: true });
} catch (error: any) {
console.error("Verification error:", error);
return NextResponse.json({ error: error.message || "Verification failed" }, { status: 500 });
}
}