PHPackages                             mmchrist89/laravel-mobile-money - 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. mmchrist89/laravel-mobile-money

ActiveLibrary[Payment Processing](/categories/payments)

mmchrist89/laravel-mobile-money
===============================

Package Laravel pour l'intégration de MTN Mobile Money et Airtel Money

00PHP

Since Feb 12Pushed 4mo agoCompare

[ Source](https://github.com/mmchrist89/laravel-mobile-money)[ Packagist](https://packagist.org/packages/mmchrist89/laravel-mobile-money)[ RSS](/packages/mmchrist89-laravel-mobile-money/feed)WikiDiscussions main Synced today

READMEChangelogDependenciesVersions (1)Used By (0)

Laravel Mobile Money Package
============================

[](#laravel-mobile-money-package)

Package Laravel complet pour l'intégration de **MTN Mobile Money** et **Airtel Money**. Solution flexible et prête pour la production.

🚀 Fonctionnalités
-----------------

[](#-fonctionnalités)

- ✅ Support de MTN Mobile Money et Airtel Money
- ✅ Demandes de paiement (Collection)
- ✅ Transferts d'argent (Disbursement)
- ✅ Vérification du statut des transactions
- ✅ Consultation du solde
- ✅ Détection automatique du provider
- ✅ Gestion des webhooks/callbacks
- ✅ Enregistrement des transactions en base de données
- ✅ Logging complet
- ✅ Configuration flexible
- ✅ Gestion des erreurs robuste

📦 Installation
--------------

[](#-installation)

### Étape 1 : Installation via Composer

[](#étape-1--installation-via-composer)

```
composer require mmchrist89/laravel-mobile-money
```

### Étape 2 : Publier la configuration

[](#étape-2--publier-la-configuration)

```
php artisan vendor:publish --tag=mobile-money-config
```

### Étape 3 : Publier les migrations

[](#étape-3--publier-les-migrations)

```
php artisan vendor:publish --tag=mobile-money-migrations
```

### Étape 4 : Exécuter les migrations

[](#étape-4--exécuter-les-migrations)

```
php artisan migrate
```

⚙️ Configuration
----------------

[](#️-configuration)

Ajoutez vos identifiants dans le fichier `.env` :

### MTN Mobile Money

[](#mtn-mobile-money)

```
MTN_ENABLED=true
MTN_ENVIRONMENT=sandbox
MTN_CURRENCY=XAF
MTN_COUNTRY=CM
MTN_API_USER=your-api-user
MTN_API_KEY=your-api-key
MTN_SUBSCRIPTION_KEY=your-subscription-key
MTN_COLLECTION_SUBSCRIPTION_KEY=your-collection-key
MTN_DISBURSEMENT_SUBSCRIPTION_KEY=your-disbursement-key
MTN_BASE_URL=https://sandbox.momodeveloper.mtn.com
MTN_CALLBACK_URL=https://votre-domaine.com/mobile-money/webhooks/mtn
```

### Airtel Money

[](#airtel-money)

```
AIRTEL_ENABLED=true
AIRTEL_ENVIRONMENT=staging
AIRTEL_CURRENCY=XAF
AIRTEL_COUNTRY=CM
AIRTEL_CLIENT_ID=your-client-id
AIRTEL_CLIENT_SECRET=your-client-secret
AIRTEL_PIN=your-pin
AIRTEL_BASE_URL=https://openapiuat.airtel.africa
AIRTEL_CALLBACK_URL=https://votre-domaine.com/mobile-money/webhooks/airtel
```

### Configuration générale

[](#configuration-générale)

```
MOBILE_MONEY_DEFAULT_PROVIDER=mtn
MOBILE_MONEY_LOGGING=true
MOBILE_MONEY_LOG_CHANNEL=stack
```

📖 Utilisation
-------------

[](#-utilisation)

### Utilisation de base

[](#utilisation-de-base)

```
use MobileMoney\Facades\MobileMoney;

// Demander un paiement
$transaction = MobileMoney::requestPayment(
    phone: '237650123456',
    amount: 5000,
    options: [
        'provider' => 'mtn', // optionnel
        'reference' => 'CMD-12345', // optionnel, généré automatiquement
        'metadata' => [
            'customer_name' => 'John Doe',
            'order_id' => 12345,
        ]
    ]
);

// Vérifier le statut
$transaction = MobileMoney::checkStatus($transaction->transaction_id);

// Effectuer un transfert
$transaction = MobileMoney::transfer(
    phone: '237690123456',
    amount: 2000,
    options: ['provider' => 'airtel']
);

// Obtenir le solde
$balance = MobileMoney::getBalance('mtn');
```

### Détection automatique du provider

[](#détection-automatique-du-provider)

```
// Le package détecte automatiquement MTN ou Airtel
$transaction = MobileMoney::smartPayment(
    phone: '237650123456', // MTN sera détecté
    amount: 5000
);
```

### Utilisation avec provider spécifique

[](#utilisation-avec-provider-spécifique)

```
// Utiliser directement un provider
$result = MobileMoney::provider('mtn')->requestPayment(
    phone: '237650123456',
    amount: 5000,
    reference: 'CMD-12345'
);

// Vérifier les providers disponibles
$providers = MobileMoney::availableProviders();
// ['mtn', 'airtel']
```

### Gestion des transactions en base de données

[](#gestion-des-transactions-en-base-de-données)

```
use MobileMoney\Models\Transaction;

// Récupérer toutes les transactions
$transactions = Transaction::all();

// Filtrer par provider
$mtnTransactions = Transaction::provider('mtn')->get();

// Filtrer par statut
$successfulTransactions = Transaction::successful()->get();
$pendingTransactions = Transaction::pending()->get();
$failedTransactions = Transaction::failed()->get();

// Vérifier le statut
if ($transaction->isSuccessful()) {
    // Transaction réussie
}

if ($transaction->isPending()) {
    // Transaction en attente
}

if ($transaction->isFailed()) {
    // Transaction échouée
}

// Marquer manuellement une transaction
$transaction->markAsSuccessful();
$transaction->markAsFailed('Solde insuffisant');
```

### Gestion des erreurs

[](#gestion-des-erreurs)

```
use MobileMoney\Exceptions\MobileMoneyException;

try {
    $transaction = MobileMoney::requestPayment('237650123456', 5000);
} catch (MobileMoneyException $e) {
    // Gérer l'erreur
    Log::error('Erreur Mobile Money: ' . $e->getMessage());

    // Obtenir le contexte
    $context = $e->getContext();
}
```

🔔 Webhooks/Callbacks
--------------------

[](#-webhookscallbacks)

Le package enregistre automatiquement les routes de webhook :

- MTN : `POST /mobile-money/webhooks/mtn`
- Airtel : `POST /mobile-money/webhooks/airtel`

Les transactions sont automatiquement mises à jour lors de la réception des callbacks.

### Personnaliser le traitement des callbacks

[](#personnaliser-le-traitement-des-callbacks)

Vous pouvez écouter les événements de transaction (à implémenter selon vos besoins) :

```
// Dans EventServiceProvider
protected $listen = [
    'MobileMoney\Events\TransactionUpdated' => [
        'App\Listeners\SendTransactionNotification',
    ],
];
```

🧪 Tests
-------

[](#-tests)

```
composer test
```

📝 Exemples d'utilisation
------------------------

[](#-exemples-dutilisation)

### Cas d'usage 1 : Système de paiement e-commerce

[](#cas-dusage-1--système-de-paiement-e-commerce)

```
class PaymentController extends Controller
{
    public function processPayment(Request $request)
    {
        $validated = $request->validate([
            'phone' => 'required|string',
            'amount' => 'required|numeric|min:100',
            'order_id' => 'required|integer',
        ]);

        try {
            $transaction = MobileMoney::smartPayment(
                phone: $validated['phone'],
                amount: $validated['amount'],
                options: [
                    'reference' => 'ORDER-' . $validated['order_id'],
                    'metadata' => [
                        'order_id' => $validated['order_id'],
                        'customer_id' => auth()->id(),
                    ],
                ]
            );

            return response()->json([
                'success' => true,
                'transaction_id' => $transaction->transaction_id,
                'message' => 'Veuillez confirmer le paiement sur votre téléphone',
            ]);
        } catch (MobileMoneyException $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
            ], 400);
        }
    }

    public function checkPaymentStatus($transactionId)
    {
        $transaction = MobileMoney::checkStatus($transactionId);

        return response()->json([
            'status' => $transaction->status,
            'amount' => $transaction->amount,
        ]);
    }
}
```

### Cas d'usage 2 : Système de retrait

[](#cas-dusage-2--système-de-retrait)

```
class WithdrawalController extends Controller
{
    public function withdraw(Request $request)
    {
        $validated = $request->validate([
            'phone' => 'required|string',
            'amount' => 'required|numeric|min:500',
        ]);

        // Vérifier le solde utilisateur
        if (auth()->user()->balance < $validated['amount']) {
            return response()->json([
                'success' => false,
                'message' => 'Solde insuffisant',
            ], 400);
        }

        try {
            $transaction = MobileMoney::transfer(
                phone: $validated['phone'],
                amount: $validated['amount'],
                options: [
                    'provider' => MobileMoney::detectProvider($validated['phone']),
                    'metadata' => [
                        'user_id' => auth()->id(),
                        'type' => 'withdrawal',
                    ],
                ]
            );

            // Déduire du solde utilisateur
            auth()->user()->decrement('balance', $validated['amount']);

            return response()->json([
                'success' => true,
                'transaction_id' => $transaction->transaction_id,
                'message' => 'Retrait initié avec succès',
            ]);
        } catch (MobileMoneyException $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
            ], 400);
        }
    }
}
```

### Cas d'usage 3 : Commande artisan pour vérifier les transactions en attente

[](#cas-dusage-3--commande-artisan-pour-vérifier-les-transactions-en-attente)

```
namespace App\Console\Commands;

use Illuminate\Console\Command;
use MobileMoney\Facades\MobileMoney;
use MobileMoney\Models\Transaction;

class CheckPendingTransactions extends Command
{
    protected $signature = 'mobile-money:check-pending';
    protected $description = 'Vérifier le statut des transactions en attente';

    public function handle()
    {
        $pendingTransactions = Transaction::pending()
            ->where('created_at', '>', now()->subHours(24))
            ->get();

        $this->info("Vérification de {$pendingTransactions->count()} transactions...");

        foreach ($pendingTransactions as $transaction) {
            try {
                $updated = MobileMoney::checkStatus(
                    $transaction->transaction_id,
                    $transaction->provider
                );

                $this->info("Transaction {$transaction->transaction_id}: {$updated->status}");
            } catch (\Exception $e) {
                $this->error("Erreur pour {$transaction->transaction_id}: {$e->getMessage()}");
            }
        }

        $this->info('Terminé !');
    }
}
```

🛠️ Configuration avancée
------------------------

[](#️-configuration-avancée)

### Personnaliser la table des transactions

[](#personnaliser-la-table-des-transactions)

Dans `config/mobile-money.php` :

```
'database' => [
    'transactions_table' => 'custom_transactions_table',
    'connection' => 'custom_connection',
],
```

### Désactiver un provider

[](#désactiver-un-provider)

```
MTN_ENABLED=false
```

### Configuration multi-pays

[](#configuration-multi-pays)

Le package supporte plusieurs pays. Modifiez simplement :

```
MTN_COUNTRY=UG  # Ouganda
AIRTEL_COUNTRY=GH  # Ghana
```

📚 API Reference
---------------

[](#-api-reference)

### MobileMoneyManager

[](#mobilemoneymanager)

#### `requestPayment(string $phone, float $amount, array $options = []): Transaction`

[](#requestpaymentstring-phone-float-amount-array-options---transaction)

Demander un paiement au client.

#### `transfer(string $phone, float $amount, array $options = []): Transaction`

[](#transferstring-phone-float-amount-array-options---transaction)

Effectuer un transfert vers un numéro.

#### `checkStatus(string $transactionId, ?string $provider = null): Transaction`

[](#checkstatusstring-transactionid-string-provider--null-transaction)

Vérifier le statut d'une transaction.

#### `getBalance(?string $provider = null): array`

[](#getbalancestring-provider--null-array)

Obtenir le solde du compte.

#### `detectProvider(string $phone): ?string`

[](#detectproviderstring-phone-string)

Détecter le provider à partir du numéro.

#### `smartPayment(string $phone, float $amount, array $options = []): Transaction`

[](#smartpaymentstring-phone-float-amount-array-options---transaction)

Paiement avec détection automatique du provider.

#### `availableProviders(): array`

[](#availableproviders-array)

Obtenir la liste des providers disponibles.

🔒 Sécurité
----------

[](#-sécurité)

- Les données sensibles sont automatiquement masquées dans les logs
- Support HTTPS pour la production
- Validation des numéros de téléphone
- Gestion sécurisée des tokens d'accès

🤝 Contribution
--------------

[](#-contribution)

Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une issue ou une pull request.

📄 Licence
---------

[](#-licence)

Ce package est open-source sous licence MIT.

👨‍💻 Auteur
----------

[](#‍-auteur)

Créé avec ❤️ pour la communauté Laravel

🔗 Liens utiles
--------------

[](#-liens-utiles)

- [Documentation MTN MoMo API](https://momodeveloper.mtn.com/)
- [Documentation Airtel Money API](https://developers.airtel.africa/)
- [Laravel Documentation](https://laravel.com/docs)

###  Health Score

17

—

LowBetter than 6% of packages

Maintenance51

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/71c8ceedfe33ff8449a23ea2690b09f9c69e56db7948d1add74366c1669f2abd?d=identicon)[mmchrist89](/maintainers/mmchrist89)

---

Top Contributors

[![mmchrist89](https://avatars.githubusercontent.com/u/177294698?v=4)](https://github.com/mmchrist89 "mmchrist89 (1 commits)")

### Embed Badge

![Health badge](/badges/mmchrist89-laravel-mobile-money/health.svg)

```
[![Health](https://phpackages.com/badges/mmchrist89-laravel-mobile-money/health.svg)](https://phpackages.com/packages/mmchrist89-laravel-mobile-money)
```

###  Alternatives

[msilabs/bkash

bKash Payment Gateway API for Laravel Framework.

181.2k](/packages/msilabs-bkash)[binkode/laravel-paystack

A description for laravel-paystack.

112.1k](/packages/binkode-laravel-paystack)

PHPackages © 2026

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