· ৬ মিনিটের পড়া
bKash, Nagad, SSLCommerz নাকি aamarPay? বাংলাদেশের পেমেন্ট গেটওয়ে নিয়ে ডেভেলপারদের গাইড
bKash, Nagad, SSLCommerz আর aamarPay ইন্টিগ্রেশন কীভাবে কাজ করে, কোথায় কোথায় আলাদা, আর Django বা Python ব্যাকএন্ডের জন্য কোনটা বেছে নেবেন।
বাংলাদেশে অ্যাপ বা অনলাইন স্টোর বানালে একটা সময় কেউ না কেউ জিজ্ঞেস করবেই: "কাস্টমাররা কি bKash দিয়ে পেমেন্ট করতে পারবে?" তারপর: "কার্ড?" আমি Django ব্যাকএন্ডে bKash, Nagad, SSLCommerz আর aamarPay ইন্টিগ্রেট করেছি। প্রথমবার কাজ করার সময় যে ছোট গাইডটা হাতে পেলে ভালো হতো, এই লেখাটা সেটাই।
সংক্ষেপে উত্তর
- আপনার কাস্টমাররা বেশির ভাগ bKash দিয়ে পেমেন্ট করে? সরাসরি bKash ইন্টিগ্রেট করুন।
- কার্ড, ইন্টারনেট ব্যাংকিং আর ওয়ালেট, সব একসাথে লাগবে? aggregator নিন: SSLCommerz বা aamarPay।
- নিজের admin panel থেকে রিফান্ড দিতে হবে? bKash আর SSLCommerz-এর পাবলিক ডকে refund API আছে।
- অনেক প্রজেক্টে দুটোই থাকে: সরাসরি bKash, আর বাকি সবকিছুর জন্য একটা aggregator।
সব গেটওয়ে যেভাবে কাজ করে
নাম বাদ দিলে চারটাই একই পাঁচ ধাপে চলে:
- আপনার server একটা পেমেন্ট তৈরি করে আর গেটওয়ের পেমেন্ট পেজের একটা লিংক ফেরত পায়।
- কাস্টমার গেটওয়ের পেজে পেমেন্ট করে, আপনার সাইটে কখনোই না। তাই কার্ড নম্বর আর PIN আপনার server-এ আসেই না।
- কাস্টমারকে আপনার সাইটে ফেরত পাঠানো হয় ফলাফলসহ।
- আপনার server গেটওয়ের কাছে ফলাফলটা আবার যাচাই করে, তারপর অর্ডার paid করে।
- চাইলে গেটওয়ে সরাসরি আপনার server-কেও জানায়, কাস্টমার যদি আর ফিরেই না আসে।
গোলমাল সবচেয়ে বেশি হয় ৪ নম্বর ধাপে। ৩ নম্বর ধাপের ফলাফল আসে কাস্টমারের ব্রাউজার দিয়ে, তাই যে কেউ সেটা নকল করতে পারে। প্রতিটা গেটওয়ের ডকুমেন্টেশন নিজের ভাষায় একই কথা বলে: server-to-server কনফার্ম করুন।
bKash
কার জন্য ভালো: যাদের কাস্টমার bKash ওয়ালেট থেকে পেমেন্ট করে। এটা শুধু bKash নেয়।
কীভাবে কাজ করে: bKash-এর recommended ফ্লো হলো Tokenized Checkout। আপনার server একটা access token নেয়, পেমেন্ট তৈরি করে, আর কাস্টমারকে bKash-এ redirect করে। সেখানে কাস্টমার ওয়ালেট নম্বর, OTP আর PIN দেয়। কাস্টমার ফিরে এলে আপনার server Execute Payment কল করে পেমেন্ট শেষ করে। সেভ করা ওয়ালেটের অপশনও আছে (পরের পেমেন্টে শুধু PIN লাগে), আবার এখন authorize করে পরে capture করার অপশনও আছে।
যা খেয়াল রাখবেন:
- Token-এর rate limit আছে। bKash ঘণ্টায় মাত্র দুইবার token request করতে দেয়। তাই token cache করুন আর আপনার server-গুলোর মধ্যে শেয়ার করুন।
- ফেরার পথে "success" মানেই পেমেন্ট হয়ে যাওয়া না। শুধু Execute Payment সফল হলে (বা পেমেন্ট query করলে "Completed" স্ট্যাটাস পেলে) বুঝবেন টাকা পেয়েছেন।
Refunds: সাপোর্ট আছে, পুরো বা আংশিক, ৬০ দিনের মধ্যে। Docs: developer.bka.sh
ধাপে ধাপে গাইড: Django-তে bKash Tokenized Checkout।
Nagad
কার জন্য ভালো: যাদের কাস্টমার Nagad ওয়ালেট থেকে পেমেন্ট করে।
সত্যি কথাটা: Nagad ওপেনভাবে merchant API ডকুমেন্টেশন পাবলিশ করে, এমন কিছু আমি খুঁজে পাইনি। অনলাইনে যা পাওয়া যায় সেটা কমিউনিটির লেখা কোড, অফিশিয়াল কিছু না, আর এই সিরিজে আমি শুধু অফিশিয়াল সোর্স ব্যবহার করি। তাই এখানে এখনো ধাপে ধাপে গাইড নেই।
Nagad ইন্টিগ্রেট করলে: merchant onboarding-এর সময় Nagad-এর কাছ থেকে integration specification আর sandbox access চেয়ে নিন, আর সেটা ধরেই কাজ করুন। কমিউনিটি প্যাকেজকে unofficial ধরে নিন: merchant key দেওয়ার আগে তাদের কোড পড়ে দেখুন। নিচের golden rules এখানেও খাটে।
SSLCommerz
কার জন্য ভালো: একটা ইন্টিগ্রেশনেই অনেক পেমেন্ট মেথড দিতে চাইলে: কার্ড, মোবাইল ব্যাংকিং (bKash সহ) আর ইন্টারনেট ব্যাংকিং।
কীভাবে কাজ করে: আপনার server একটা payment session তৈরি করে আর কাস্টমারকে SSLCommerz-এর পেজে redirect করে (অথবা তাদের checkout popup খোলে)। কাস্টমার একটা মেথড বেছে পেমেন্ট করে। এরপর SSLCommerz আপনার server-কে নোটিফাই করে, আর আপনার server তাদের Validation API দিয়ে পেমেন্টটা কনফার্ম করে।
যা খেয়াল রাখবেন:
- প্রতিটা পেমেন্ট validate করুন। Validation API থেকে শুধু "VALID" বা "VALIDATED" এলেই ধরবেন, আর amount আপনার অর্ডারের সাথে মিলছে কি না দেখে নিন।
- রিফান্ডের জন্য সেটআপ লাগে। রিফান্ড সাপোর্ট করে, কিন্তু live সিস্টেমে আপনার server-এর public IP SSLCommerz-এ রেজিস্টার করা থাকতে হবে।
Sandbox: নিজে সাইন আপ করে টেস্ট অ্যাকাউন্ট নিতে পারবেন। Docs: developer.sslcommerz.com
aamarPay
কার জন্য ভালো: আরেকটা all-in-one অপশন, যেখানে কার্ড, মোবাইল ব্যাংকিং, আর লোকাল ও ইন্টারন্যাশনাল ওয়ালেট আছে।
কীভাবে কাজ করে: আপনার server পেমেন্ট শুরু করে আর কাস্টমারকে aamarPay-তে redirect করে। কাস্টমারের পেমেন্ট শেষ হলে aamarPay ফলাফল আপনার সাইটে পাঠায়, আর আপনার server তাদের Search Transaction API দিয়ে সেটা কনফার্ম করে।
যা খেয়াল রাখবেন:
- পাবলিক ডকে refund API নেই। রিফান্ডের ওপর কিছু বানানোর আগে aamarPay-কে জিজ্ঞেস করে নিন।
- Django-র CSRF check callback আটকে দেবে, কারণ ফলাফলটা aamarPay-র সাইট থেকে POST হয়ে আসে। শুধু ওই view-টা exempt করুন। এতে server-side কনফার্মেশন আরও বেশি জরুরি হয়ে যায়।
Sandbox: ডকে পাবলিক টেস্ট credential দেওয়া আছে, তাই এখনই শুরু করতে পারবেন। Docs: aamarpay.readme.io
পাশাপাশি তুলনা
| bKash | Nagad | SSLCommerz | aamarPay | |
|---|---|---|---|---|
| পেমেন্ট মেথড | bKash ওয়ালেট | Nagad ওয়ালেট | কার্ড, ব্যাংক, ওয়ালেট | কার্ড, ব্যাংক, ওয়ালেট |
| পেমেন্ট কনফার্ম করার উপায় | Execute Payment | Nagad-এর spec থেকে | Validation API | Search Transaction |
| Refund API (পাবলিক ডকে) | আছে | জানা নেই | আছে | নেই |
| টেস্টিং শুরু | bKash-কে বলুন | Nagad-কে বলুন | নিজে সাইন আপ | পাবলিক টেস্ট অ্যাকাউন্ট |
কোনটা বেছে নেবেন?
- বেশির ভাগ কাস্টমার bKash দিয়ে পেমেন্ট করে: সরাসরি bKash নিন। ওয়ালেটের অভিজ্ঞতা সবচেয়ে স্মুথ পাবেন, সেভ করা ওয়ালেটসহ।
- কার্ডও লাগবে: aggregator নিন। একটা ইন্টিগ্রেশনেই একটা পেজে বেশির ভাগ পেমেন্ট মেথড পেয়ে যাবেন।
- সাপোর্ট স্টাফ admin panel থেকে রিফান্ড দেবে: refund API আছে এমন গেটওয়ে নিন (bKash বা SSLCommerz)।
- পরে দ্বিতীয় একটা গেটওয়ে যোগ করতে পারেন: এখন থেকেই সেটা ভেবে ডিজাইন করুন। একটাই
Paymenttable রাখুন, আর অর্ডারের লজিক গেটওয়ে-নিরপেক্ষ রাখুন, প্রতিটা গেটওয়ের জন্য ছোট একটা adapter দিয়ে।
ফি, settlement-এর সময় আর কন্ট্রাক্ট হলো ব্যবসায়িক শর্ত, তাই এগুলো প্রতিটা প্রোভাইডারের কাছ থেকে লিখিতভাবে নিন।
Golden rules
- শুধু redirect দেখে কখনো অর্ডার paid করবেন না। সবসময় আপনার server থেকে গেটওয়ের কাছে কনফার্ম করুন।
- গেটওয়ে যে amount, currency আর order reference ফেরত দেয়, সেটা আপনার প্রত্যাশার সাথে মিলিয়ে দেখুন।
- অর্ডার ঠিক একবারই paid করুন। কাস্টমার রিফ্রেশ করে, নোটিফিকেশন retry হয়, আর দুটো একসাথেও আসতে পারে। Django-তে
transaction.atomic-এর ভেতরেselect_for_updateদিয়ে payment row lock করুন, আর আগেই paid হয়ে থাকলে skip করুন। - গেটওয়ের transaction ID সেভ রাখুন। সাপোর্ট আর রিফান্ডে লাগবে।
- Credential রাখুন server-এর environment variable-এ, আর লগ থেকে দূরে রাখুন।
তথ্যের নির্ভুলতা নিয়ে
এখানকার সবকিছু প্রতিটা গেটওয়ের অফিশিয়াল পাবলিক ডকুমেন্টেশন থেকে নেওয়া, ৩ নভেম্বর ২০২৬ অনুযায়ী। গেটওয়েরা তাদের API বদলায়, তাই আসল টাকা নেওয়ার আগে লেটেস্ট ডক দেখে নিন আর sandbox-এ টেস্ট করুন।
সিরিজের পরের লেখা: সম্পূর্ণ Django-তে bKash Tokenized Checkout ইন্টিগ্রেশন, তারপর SSLCommerz আর aamarPay। অফিশিয়াল ডকুমেন্টেশন থেকে কাজ করতে পারলে Nagad আসবে।