diff --git a/server/package-lock.json b/server/package-lock.json index 78af72c..ebf43c0 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -9,8 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@clerk/clerk-sdk-node": "^4.13.23", - "@clerk/express": "^1.7.2", + "@clerk/express": "^1.7.15", "cloudinary": "^2.7.0", "cors": "^2.8.5", "dotenv": "^16.6.1", @@ -25,13 +24,13 @@ } }, "node_modules/@clerk/backend": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-2.14.0.tgz", - "integrity": "sha512-EaPXIaOb3IVyn+3NRX9GVZeKk1eL1ugWOiyPzy7hfJvxRYhTBatZrwd32+nCkQ6igvRpRG4O+o5vWS1tSErbrg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-2.6.2.tgz", + "integrity": "sha512-IUTjLmA1QkqoJnB97S8Ay/oeFR1QtBxxzi9V2J8zncGdUUpAHRp9PfbUwe203VEZuoDD8n6PGfK4oiiq5CoKhQ==", "license": "MIT", "dependencies": { - "@clerk/shared": "^3.25.0", - "@clerk/types": "^4.86.0", + "@clerk/shared": "^3.17.0", + "@clerk/types": "^4.72.0", "cookie": "1.0.2", "standardwebhooks": "^1.0.0", "tslib": "2.8.1" @@ -183,6 +182,14 @@ "license": "0BSD" }, "node_modules/@clerk/express": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@clerk/express/-/express-1.7.15.tgz", + "integrity": "sha512-75yh1fAl8rjPcHZKR0FT84yJLyOaAIOufHLs0SBkGVzYSX+V6pZpriiuh3QtAeXR8gSxQKF5/qMzDKpqUa/nCA==", + "license": "MIT", + "dependencies": { + "@clerk/backend": "^2.6.2", + "@clerk/shared": "^3.17.0", + "@clerk/types": "^4.72.0", "version": "1.7.31", "resolved": "https://registry.npmjs.org/@clerk/express/-/express-1.7.31.tgz", "integrity": "sha512-qG2eoPKxWPwjPjMv3nJtZt+dZpryVsAfpLY7zFkCDC68U/JLjNwEfZQP6CFMgMHDlqHSJX01H1ItciHJPdTM3A==", @@ -201,6 +208,13 @@ } }, "node_modules/@clerk/shared": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-3.17.0.tgz", + "integrity": "sha512-eYbA0xmKG1DluFmdVykXiElgZGTpCruEyXmIBAwokpxypd5nOpDsS1xvEKwYvZieLTZkFz21Z3Y6HdDI5cPxBQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@clerk/types": "^4.72.0", "version": "3.25.0", "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-3.25.0.tgz", "integrity": "sha512-2Vb6NQqBA+1g7kfGct/OlSFmzU54/s4BQp3qeHwDqW1FgaU4MuXbqfBClI6AatxOC8Ux8W16Rvf705ViwFSxlw==", @@ -231,6 +245,9 @@ } }, "node_modules/@clerk/types": { + "version": "4.72.0", + "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.72.0.tgz", + "integrity": "sha512-SEkgiQNeTstC0/mQjHCGBEyX0/ALyWAa5QZBBvVOok204r48MLipfIKsXQhyWE2Hk6FIo5WT6YyqD36jaxUEIw==", "version": "4.86.0", "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.86.0.tgz", "integrity": "sha512-YFaOYIAZWbpXehAmtgUB0YNf1v5b/hlwePvdqxlD5vdwrNsap28RpupWZat0hp1+PTtb9uAwSa5AFCOxkYLUJQ==", @@ -499,6 +516,9 @@ "license": "MIT" }, "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "version": "1.12.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", @@ -883,16 +903,6 @@ "node": ">=6" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", @@ -1099,6 +1109,9 @@ } }, "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "version": "3.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", @@ -1108,6 +1121,7 @@ "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", + "mime-types": "^2.1.12" "mime-types": "^2.1.35" }, "engines": { @@ -1736,16 +1750,6 @@ "node": ">= 0.6" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -2034,9 +2038,9 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", "peer": true, "dependencies": { @@ -2268,29 +2272,6 @@ "node": ">=10" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/snakecase-keys": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-3.2.1.tgz", - "integrity": "sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==", - "license": "MIT", - "dependencies": { - "map-obj": "^4.1.0", - "to-snake-case": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -2467,18 +2448,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", diff --git a/server/package.json b/server/package.json index 24f3de5..8ffcfe4 100644 --- a/server/package.json +++ b/server/package.json @@ -12,6 +12,7 @@ "author": "", "license": "ISC", "dependencies": { + "@clerk/express": "^1.7.15", "@clerk/clerk-sdk-node": "^4.13.23", "@clerk/express": "^1.7.2", "cloudinary": "^2.7.0", diff --git a/server/routes/payments.js b/server/routes/payments.js new file mode 100644 index 0000000..5886b8e --- /dev/null +++ b/server/routes/payments.js @@ -0,0 +1,52 @@ +import express from "express"; +import Razorpay from "razorpay"; +import dotenv from "dotenv"; +import crypto from "crypto"; +const router=express.Router(); +router.post("/orders",async(req,res)=>{ + try{ + const instance=new Razorpay({ + key_id:process.env.KEY_ID, + key_secret:process.env.KEY_SECRET + }) + const options={ + amount:req.body.amount*100, + currency:"INR", + receipt:crypto.randomBytes(10).toString("hex") + } + instance.orders.create(options,(error,order)=>{ + if(error){ + return res.status(500).json({message:"Something went wrong"}) + } + else{ + return res.status(200).json({order}) + } + }) + + }catch(error){ + return res.status(500).json({message:"Intenal server error"}) + } +}) +router.post("/verify",async(req,res)=>{ + try{ + const{ + razorpay_orderID, + razorpay_paymentID, + razorpay_signature + }=req.body + const sign=razorpay_orderID+"|"+razorpay_paymentID + const resultSign=crypto.createHmac("sha256",process.env.KEY_SECRET).update(sign.toString()).digest("hex"); + if(razorpay_signature==resultSign){ + return res.status(200).json({message:"Payment verified successfully"}) + } + else{ + return res.status(500).json({message:"Payment failed"}) + } + + } + catch(error){ + console.log(error); + res.status(400).json({message:"Internal Server Error"}) + } +}) +export default router; diff --git a/server/sample.env b/server/sample.env index 2af365c..130a56f 100644 --- a/server/sample.env +++ b/server/sample.env @@ -1,7 +1,9 @@ MONGODB_URI = database_uri - +PORT=5000 #Clerk Keys CLERK_PUBLISHABLE_KEY=your_publishable_key -CLERK_SECRET_KEY=your_secret_key -CLERK_WEBHOOK_SECRET=your_webhook_key \ No newline at end of file +CLERK_SECRET_KEY=your_clerk_secret +CLERK_WEBHOOK_SECRET=your_webhook_key +KEY_ID=your_key +KEY_SECRET=your_secret \ No newline at end of file diff --git a/server/server.js b/server/server.js index ae73561..4c4b1d5 100644 --- a/server/server.js +++ b/server/server.js @@ -1,3 +1,10 @@ +import express from "express"; +import "dotenv/config"; +import cors from "cors"; +import connectDB from "./configs/db.js"; +import { clerkMiddleware } from '@clerk/express' +import clerkWebhooks from "./controllers/clerkWebhooks.js"; +import paymentRoute from "./routes/payments.js" import express from 'express'; import cors from 'cors'; import dotenv from 'dotenv'; @@ -26,6 +33,10 @@ app.post('/api/webhooks/clerk', express.raw({type: 'application/json'}), clerkWe // Regular JSON parsing app.use(express.json()); +app.use('/api/clerk', clerkWebhooks); +app.use("/api/payment",paymentRoute); +app.get('/', (req, res) => { + res.send("API is Up and running"); // Attach Clerk middleware (parses auth tokens) app.use(clerkMiddleware());