PHPackages                             eg-mohamed/paymob-payout - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. eg-mohamed/paymob-payout

ActiveLibrary[Payment Processing](/categories/payments)

eg-mohamed/paymob-payout
========================

Laravel wrapper for Paymob Payouts API to check balance, track transactions, and perform instant cash-in.

v1.0.4(10mo ago)05MITPHPPHP ^8.2CI passing

Since Sep 2Pushed 10mo agoCompare

[ Source](https://github.com/EG-Mohamed/Paymob-Payout)[ Packagist](https://packagist.org/packages/eg-mohamed/paymob-payout)[ Docs](https://github.com/eg-mohamed/paymob-payout)[ GitHub Sponsors](https://github.com/eg-mohamed)[ RSS](/packages/eg-mohamed-paymob-payout/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (12)Versions (6)Used By (0)

Laravel Paymob Payout Package
=============================

[](#laravel-paymob-payout-package)

[![Latest Version on Packagist](https://camo.githubusercontent.com/214e7d10fabe8c41ff3e62a37213ed2ed4ecdc96a17c363767e3c2068529d8b0/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f65672d6d6f68616d65642f7061796d6f622d7061796f75742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/eg-mohamed/paymob-payout)[![GitHub Tests Action Status](https://camo.githubusercontent.com/d2dd76ebdaf9514c96d47e34b9c8c03474d43c41fd2b238bb8137b045c0d0ef7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f65672d6d6f68616d65642f7061796d6f622d7061796f75742f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/eg-mohamed/paymob-payout/actions?query=workflow%3Arun-tests+branch%3Amain)[![GitHub Code Style Action Status](https://camo.githubusercontent.com/d36a0ad69afc9465cfa64eacedcbad444fb9b46deedf9d9c4e9f048abf96c0b0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f65672d6d6f68616d65642f7061796d6f622d7061796f75742f6669782d7068702d636f64652d7374796c652d6973737565732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/eg-mohamed/paymob-payout/actions?query=workflow%3A%22Fix+PHP+code+style+issues%22+branch%3Amain)[![Total Downloads](https://camo.githubusercontent.com/9f80050d47c37120163be78e1889a9893e6b96bd0be7589850962768e4cdc77e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f65672d6d6f68616d65642f7061796d6f622d7061796f75742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/eg-mohamed/paymob-payout)

> **⚠️ IMPORTANT DISCLAIMER**
>
> This is **NOT an official package** from Paymob. This package was created by me to help Laravel developers integrate with Paymob Payout API, as there was no available package at the time of creation.
>
> **If Paymob releases an official Laravel package in the future, I am strongly recommend using their official package instead.**
>
> This package is provided as-is for the benefit of the developer community and is not affiliated with or endorsed by Paymob.

A comprehensive Laravel wrapper for the Paymob Payout API that provides easy-to-use methods for:

- **Token Generation &amp; Management** - Automatic OAuth 2.0 token handling with caching
- **Instant Cash-In** - Disburse money to wallets (Vodafone, Etisalat, Orange, Aman) and bank cards
- **Transaction Management** - Cancel Aman transactions
- **Bulk Transaction Inquiry** - Query multiple transaction statuses (with rate limiting)
- **Budget Inquiry** - Check current balance
- **Comprehensive Exception Handling** - Specific exceptions for different error scenarios

Requirements
------------

[](#requirements)

- **PHP**: ^8.2
- **Laravel**: ^10.0 || ^11.0 || ^12.0

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require eg-mohamed/paymob-payout
```

You can publish the config file with:

```
php artisan vendor:publish --tag="paymob-payout-config"
```

Configuration
-------------

[](#configuration)

Add the following environment variables to your `.env` file:

```
PAYMOB_PAYOUT_ENVIRONMENT=staging
PAYMOB_PAYOUT_CLIENT_ID=your_client_id
PAYMOB_PAYOUT_CLIENT_SECRET=your_client_secret
PAYMOB_PAYOUT_USERNAME=your_username
PAYMOB_PAYOUT_PASSWORD=your_password
PAYMOB_PAYOUT_TIMEOUT=30
```

Set `PAYMOB_PAYOUT_ENVIRONMENT` to `production` when you're ready to go live.

Usage
-----

[](#usage)

### Basic Usage

[](#basic-usage)

```
use MohamedSaid\PaymobPayout\Facades\PaymobPayout;
use MohamedSaid\PaymobPayout\Enums\IssuerType;
use MohamedSaid\PaymobPayout\Enums\BankTransactionType;

// Generate/refresh token (handled automatically)
$token = PaymobPayout::generateToken();

// Check your current budget
$budget = PaymobPayout::budgetInquiry();
echo $budget->currentBalance; // 888.25 (float)
```

### Cash-In Methods

[](#cash-in-methods)

The package provides three specialized methods for different transaction types, each with specific validation:

#### Mobile Wallets Cash-In

[](#mobile-wallets-cash-in)

For Vodafone, Etisalat, Orange, and Bank Wallet transactions:

```
use MohamedSaid\PaymobPayout\Facades\PaymobPayout;
use MohamedSaid\PaymobPayout\Enums\IssuerType;

$transaction = PaymobPayout::walletCashIn(
    issuer: IssuerType::VODAFONE,
    amount: 100.50,
    msisdn: '01234567890',
    clientReferenceId: '550e8400-e29b-41d4-a716-446655440000' // Optional UUID4
);

echo $transaction->transactionId;
echo $transaction->disbursementStatus; // 'successful', 'pending', 'failed'
echo $transaction->statusDescription;
```

#### Aman Cash-In

[](#aman-cash-in)

For Aman transactions with specific requirements:

```
$transaction = PaymobPayout::amanCashIn(
    amount: 250.00,
    msisdn: '01234567890',
    firstName: 'Ahmed',
    lastName: 'Mohamed',
    email: 'ahmed@example.com',
    clientReference: 'AMAN-2024-001' // Optional unique reference
);

// Aman transactions return a reference number for cash pickup
echo $transaction->referenceNumber;
```

#### Bank Card Cash-In

[](#bank-card-cash-in)

For bank card transactions:

```
use MohamedSaid\PaymobPayout\Enums\BankTransactionType;
use MohamedSaid\PaymobPayout\Enums\BankCode;

$transaction = PaymobPayout::bankCardCashIn(
    amount: 500.00,
    bankCardNumber: '1234567890123456',
    bankTransactionType: BankTransactionType::CASH_TRANSFER,
    bankCode: BankCode::CIB,
    fullName: 'Ahmed Mohamed',
    clientReference: 'BANK-2024-001' // Optional unique reference
);

// Bank transactions take 2 working days to finalize
echo $transaction->disbursementStatus; // Usually 'pending' initially
```

### Field Validation

[](#field-validation)

Each method includes comprehensive validation specific to the transaction type:

#### walletCashIn() Validation

[](#walletcashin-validation)

- `issuer` must be VODAFONE, ETISALAT, ORANGE, or BANK\_WALLET
- `amount` must be greater than 0
- `msisdn` must be 11 digits starting with 01

#### amanCashIn() Validation

[](#amancashin-validation)

- `amount` must be greater than 0
- `msisdn` must be 11 digits starting with 01
- `firstName` is required and cannot be empty
- `lastName` is required and cannot be empty
- `email` must be valid email format

#### bankCardCashIn() Validation

[](#bankcardcashin-validation)

- `amount` must be greater than 0
- `bankCardNumber` must be 13-19 digits
- `bankTransactionType` is required (enum)
- `bankCode` is required (enum)
- `fullName` is required and cannot be empty

#### Validation Examples

[](#validation-examples)

```
// Wallet validation error
try {
    $transaction = PaymobPayout::walletCashIn(
        issuer: IssuerType::AMAN, // Invalid issuer for wallet method
        amount: 100.0,
        msisdn: '01234567890'
    );
} catch (InvalidArgumentException $e) {
    echo $e->getMessage(); // "Invalid issuer type for wallet cash-in. Use VODAFONE, ETISALAT, ORANGE, or BANK_WALLET"
}

// Aman validation error
try {
    $transaction = PaymobPayout::amanCashIn(
        amount: 100.0,
        msisdn: '01234567890',
        firstName: '', // Empty first name
        lastName: 'Mohamed',
        email: 'ahmed@example.com'
    );
} catch (InvalidArgumentException $e) {
    echo $e->getMessage(); // "First name is required for Aman transactions"
}
```

### Transaction Management

[](#transaction-management)

#### Cancel Aman Transaction

[](#cancel-aman-transaction)

```
$cancelResult = PaymobPayout::cancelAmanTransaction('607f2a5a-1109-43d2-a12c-9327ab2dca18');

echo $cancelResult->disbursementStatus; // 'successful' if cancelled
echo $cancelResult->referenceNumber;
```

#### Bulk Transaction Inquiry

[](#bulk-transaction-inquiry)

```
$inquiry = PaymobPayout::bulkTransactionInquiry([
    '607f2a5a-1109-43d2-a12c-9327ab2dca18',
    '708f3b6b-2210-54e3-b23d-a438bc3edb29'
]);

echo $inquiry->count; // Number of transactions returned
foreach ($inquiry->results as $transaction) {
    echo $transaction['transaction_id'];
    echo $transaction['disbursement_status'];
}

// For bank transactions (sends additional bank_transactions parameter)
$bankInquiry = PaymobPayout::bulkTransactionInquiry(
    transactionIdsList: ['transaction-id-1', 'transaction-id-2'],
    bankTransactions: true
);
```

### Exception Handling

[](#exception-handling)

The package provides specific exceptions for different error scenarios:

```
use MohamedSaid\PaymobPayout\Exceptions\PaymobAuthenticationException;
use MohamedSaid\PaymobPayout\Exceptions\PaymobTransactionLimitException;
use MohamedSaid\PaymobPayout\Exceptions\PaymobInsufficientFundsException;
use MohamedSaid\PaymobPayout\Exceptions\PaymobInvalidAccountException;
use MohamedSaid\PaymobPayout\Exceptions\PaymobDuplicateTransactionException;
use MohamedSaid\PaymobPayout\Exceptions\PaymobRateLimitException;

try {
    $transaction = PaymobPayout::instantCashIn(
        issuer: IssuerType::VODAFONE,
        amount: 1000.00,
        msisdn: '01234567890'
    );
} catch (PaymobAuthenticationException $e) {
    // Handle authentication errors (403, invalid PIN, etc.)
    echo "Authentication failed: " . $e->getMessage();
    echo "Status code: " . $e->getStatusCode();
} catch (PaymobTransactionLimitException $e) {
    // Handle limit exceeded errors (583, 604, 6061, 6065)
    echo "Transaction limit exceeded: " . $e->getMessage();
} catch (PaymobInsufficientFundsException $e) {
    // Handle insufficient funds (6005)
    echo "Insufficient funds: " . $e->getMessage();
} catch (PaymobInvalidAccountException $e) {
    // Handle invalid account errors (618, 4055, etc.)
    echo "Invalid account: " . $e->getMessage();
} catch (PaymobDuplicateTransactionException $e) {
    // Handle duplicate transaction (501)
    echo "Duplicate transaction: " . $e->getMessage();
} catch (PaymobRateLimitException $e) {
    // Handle rate limiting (429)
    echo "Rate limit exceeded: " . $e->getMessage();
}
```

### Dependency Injection

[](#dependency-injection)

You can also use dependency injection instead of the facade:

```
use MohamedSaid\PaymobPayout\PaymobPayout;
use MohamedSaid\PaymobPayout\Enums\IssuerType;

class PaymentService
{
    public function __construct(
        private PaymobPayout $paymobPayout
    ) {}

    public function processWalletPayment(float $amount, string $phone): void
    {
        $transaction = $this->paymobPayout->walletCashIn(
            issuer: IssuerType::VODAFONE,
            amount: $amount,
            msisdn: $phone
        );

        // Handle the transaction result...
    }

    public function processAmanPayment(float $amount, string $phone, string $firstName, string $lastName, string $email): void
    {
        $transaction = $this->paymobPayout->amanCashIn(
            amount: $amount,
            msisdn: $phone,
            firstName: $firstName,
            lastName: $lastName,
            email: $email
        );

        // Handle the transaction result...
    }
}
```

### Enum Helper Methods

[](#enum-helper-methods)

All enums include helpful methods for retrieving human-readable names and filtering options:

#### Get Human-Readable Names

[](#get-human-readable-names)

```
use MohamedSaid\PaymobPayout\Enums\IssuerType;
use MohamedSaid\PaymobPayout\Enums\BankCode;
use MohamedSaid\PaymobPayout\Enums\BankTransactionType;

// Get display names
echo IssuerType::VODAFONE->getLabel(); // "Vodafone Cash"
echo BankCode::CIB->getLabel(); // "Commercial International Bank"
echo BankTransactionType::SALARY->getLabel(); // "Salary"
```

#### Get All Options (with optional exclusions)

[](#get-all-options-with-optional-exclusions)

```
// Get all issuers
$allIssuers = IssuerType::all();

// Get all issuers except bank-related ones
$walletIssuers = IssuerType::all([
    IssuerType::BANK_WALLET,
    IssuerType::BANK_CARD
]);

// Get all bank codes except specific ones
$availableBanks = BankCode::all([
    BankCode::HSBC,
    BankCode::SCB
]);

// Get all transaction types except salary
$transactionTypes = BankTransactionType::all([
    BankTransactionType::SALARY
]);
```

Supported Features
------------------

[](#supported-features)

### Issuers

[](#issuers)

- **Vodafone Cash** - Instant wallet transactions
- **Etisalat Cash** - Instant wallet transactions
- **Orange Cash** - Instant wallet transactions
- **Aman** - Cash pickup service with reference numbers
- **Bank Wallet** - Bank wallet transactions
- **Bank Card** - Direct bank card disbursements (2 working days)

### Bank Transaction Types

[](#bank-transaction-types)

- **SALARY** - For concurrent or repeated payments
- **CREDIT\_CARD** - For credit card payments
- **PREPAID\_CARD** - For prepaid cards and Meeza cards payments
- **CASH\_TRANSFER** - For bank accounts, debit cards etc.

### Supported Bank Codes

[](#supported-bank-codes)

- **CIB** - Commercial International Bank
- **NBE** - National Bank of Egypt
- **MISR** - Banque Misr
- **ALEX** - Bank of Alexandria
- **QNB** - QNB ALAHLI
- **HSBC** - HSBC Bank Egypt
- And 25+ other banks (see BankCode enum for complete list)

### API Rate Limits

[](#api-rate-limits)

- **Transaction Inquiry**: 5 requests per minute (POST request)
- **Budget Inquiry**: 5 requests per minute (GET request)
- **Bulk Transaction Inquiry**: 50 transactions per request (POST request)

Testing
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

Please review [our security policy](../../security/policy) on how to report security vulnerabilities.

Credits
-------

[](#credits)

- [Mohamed Said](https://github.com/eg-mohamed)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Support
-------

[](#support)

This package is provided as-is for community benefit. For official support, please contact Paymob directly.

For package-specific issues, please open an issue on [GitHub](https://github.com/eg-mohamed/paymob-payout/issues).

###  Health Score

31

—

LowBetter than 66% of packages

Maintenance55

Moderate activity, may be stable

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

5

Last Release

304d ago

PHP version history (2 changes)v1.0.0PHP ^8.4

v1.0.1PHP ^8.2

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/23424932?v=4)[Mohamed Said](/maintainers/EG-Mohamed)[@EG-Mohamed](https://github.com/EG-Mohamed)

---

Top Contributors

[![EG-Mohamed](https://avatars.githubusercontent.com/u/23424932?v=4)](https://github.com/EG-Mohamed "EG-Mohamed (16 commits)")

---

Tags

laraveleg-mohamedpaymob-payout

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/eg-mohamed-paymob-payout/health.svg)

```
[![Health](https://phpackages.com/badges/eg-mohamed-paymob-payout/health.svg)](https://phpackages.com/packages/eg-mohamed-paymob-payout)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

816333.3k3](/packages/defstudio-telegraph)[spatie/laravel-responsecache

Speed up a Laravel application by caching the entire response

2.8k9.0M69](/packages/spatie-laravel-responsecache)[laravel/pulse

Laravel Pulse is a real-time application performance monitoring tool and dashboard for your Laravel application.

1.7k15.1M132](/packages/laravel-pulse)[harris21/laravel-fuse

Circuit breaker for Laravel queue jobs. Protect your workers from cascading failures.

44855.7k](/packages/harris21-laravel-fuse)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9762.4M131](/packages/roots-acorn)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
