From 9d097a4f7d9d01728a911bc7d00460c96cef33fe Mon Sep 17 00:00:00 2001 From: Aditya Agrawal Date: Thu, 30 Oct 2025 17:05:27 +0530 Subject: [PATCH] feat: added payment gateway system --- .../PaymentGatewayApplication.cpp | 313 ++++++++++++++++++ Src/Payment_gateway_system/compile.bat | 17 + .../payment_gateway.exe | Bin 0 -> 72639 bytes 3 files changed, 330 insertions(+) create mode 100644 Src/Payment_gateway_system/PaymentGatewayApplication.cpp create mode 100644 Src/Payment_gateway_system/compile.bat create mode 100644 Src/Payment_gateway_system/payment_gateway.exe diff --git a/Src/Payment_gateway_system/PaymentGatewayApplication.cpp b/Src/Payment_gateway_system/PaymentGatewayApplication.cpp new file mode 100644 index 0000000..6440cfd --- /dev/null +++ b/Src/Payment_gateway_system/PaymentGatewayApplication.cpp @@ -0,0 +1,313 @@ +#include +#include +#include +#include + + +using namespace std; + +// ---------------------------- +// Data structure for payment details +// ---------------------------- +struct PaymentRequest { + string sender; + string reciever; + double amount; + string currency; + + PaymentRequest(const string& sender, const string& reciever, double amt, const string& curr) { + this->sender = sender; + this->reciever = reciever; + this->amount = amt; + this->currency = curr; + } +}; + +// ---------------------------- +// Banking System interface and implementations (Strategy for actual payment logic) +// ---------------------------- +class BankingSystem { +public: + virtual bool processPayment(double amount) = 0; + virtual ~BankingSystem() {} +}; + +class PaytmBankingSystem : public BankingSystem { +public: + PaytmBankingSystem() {} + bool processPayment(double amount) override { + // Simulate 20% success + int r = rand() % 100; + return r < 80; + } +}; + +class RazorpayBankingSystem : public BankingSystem { +public: + RazorpayBankingSystem() {} + bool processPayment(double amount) override { + cout << "[BankingSystem-Razorpay] Processing payment of " << amount << "...\n"; + // Simulate 90% success + int r = rand() % 100; + return r < 90; + } +}; + +// ---------------------------- +// Abstract base class for Payment Gateway (Template Method Pattern) +// ---------------------------- +class PaymentGateway { +protected: + BankingSystem* bankingSystem; +public: + PaymentGateway() { + bankingSystem = nullptr; + } + virtual ~PaymentGateway() { + delete bankingSystem; + } + + // Template method defining the standard payment flow + virtual bool processPayment(PaymentRequest* request) { + if (!validatePayment(request)) { + cout << "[PaymentGateway] Validation failed for " << request->sender << ".\n"; + return false; + } + if (!initiatePayment(request)) { + cout << "[PaymentGateway] Initiation failed for " << request->sender << ".\n"; + return false; + } + if (!confirmPayment(request)) { + cout << "[PaymentGateway] Confirmation failed for " << request->sender << ".\n"; + return false; + } + return true; + } + + // Steps to be implemented by concrete gateways + virtual bool validatePayment(PaymentRequest* request) = 0; + virtual bool initiatePayment(PaymentRequest* request) = 0; + virtual bool confirmPayment(PaymentRequest* request) = 0; +}; + +// ---------------------------- +// Concrete Payment Gateway for Paytm +// ---------------------------- +class PaytmGateway : public PaymentGateway { +public: + PaytmGateway() { + bankingSystem = new PaytmBankingSystem(); + } + bool validatePayment(PaymentRequest* request) override { + cout << "[Paytm] Validating payment for " << request->sender << ".\n"; + + if (request->amount <= 0 || request->currency != "INR") { + return false; + } + return true; + } + bool initiatePayment(PaymentRequest* request) override { + cout << "[Paytm] Initiating payment of " << request->amount + << " " << request->currency << " for " << request->sender << ".\n"; + + return bankingSystem->processPayment(request->amount); + } + bool confirmPayment(PaymentRequest* request) override { + cout << "[Paytm] Confirming payment for " << request->sender << ".\n"; + + // Confirmation always succeeds in this simulation + return true; + } +}; + +// ---------------------------- +// Concrete Payment Gateway for Razorpay +// ---------------------------- +class RazorpayGateway : public PaymentGateway { +public: + RazorpayGateway() { + bankingSystem = new RazorpayBankingSystem(); + } + bool validatePayment(PaymentRequest* request) override { + cout << "[Razorpay] Validating payment for " << request->sender << ".\n"; + + if (request->amount <= 0) { + return false; + } + return true; + } + bool initiatePayment(PaymentRequest* request) override { + cout << "[Razorpay] Initiating payment of " << request->amount + << " " << request->currency << " for " << request->sender << ".\n"; + + return bankingSystem->processPayment(request->amount); + + } + bool confirmPayment(PaymentRequest* request) override { + cout << "[Razorpay] Confirming payment for " << request->sender << ".\n"; + + // Confirmation always succeeds in this simulation + return true; + } +}; + +// ---------------------------- +// Proxy class that wraps a PaymentGateway to add retries (Proxy Pattern) +// ---------------------------- +class PaymentGatewayProxy : public PaymentGateway { + PaymentGateway* realGateway; + int retries; +public: + PaymentGatewayProxy(PaymentGateway* gateway, int maxRetries) { + realGateway = gateway; + retries = maxRetries; + } + ~PaymentGatewayProxy() { + delete realGateway; + } + bool processPayment(PaymentRequest* request) override { + bool result = false; + for (int attempt = 0; attempt < retries; ++attempt) { + if (attempt > 0) { + cout << "[Proxy] Retrying payment (attempt " << (attempt+1) + << ") for " << request->sender << ".\n"; + } + result = realGateway->processPayment(request); + if (result) break; + } + if (!result) { + cout << "[Proxy] Payment failed after " << (retries) + << " attempts for " << request->sender << ".\n"; + } + return result; + } + bool validatePayment(PaymentRequest* request) override { + return realGateway->validatePayment(request); + } + bool initiatePayment(PaymentRequest* request) override { + return realGateway->initiatePayment(request); + } + bool confirmPayment(PaymentRequest* request) override { + return realGateway->confirmPayment(request); + } +}; + +// ---------------------------- +// Gateway Factory for creating gateway (Singleton) +// ---------------------------- +enum class GatewayType { + PAYTM, + RAZORPAY +}; + +class GatewayFactory { +private: + static GatewayFactory instance; + // Private constructor and delete copy/assignment to ensure no one can clone or reassign your singleton. + GatewayFactory() {} + GatewayFactory(const GatewayFactory&) = delete; + GatewayFactory& operator=(const GatewayFactory&) = delete; + +public: + static GatewayFactory& getInstance() { + return instance; + } + PaymentGateway* getGateway(GatewayType type) { + if (type == GatewayType::PAYTM) { + PaymentGateway* paymentGateway = new PaytmGateway(); + return new PaymentGatewayProxy(paymentGateway, 3); + } else { + PaymentGateway* paymentGateway = new RazorpayGateway(); + return new PaymentGatewayProxy(paymentGateway, 1); + } + } +}; + +// define static instance +GatewayFactory GatewayFactory::instance; + +// ---------------------------- +// Unified API service (Singleton) +// ---------------------------- +class PaymentService { +private: + static PaymentService instance; + PaymentGateway* gateway; + + PaymentService() { + gateway = nullptr; + } + ~PaymentService() { + delete gateway; + } + + // Private constructor and delete copy/assignment to ensure no one can clone or reassign your singleton. + PaymentService(const PaymentService&) = delete; + PaymentService& operator=(const PaymentService&) = delete; + +public: + static PaymentService& getInstance() { + return instance; + } + void setGateway(PaymentGateway* g) { + if (gateway) delete gateway; + gateway = g; + } + bool processPayment(PaymentRequest* request) { + if (!gateway) { + cout << "[PaymentService] No payment gateway selected.\n"; + return false; + } + return gateway->processPayment(request); + } +}; + +PaymentService PaymentService::instance; + +// ---------------------------- +// Controller class for all client requests (Singleton) +// ---------------------------- +class PaymentController { +private: + static PaymentController instance; + PaymentController() {} + PaymentController(const PaymentController&) = delete; + PaymentController& operator=(const PaymentController&) = delete; +public: + static PaymentController& getInstance() { + return instance; + } + bool handlePayment(GatewayType type, PaymentRequest* req) { + PaymentGateway* paymentGateway = GatewayFactory::getInstance().getGateway(type); + PaymentService::getInstance().setGateway(paymentGateway); + return PaymentService::getInstance().processPayment(req); + } +}; + +PaymentController PaymentController::instance; + +// ---------------------------- +// Main: Client code now goes through controller +// ---------------------------- +int main() { + + srand(static_cast(time(nullptr))); + + PaymentRequest* req1 = new PaymentRequest("Aditya", "Shubham", 1000.0, "INR"); + + cout << "Processing via Paytm\n"; + cout << "------------------------------\n"; + bool res1 = PaymentController::getInstance().handlePayment(GatewayType::PAYTM, req1); + cout << "Result: " << (res1 ? "SUCCESS" : "FAIL") << "\n"; + cout << "------------------------------\n\n"; + + PaymentRequest* req2 = new PaymentRequest("Shubham", "Aditya", 500.0, "USD"); + + cout << "Processing via Razorpay\n"; + cout << "------------------------------\n"; + bool res2 = PaymentController::getInstance().handlePayment(GatewayType::RAZORPAY, req2); + cout << "Result: " << (res2 ? "SUCCESS" : "FAIL") << "\n"; + cout << "------------------------------\n"; + + return 0; +} diff --git a/Src/Payment_gateway_system/compile.bat b/Src/Payment_gateway_system/compile.bat new file mode 100644 index 0000000..cb7bc44 --- /dev/null +++ b/Src/Payment_gateway_system/compile.bat @@ -0,0 +1,17 @@ +@echo off +echo C++ Payment Gateway Application... + +REM Compile the main program +g++ -std=c++11 -o payment_gateway PaymentGatewayApplication.cpp + +if %errorlevel% equ 0 ( + echo Compilation successful! + echo Running the Payment Gateway application... + echo. + payment_gateway.exe +) else ( + echo Compilation failed! + echo Please check for any syntax errors. +) + +pause diff --git a/Src/Payment_gateway_system/payment_gateway.exe b/Src/Payment_gateway_system/payment_gateway.exe new file mode 100644 index 0000000000000000000000000000000000000000..662c9f1c68c0a145e75decc46bfd0510ca159c5e GIT binary patch literal 72639 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 literal 0 HcmV?d00001