diff --git a/app/api/razorpay/order/route.js b/app/api/razorpay/order/route.js new file mode 100644 index 0000000..0b7670f --- /dev/null +++ b/app/api/razorpay/order/route.js @@ -0,0 +1,23 @@ +import Razorpay from "razorpay"; + +const razorpay = new Razorpay({ + key_id: "rzp_test_1SbLmNX2nCKRZA", + key_secret: "8CTcXrodJqKQ3cfmic84Ffdl", +}); + +export async function POST(req) { + try { + const body = await req.json(); // Parse the request body + const { amount, currency } = body; + + const order = await razorpay.orders.create({ + amount, + currency, + }); + + return new Response(JSON.stringify(order), { status: 200 }); + } catch (error) { + console.error("Error creating Razorpay order:", error); + return new Response(JSON.stringify({ error: "Failed to create Razorpay order" }), { status: 500 }); + } +} \ No newline at end of file diff --git a/app/api/razorpay/verify/route.js b/app/api/razorpay/verify/route.js new file mode 100644 index 0000000..823547b --- /dev/null +++ b/app/api/razorpay/verify/route.js @@ -0,0 +1,23 @@ +const crypto = require("crypto"); + +export default async function handler(req, res) { + if (req.method === "POST") { + const { razorpay_order_id, razorpay_payment_id, razorpay_signature } = + req.body; + + const body = razorpay_order_id + "|" + razorpay_payment_id; + + const expectedSignature = crypto + .createHmac("sha256", "8CTcXrodJqKQ3cfmic84Ffdl") + .update(body.toString()) + .digest("hex"); + + if (expectedSignature === razorpay_signature) { + res.status(200).json({ success: true }); + } else { + res.status(400).json({ success: false }); + } + } else { + res.status(405).json({ error: "Method not allowed" }); + } +} \ No newline at end of file diff --git a/components/payment/paymentComponent.jsx b/components/payment/paymentComponent.jsx index f3937e9..6a9c075 100644 --- a/components/payment/paymentComponent.jsx +++ b/components/payment/paymentComponent.jsx @@ -1,15 +1,18 @@ import React, { useState, useEffect } from "react"; import { PayPalButtons, PayPalScriptProvider } from "@paypal/react-paypal-js"; import axios from "axios"; -import authAxios from "@/utils/axios"; +import { useRazorpay } from "react-razorpay"; const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours in milliseconds const EXCHANGE_RATE_KEY = "exchange_rate_cache"; const PaymentComponent = ({ amount, onSuccess }) => { + const { error: razorpayError, isLoading, Razorpay } = useRazorpay(); const [error, setError] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [usdAmount, setUsdAmount] = useState(null); + const [userData, setUserData] = useState({ name: "", email: "", contact: "" }); + const [showPopup, setShowPopup] = useState(false); useEffect(() => { const fetchExchangeRate = async () => { @@ -25,7 +28,7 @@ const PaymentComponent = ({ amount, onSuccess }) => { const response = await axios.get("https://apilayer.net/api/live", { params: { - access_key: "9bcb30907dee1cda9866f7b49f0f8def", + access_key: "", currencies: "USD", source: "INR", format: 1, @@ -54,19 +57,57 @@ const PaymentComponent = ({ amount, onSuccess }) => { fetchExchangeRate(); }, [amount]); - const handleApprove = async (data, actions) => { + const createOrder = async () => { try { - setIsProcessing(true); - const order = await actions.order.capture(); - onSuccess?.(order); - } catch (err) { - setError("Payment failed. Please try again."); - console.error("Payment error:", err); - } finally { - setIsProcessing(false); + const response = await axios.post("/api/razorpay/order", { + amount: amount * 100, // Amount in paise + currency: "INR", + }); + return response.data; + } catch (error) { + console.error("Error creating order:", error); + throw error; } }; + const handlePaymentSuccess = (response) => { + onSuccess?.(response); + }; + + const handleRazorpayPayment = async () => { + try { + const order = await createOrder(); + + const options = { + key: "rzp_test_1SbLmNX2nCKRZA", + amount: order.amount, + currency: order.currency, + name: "Rudraksha", + description: "", + order_id: order.id, + prefill: { + name: userData.name, + email: userData.email, + contact: userData.contact, + }, + handler: (response) => { + handlePaymentSuccess(response); // Pass the response to the success handler + }, + }; + + const razorpayInstance = new Razorpay(options); + razorpayInstance.open(); + } catch (error) { + setError("Payment failed. Please try again."); + console.error("Razorpay error:", error); + } + }; + + const handlePopupSubmit = () => { + setShowPopup(false); + handleRazorpayPayment(); + }; + if (!usdAmount) { return
- Note: We only ship to addresses in India, Malaysia, and Nepal. -
+ Note: We only ship to addresses in India, Malaysia, and Nepal. +
); }; diff --git a/components/shopping-cart/shoppingCart.jsx b/components/shopping-cart/shoppingCart.jsx index 09645e7..316e7bf 100644 --- a/components/shopping-cart/shoppingCart.jsx +++ b/components/shopping-cart/shoppingCart.jsx @@ -80,19 +80,29 @@ const ShoppingCart = () => { return