Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/programforrever/ecom/llms.txt

Use this file to discover all available pages before exploring further.

Overview

SSLCommerz is Bangladesh’s largest payment gateway provider, supporting multiple payment methods including cards, mobile wallets, internet banking, and mobile banking. The platform is essential for e-commerce businesses operating in Bangladesh.

Prerequisites

  • SSLCommerz merchant account (Sign up here)
  • Store credentials (Store ID, Store Password)
  • Valid business registration in Bangladesh

Configuration

Step 1: Get SSLCommerz Credentials

1

Create Merchant Account

Register at SSLCommerz and complete merchant onboarding
2

Get Sandbox Credentials

SSLCommerz provides sandbox credentials for testing
3

Note Your Credentials

You’ll receive:
  • Store ID
  • Store Password
  • API endpoint URLs

Step 2: Configure Environment Variables

Add SSLCommerz credentials to your .env file:
.env
# SSLCommerz Configuration (Add to .env if needed)
# Note: SSLCommerz credentials are typically managed in business settings
SSLCOMMERZ_STORE_ID=your_store_id
SSLCOMMERZ_STORE_PASSWORD=your_store_password
SSLCOMMERZ_SANDBOX=true  # Set to false for production
SSLCommerz configuration may also be stored in database business settings. Check your admin panel for configuration options.

Implementation Details

Controller Location

app/Http/Controllers/Payment/SslcommerzController.php

SSLCommerz Helper Class

app/Http/Controllers/SSLCommerz.php

Payment Flow

1

Prepare Payment Data

System prepares transaction data with customer and order information
app/Http/Controllers/Payment/SslcommerzController.php
public function pay(Request $request)
{
    if (Session::has('payment_type')) {
        if (Session::get('payment_type') == 'cart_payment') {
            $combined_order = CombinedOrder::findOrFail($request->session()->get('combined_order_id'));
            
            $post_data = array();
            $post_data['total_amount'] = $combined_order->grand_total;
            $post_data['currency'] = "BDT";
            $post_data['tran_id'] = substr(md5($request->session()->get('combined_order_id')), 0, 10);

            $post_data['value_a'] = $post_data['tran_id'];
            $post_data['value_b'] = $request->session()->get('combined_order_id');
            $post_data['value_c'] = $request->session()->get('payment_type');
        }
    }
}
2

Add Customer Information

Include customer details for payment processing
app/Http/Controllers/Payment/SslcommerzController.php
$user = Auth::user();
$post_data['cus_name'] = $user->name;
$post_data['cus_add1'] = $user->address;
$post_data['cus_city'] = $user->city;
$post_data['cus_postcode'] = $user->postal_code;
$post_data['cus_country'] = $user->country;
$post_data['cus_phone'] = $user->phone;
$post_data['cus_email'] = $user->email;
3

Configure Callback URLs

Set success, fail, and cancel URLs
app/Http/Controllers/Payment/SslcommerzController.php
$server_name = $request->root() . "/";
$post_data['success_url'] = $server_name . "sslcommerz/success";
$post_data['fail_url'] = $server_name . "sslcommerz/fail";
$post_data['cancel_url'] = $server_name . "sslcommerz/cancel";
4

Initiate Payment Session

Send request to SSLCommerz and redirect customer
app/Http/Controllers/Payment/SslcommerzController.php
$sslc = new SSLCommerz();

// false: Redirect to SSLCOMMERZ gateway
// true: Show all payment gateways on your page
$payment_options = $sslc->initiate($post_data, false);
5

Handle Success Callback

Process successful payment and complete order
app/Http/Controllers/Payment/SslcommerzController.php
public function success(Request $request)
{
    $sslc = new SSLCommerz();
    $tran_id = $request->value_a;
    $payment = json_encode($request->all());

    if (isset($request->value_c)) {
        if ($request->value_c == 'cart_payment') {
            return (new CheckoutController)->checkout_done($request->value_b, $payment);
        } elseif ($request->value_c == 'wallet_payment') {
            $data['amount'] = $request->value_b;
            $data['payment_method'] = 'sslcommerz';
            Auth::login(User::find($request->value_d));
            return (new WalletController)->wallet_payment_done($data, $payment);
        }
    }
}

Currency Support

SSLCommerz only supports BDT (Bangladeshi Taka)
$post_data['currency'] = "BDT";
Ensure your system default currency is set to BDT when using SSLCommerz.

Custom Values

SSLCommerz allows passing custom values through the payment flow:
$post_data['value_a'] = $post_data['tran_id'];       // Transaction ID
$post_data['value_b'] = $order_id;                   // Order ID or amount
$post_data['value_c'] = $payment_type;               // Payment type
$post_data['value_d'] = $user_id;                    // User ID (for wallet/packages)
These values are returned in the callback URL and help identify the transaction.

Payment Methods Supported

SSLCommerz supports various payment methods in Bangladesh:
  • Credit/Debit Cards: Visa, Mastercard, Amex
  • Mobile Banking: bKash, Rocket, Nagad, Upay
  • Internet Banking: All major Bangladeshi banks
  • Mobile Wallets: OK Wallet, mCash

Routes Configuration

Required routes in routes/web.php:
routes/web.php
// SSLCommerz Payment Routes
Route::post('sslcommerz/pay', [SslcommerzController::class, 'pay'])->name('sslcommerz.pay');
Route::post('sslcommerz/success', [SslcommerzController::class, 'success'])->name('sslcommerz.success');
Route::post('sslcommerz/fail', [SslcommerzController::class, 'fail'])->name('sslcommerz.fail');
Route::post('sslcommerz/cancel', [SslcommerzController::class, 'cancel'])->name('sslcommerz.cancel');
Route::post('sslcommerz/ipn', [SslcommerzController::class, 'ipn'])->name('sslcommerz.ipn');

Session Management

SSLCommerz controller uses PHP native sessions:
session_start();
This is declared at the top of the controller for compatibility with SSLCommerz SDK.

Supported Payment Types

Cart Payment

if (Session::get('payment_type') == 'cart_payment') {
    $combined_order = CombinedOrder::findOrFail($request->session()->get('combined_order_id'));
    $post_data['total_amount'] = $combined_order->grand_total;
    $post_data['currency'] = "BDT";
}

Wallet Payment

elseif (Session::get('payment_type') == 'wallet_payment') {
    $post_data['total_amount'] = $request->session()->get('payment_data')['amount'];
    $post_data['currency'] = "BDT";
    $post_data['value_d'] = Auth::user()->id;
}

Package Payments

elseif (Session::get('payment_type') == 'customer_package_payment') {
    $customer_package = CustomerPackage::findOrFail(Session::get('payment_data')['customer_package_id']);
    $post_data['total_amount'] = $customer_package->amount;
    $post_data['currency'] = "BDT";
}

Error Handling

Payment Failure

app/Http/Controllers/Payment/SslcommerzController.php
public function fail(Request $request)
{
    $request->session()->forget('order_id');
    $request->session()->forget('payment_data');
    flash(translate('Payment Failed'))->warning();
    return redirect()->route('home');
}

Payment Cancellation

app/Http/Controllers/Payment/SslcommerzController.php
public function cancel(Request $request)
{
    $request->session()->forget('order_id');
    $request->session()->forget('payment_data');
    flash(translate('Payment cancelled'))->error();
    return redirect()->route('home');
}

IPN (Instant Payment Notification)

SSLCommerz sends IPN for payment verification:
app/Http/Controllers/Payment/SslcommerzController.php
public function ipn(Request $request)
{
    if ($request->input('tran_id')) {
        $tran_id = $request->input('tran_id');
        
        $combined_order = CombinedOrder::findOrFail($request->session()->get('combined_order_id'));

        if ($order->payment_status == 'Pending') {
            $sslc = new SSLCommerz();
            $validation = $sslc->orderValidate($tran_id, $order->grand_total, 'BDT', $request->all());
            
            if ($validation == TRUE) {
                echo "Transaction is successfully Complete";
            } else {
                echo "validation Fail";
            }
        }
    }
}
Configure IPN URL in SSLCommerz merchant panel:
https://yourdomain.com/sslcommerz/ipn

Testing

Sandbox Environment

SSLCommerz provides sandbox environment for testing:
1

Use Sandbox Credentials

Request sandbox credentials from SSLCommerz support
2

Configure Sandbox Mode

Set sandbox mode in business settings or .env
3

Test Payments

Use provided test card numbers and mobile banking test credentials

Test Card Numbers

SSLCommerz provides test cards for sandbox:
Card Number: 4111 1111 1111 1111
Expiry: Any future date
CVV: Any 3 digits

Troubleshooting

Cause: Invalid credentials or incorrect payloadSolution:
  • Verify Store ID and Store Password
  • Check all required fields are provided
  • Ensure customer information is complete
  • Verify callback URLs are accessible
Cause: Non-BDT currency usedSolution:
// Must use BDT
$post_data['currency'] = "BDT";
Cause: URL configuration issueSolution:
  • Ensure URLs use HTTPS in production
  • Check routes are properly registered
  • Verify .htaccess configuration
  • Test URLs are publicly accessible
Cause: Same transaction ID used twiceSolution:
// Generate unique transaction ID
$post_data['tran_id'] = substr(md5($order_id . time()), 0, 10);

User Re-authentication

For wallet and package payments, the system re-authenticates users:
if ($request->value_c == 'wallet_payment') {
    Auth::login(User::find($request->value_d));
    return (new WalletController)->wallet_payment_done($data, $payment);
}
This ensures the user session is maintained after payment redirect.

Going Live

1

Complete Merchant Verification

Submit all required documents to SSLCommerz:
  • Trade license
  • Bank account details
  • NID/Passport
  • Business registration
2

Get Live Credentials

After approval, receive production Store ID and Password
3

Update Configuration

Replace sandbox credentials with production credentials
4

Configure Live URLs

Update IPN and callback URLs in SSLCommerz merchant panel
5

Test Live Payment

Make a small test transaction with real payment method

Security Best Practices

Security Recommendations
  • Never expose Store Password in frontend code
  • Always use HTTPS for production
  • Validate transaction amounts server-side
  • Implement IPN signature verification
  • Log all payment transactions
  • Set up fraud monitoring
  • Regularly rotate credentials

Integration Modes

SSLCommerz offers two integration modes:
$payment_options = $sslc->initiate($post_data, false);
Customer is redirected to SSLCommerz hosted payment page.

Popup/Embedded Mode

$payment_options = $sslc->initiate($post_data, true);
Payment options displayed on your website.

Minimum Transaction Amount

SSLCommerz has a minimum transaction amount of BDT 10
$post_data['total_amount'] = $combined_order->grand_total; // Must be >= 10

Payment Overview

Learn about payment architecture

Razorpay Integration

Configure Razorpay for India

Build docs developers (and LLMs) love