हम बैकएंड के लिए NodeJs
और अपने डेटाबेस के रूप में Postgres का उपयोग करेंगे। फ्रंटएंड पर हम vite
के साथ ReactJs
उपयोग कर रहे हैं।
इसके लिए हमें 2 अलग-अलग रिपॉजिटरी बनाने की आवश्यकता होगी, एक हमारे backend
के लिए और दूसरा frontend
के लिए।
अब, चलिए शुरू करते हैं।
हमारा टेम्प्लेट एक बुनियादी Node.js
एप्लिकेशन और एक डॉकराइज्ड PostgreSQL
डेटाबेस को समाहित करता है।
यहां हमारे सेटअप के लिए संबंधित docker-compose.yaml
फ़ाइल है:
version: "3" services: app: build: context: . target: development env_file: .env volumes: - ./src:/usr/src/app/src ports: - 8081:80 depends_on: - db db: image: postgres:14 restart: always environment: POSTGRES_USER: admin POSTGRES_PASSWORD: admin POSTGRES_DB: my-startup-db volumes: - postgres-data:/var/lib/postgresql/data ports: - 5432:5432 volumes: postgres-data:
npm install bcrypt cookie-parser cors jsonwebtoken pg-hstore stripe
यहां हम डेमो के लिए Test Mode
उपयोग करेंगे।
यहां उन पर्यावरण चरों की सूची दी गई है जिनकी हमें इस परियोजना के लिए आवश्यकता होगी।
.env.example
STRIPE_PUBLISHABLE_KEY= STRIPE_SECRET_KEY= POSTGRES_DB_URI= secretKey= CLIENT_URL=
models/userModel.js
module.exports = (sequelize, DataTypes) => { const User = sequelize.define( "user", { email: { type: DataTypes.STRING, unique: true, isEmail: true, //checks for email format allowNull: false, }, password: { type: DataTypes.STRING, allowNull: false, }, tier: { type: DataTypes.STRING, allowNull: true, }, }, { timestamps: true } ); return User; };
POST /login
- उपयोगकर्ता को लॉग इन करने और सत्र को संग्रहीत करने में मदद करता है
POST /signup
- एक नया खाता बनाने में मदद करता है
POST /create-checkout-session
- स्ट्राइप चेकआउट पेज लिंक जेनरेट और लौटाता है
routes/userRoutes.js
const express = require("express"); const userController = require("../controllers/userController"); const { signup, login } = userController; const userAuth = require("../middleware/userAuth"); const router = express.Router(); router.post("/signup", userAuth.saveUser, signup); router.post("/login", login); module.exports = router;
routes/stripeRoute.js
const express = require("express"); const { updatePlan } = require("../controllers/stripeController"); const router = express.Router(); router.post("/create-checkout-session", updatePlan); module.exports = router;
middleware/userAuth.js
//importing modules const express = require("express"); const db = require("../models"); const User = db.users; const saveUser = async (req, res, next) => { console.log("here"); try { const checkEmail = await User.findOne({ where: { email: req.body.email, }, }); if (checkEmail) { return res.json(409).send("Authentication failed"); } next(); } catch (error) { console.log(error); } }; module.exports = { saveUser, };
controllers/userController.js
const bcrypt = require("bcrypt"); const db = require("../models"); const jwt = require("jsonwebtoken"); const User = db.users; const signup = async (req, res) => { try { const { email, password } = req.body; console.log(email); const data = { email, password: await bcrypt.hash(password, 10), }; //saving the user const user = await User.create(data); if (user) { let token = jwt.sign({ id: user.id }, process.env.secretKey, { expiresIn: 1 * 24 * 60 * 60 * 1000, }); res.cookie("jwt", token, { maxAge: 1 * 24 * 60 * 60, httpOnly: true }); console.log("user", JSON.stringify(user, null, 2)); console.log(token); return res.status(201).send(user); } else { return res.status(409).send("Details are not correct"); } } catch (error) { console.log(error); } }; // Login Authentication const login = async (req, res) => { try { const { email, password } = req.body; const user = await User.findOne({ where: { email: email, }, }); if (user) { const isSame = await bcrypt.compare(password, user.password); if (isSame) { let token = jwt.sign({ id: user.id }, process.env.secretKey, { expiresIn: 1 * 24 * 60 * 60 * 1000, }); res.cookie("jwt", token, { maxAge: 1 * 24 * 60 * 60, httpOnly: true }); //send user data return res.status(201).send(user); } else { return res.status(401).send("Authentication failed"); } } else { return res.status(401).send("Authentication failed"); } } catch (error) { console.log(error); } }; module.exports = { signup, login, };
यहीं पर हम Stripe Checkout
अपने एप्लिकेशन में एकीकृत करेंगे।
हम भुगतान प्रबंधित करने और उपयोगकर्ता सदस्यताएँ संभालने के लिए Stripe API
उपयोग करेंगे।
controllers/stripeController.js
const db = require("../models"); const Stripe = require("stripe"); const User = db.users; require("dotenv").config(); const stripe = Stripe(process.env.STRIPE_SECRET_KEY); const updatePlan = async (req, res) => { try { const { email, product } = req.body; const session = await stripe.checkout.sessions.create({ payment_method_types: ["card"], line_items: [ { price_data: { currency: "usd", product_data: { name: product.name, }, unit_amount: product.price * 100, }, quantity: product.quantity, }, ], mode: "payment", success_url: `${process.env.CLIENT_URL}/success`, cancel_url: `${process.env.CLIENT_URL}/`, }); //find a user by their email const user = await User.findOne({ where: { email: email, }, }); if (user) { await user.update({ tier: product.name }); return res.send({ url: session.url }); } else { return res.status(401).send("User not found"); } } catch (error) { console.log(error); } }; module.exports = { updatePlan, };
अंत में, हमें अपने सभी मार्गों को अपने प्रवेश बिंदु, जो कि server.js
है, में जोड़ना होगा
server.js
const cors = require("cors"); const express = require("express"); require("dotenv").config(); const cookieParser = require("cookie-parser"); const db = require("./models"); const userRoutes = require("./routes/userRoutes"); const PORT = process.env.PORT || 8080; const stripeRoute = require("./routes/stripeRoute"); const app = express(); // Middlewares app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cookieParser()); app.use(cors()); // Routes app.use("/api/v1/users", userRoutes); app.use("/api/v1/stripe", stripeRoute); app.listen(PORT, () => { console.log("Server started at port 8080"); try { db.sequelize.sync({ force: true }).then(() => { console.log("db has been re sync"); }); } catch (error) {} });
अब आगे बढ़ते हैं और इसे FL0
पर तैनात करने का प्रयास करते हैं। 🔼
यहां हमें एक नया प्रोजेक्ट बनाने की आवश्यकता होगी, उदाहरण के लिए इसे stripe-fl0
नाम दें।
इसमें वह सब कुछ शामिल है जो हमें अपने React-Vite
प्रोजेक्ट को शुरू करने और चलाने के लिए चाहिए।
npm install @heroicons/react axios react-router-dom npm install postcss tailwindcss autoprefixer --save-dev
src/components/PricingPlans.jsx
... const handleCheckout = (product) => { axios .post( `//stripe-fl0-backend-dev.fl0.io/api/v1/stripe/create-checkout-session`, { email, product, } ) .then((res) => { if (res.data.url) { setTier(product.name); localStorage.setItem("tier", product.name); window.location.href = res.data.url; } }) .catch((err) => navigate("/cancel")); }; ...
यह फ़ंक्शन हमारे बैकएंड के /create-checkout-session
रूट को कॉल करता है, एक लिंक प्राप्त करता है, और उपयोगकर्ता को चेकआउट पेज पर रीडायरेक्ट करता है। 📄
इसके अलावा, हमें अपने signup
और login
पेजों को संबंधित मार्गों से कनेक्ट करने और उपयोगकर्ता डेटा को localstorage
में संग्रहीत करने की भी आवश्यकता है।
फिर हमें फ्रंटएंड परिनियोजन में VITE_APP_API_BASE_URL
पर्यावरण चर जोड़ने की आवश्यकता होगी जिसे हमारे बैकएंड के URL पर सेट किया जाना चाहिए।
हमें फ्रंटएंड के होस्टेड यूआरएल के बैकएंड में CLIENT_URL
पर्यावरण चर भी सेट करने की आवश्यकता होगी।
इस ट्यूटोरियल में, हमने सीखा कि Stripe Checkout
हमारे फुल-स्टैक एप्लिकेशन में आसानी से एकीकृत करके भुगतान पेज कैसे बनाया जाए। 🎉