৪৫. ফুল-স্ট্যাক ই-কমার্স ওয়েবসাইট (E-commerce Web App)
আপনি যদি ওয়েব ডেভেলপমেন্টে ক্যারিয়ার গড়তে চান, তবে পোর্টফোলিওতে একটি ফুল-স্ট্যাক ই-কমার্স ওয়েবসাইট থাকা বাধ্যতামূলক। শুধুমাত্র ফ্রন্টএন্ড ডিজাইন করলেই হবে না, রিয়েল-ওয়ার্ল্ড ই-কমার্সে ডাটাবেস ম্যানেজমেন্ট এবং পেমেন্ট গেটওয়ে (Payment Gateway) অ্যাড করা খুবই গুরুত্বপূর্ণ।
এই প্রজেক্টে আমরা Django ফ্রেমওয়ার্ক এবং Stripe পেমেন্ট গেটওয়ে ব্যবহার করে একটি ই-কমার্স স্টোরের চেকআউট (Checkout) বা পেমেন্ট সিস্টেম তৈরি করবো।
কীভাবে কাজ করে? (How it works):
- Product Database: জ্যাঙ্গো (Django) এর মডেল (Model) ব্যবহার করে ডাটাবেসে প্রোডাক্টের নাম এবং দাম সেভ করা হবে।
- Checkout Page: ইউজার যখন কোনো প্রোডাক্ট কেনার জন্য 'Buy Now' বাটনে ক্লিক করবে, তখন সে একটি চেকআউট পেইজে চলে যাবে।
- Stripe Integration: পেমেন্টের জন্য আমরা ইউজারের ক্রেডিট কার্ডের ডেটা সরাসরি আমাদের ডাটাবেসে সেভ করবো না (এটি রিস্কি)। আমরা Stripe API ব্যবহার করে সিকিউরডভাবে পেমেন্ট প্রসেস করবো।
- Order Confirmation: পেমেন্ট সফল হলে ইউজারের অর্ডার কনফার্ম করে ডাটাবেসে সেভ করা হবে এবং তাকে একটি Success পেইজে পাঠিয়ে দেওয়া হবে।
প্রয়োজনীয় লাইব্রেরি (Libraries):
টার্মিনালে নিচের কমান্ডটি লিখে লাইব্রেরিগুলো ইনস্টল করে নিন:
pip install django stripe
প্রজেক্টের কোড:
পুরো জ্যাঙ্গো প্রজেক্ট একটি ফাইলে লেখা সম্ভব নয়, তবে নিচে ই-কমার্সের সবচেয়ে গুরুত্বপূর্ণ অংশ—পেমেন্ট ভিউ (Payment View) এর লজিক দেওয়া হলো:
import stripe
from django.shortcuts import render, redirect
from django.conf import settings
from django.http import JsonResponse
from .models import Product, Order
# আপনার Stripe সিক্রেট কি (Secret Key) সেট করুন
stripe.api_key = settings.STRIPE_SECRET_KEY
def checkout(request, product_id):
"""ইউজারকে চেকআউট পেইজ দেখানো"""
product = Product.objects.get(id=product_id)
context = {
'product': product,
# ফ্রন্টএন্ডে কার্ডের ইনফো নেওয়ার জন্য পাবলিক কি দরকার
'stripe_public_key': settings.STRIPE_PUBLIC_KEY
}
return render(request, 'store/checkout.html', context)
def process_payment(request, product_id):
"""Stripe এর মাধ্যমে পেমেন্ট প্রসেস করা"""
if request.method == 'POST':
product = Product.objects.get(id=product_id)
# ফ্রন্টএন্ড থেকে আসা Stripe টোকেন
stripe_token = request.POST.get('stripeToken')
try:
# Stripe এ কাস্টমারের পেমেন্ট চার্জ করা
charge = stripe.Charge.create(
# Stripe এ টাকার অ্যামাউন্ট সেন্ট (Cent) এ হিসাব হয়, তাই ১০০ দিয়ে গুণ
amount=int(product.price * 100),
currency='usd',
description=f'Payment for {product.name}',
source=stripe_token,
)
# পেমেন্ট সফল হলে ডাটাবেসে অর্ডার সেভ করা
if charge.paid:
Order.objects.create(
product=product,
customer_email=request.POST.get('email'),
amount_paid=product.price,
status='Completed'
)
# পেমেন্ট সাকসেস পেইজে পাঠিয়ে দেওয়া
return redirect('payment_success')
except stripe.error.CardError as e:
# কার্ডে ব্যালেন্স না থাকলে বা ভুল হলে
body = e.json_body
err = body.get('error', {})
print(f"Card Error: {err.get('message')}")
return redirect('payment_failed')
except Exception as e:
# অন্য যেকোনো সার্ভার এরর
print(f"Server Error: {e}")
return redirect('payment_failed')
return redirect('home')
def payment_success(request):
"""পেমেন্ট সফল হওয়ার পর থ্যাংক ইউ পেইজ"""
return render(request, 'store/success.html')
কোডটি কীভাবে শিখবেন?
- Django Models:
Product.objects.get(id=product_id)এর মাধ্যমে আমরা ডাটাবেস (SQL) থেকে নির্দিষ্ট আইডি ধরে একটি প্রোডাক্টের তথ্য খুঁজে বের করেছি। জ্যাঙ্গোতে ডাটাবেস হ্যান্ডেল করা খুবই সহজ! - Stripe Token: পেমেন্ট করার সময় ইউজারের কার্ড নম্বর আমাদের সার্ভারে আসে না। ফ্রন্টএন্ড থেকে Stripe সরাসরি ডেটা নিয়ে আমাদের শুধু একটি ইউনিক টোকেন (
stripe_token) দেয়। এটি হ্যাকিংয়ের ঝুঁকি শূন্য করে দেয়। - Error Handling (try-except): পেমেন্টের সময় নানা সমস্যা হতে পারে (যেমন ইউজারের কার্ড ব্লক থাকা)। তাই আমরা
try-exceptব্যবহার করেstripe.error.CardErrorগুলো ক্যাচ (Catch) করেছি, যেন সমস্যা হলে ওয়েবসাইট ক্র্যাশ না করে বরং ইউজারকে সুন্দর একটি মেসেজ দেখায়।
[!TIP] লোকাল পেমেন্ট গেটওয়ে: আপনি যদি বাংলাদেশের জন্য ওয়েবসাইট বানান, তবে Stripe এর বদলে SSLCommerz বা aamarPay এর API ব্যবহার করতে পারেন। তাদের ডকুমেন্টেশন দেখে ঠিক এভাবেই API রিকোয়েস্ট পাঠাতে হয়।