PHPackages                             alouspike/cmi-payment - 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. alouspike/cmi-payment

ActiveLibrary[Payment Processing](/categories/payments)

alouspike/cmi-payment
=====================

Laravel package for CMI (Centre Monetique Interbancaire) payment gateway integration - Moroccan banking payment solution

00PHP

Since Feb 27Pushed 2mo agoCompare

[ Source](https://github.com/alouspike/cmi-payment)[ Packagist](https://packagist.org/packages/alouspike/cmi-payment)[ RSS](/packages/alouspike-cmi-payment/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

CMI Payment Gateway pour Laravel
================================

[](#cmi-payment-gateway-pour-laravel)

[![Dernière version](https://camo.githubusercontent.com/f7640a07768221c436cd6a7c5cad2d58e070f5d6d0b0282c2e446ffd66c28f38/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f616c6f757370696b652f636d692d7061796d656e742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/alouspike/cmi-payment)[![Téléchargements](https://camo.githubusercontent.com/e2ab5d53257c304107d48e0b64cdc84c45cf0ce5faa10ff871d94515e2b0fbd9/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f616c6f757370696b652f636d692d7061796d656e742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/alouspike/cmi-payment)[![Licence](https://camo.githubusercontent.com/12876a50346cf156b257689580226f721b8d87e2ca4661430ca3c110a1c8f321/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f616c6f757370696b652f636d692d7061796d656e742e7376673f7374796c653d666c61742d737175617265)](LICENSE)[![Version PHP](https://camo.githubusercontent.com/b9ba690207785fcc260907c8d432ee3955e463effc976584cd5ca2e0c475d1de/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f616c6f757370696b652f636d692d7061796d656e742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/alouspike/cmi-payment)

Package Laravel pour l'intégration de la passerelle de paiement **CMI (Centre Monétique Interbancaire)** — la solution de paiement bancaire marocaine.

---

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

[](#fonctionnalités)

- API fluide pour initier les paiements facilement
- Génération et vérification sécurisée du hash HMAC
- Support multi-boutiques (SaaS)
- Intégration des événements Laravel
- Journalisation des transactions en base de données
- Contrôleur de callback intégré
- Vue Blade de redirection avec auto-submit
- Commande Artisan de test
- Zéro dépendance externe

Prérequis
---------

[](#prérequis)

- PHP 8.1+
- Laravel 10, 11 ou 12

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

[](#installation)

```
composer require alouspike/cmi-payment
```

Le package se découvre automatiquement. Pas besoin d'enregistrer manuellement le service provider.

### Publier la configuration

[](#publier-la-configuration)

```
php artisan vendor:publish --tag=cmi-config
```

### Publier et exécuter les migrations

[](#publier-et-exécuter-les-migrations)

```
php artisan vendor:publish --tag=cmi-migrations
php artisan migrate
```

### Publier les vues (optionnel)

[](#publier-les-vues-optionnel)

```
php artisan vendor:publish --tag=cmi-views
```

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

[](#configuration)

Ajoutez ces variables à votre fichier `.env` :

```
CMI_CLIENT_ID=votre_id_marchand
CMI_STORE_KEY=votre_cle_secrete
CMI_OK_URL=https://votresite.com/payment/success
CMI_FAIL_URL=https://votresite.com/payment/failed
CMI_SHOP_URL=https://votresite.com
CMI_CALLBACK_URL=https://votresite.com/cmi/callback
CMI_SANDBOX=true
CMI_HASH_ALGORITHM=SHA512
CMI_CURRENCY=504
CMI_LANG=fr
CMI_STORE_TRANSACTIONS=true
```

### Options complètes

[](#options-complètes)

ParamètreDéfautDescription`CMI_CLIENT_ID``''`ID marchand fourni par CMI`CMI_STORE_KEY``''`Clé secrète pour la génération du hash`CMI_BASE_URI``testpayment.cmi.co.ma/...`URL de la passerelle`CMI_OK_URL``''`URL de redirection en cas de succès`CMI_FAIL_URL``''`URL de redirection en cas d'échec`CMI_SHOP_URL``''`URL de la boutique`CMI_CALLBACK_URL``''`URL de callback serveur`CMI_CURRENCY``504`Devise par défaut (504 = MAD)`CMI_LANG``fr`Langue par défaut`CMI_AUTO_REDIRECT``true`Redirection automatique après paiement`CMI_SESSION_TIMEOUT``1800`Timeout de session en secondes`CMI_HASH_ALGORITHM``SHA512`Algorithme de hash (SHA512 ou SHA256)`CMI_STORE_TRANSACTIONS``true`Journaliser les transactions en BDD`CMI_SANDBOX``true`Mode sandbox`CMI_ROUTE_PREFIX``cmi`Préfixe des routes### URL de production

[](#url-de-production)

Pour la production, modifiez :

```
CMI_BASE_URI=https://payment.cmi.co.ma/fim/est3Dgate
CMI_SANDBOX=false
```

Utilisation
-----------

[](#utilisation)

### Paiement simple

[](#paiement-simple)

```
use Cmi;

// Dans votre contrôleur
public function pay()
{
    return Cmi::amount(150.00)
        ->orderId('CMD-001')
        ->email('client@email.com')
        ->pay();
}
```

### Paiement avancé

[](#paiement-avancé)

```
use Cmi;
use Alouspike\CmiPayment\Enums\Currency;
use Alouspike\CmiPayment\Enums\Language;

return Cmi::amount(250.50)
    ->orderId('CMD-002')
    ->customerName('Ahmed Alami')
    ->email('ahmed@email.com')
    ->phone('0661000000')
    ->currency(Currency::MAD)
    ->lang(Language::FR)
    ->description('Achat en ligne #002')
    ->billingAddress('123 Rue Hassan II', 'Casablanca', 'MA')
    ->sessionTimeout(600)
    ->autoRedirect(true)
    ->okUrl('https://monsite.com/custom/success')
    ->failUrl('https://monsite.com/custom/fail')
    ->extraData(['champ_personnalise' => 'valeur'])
    ->pay();
```

### Multi-Boutiques (SaaS)

[](#multi-boutiques-saas)

```
return Cmi::useCredentials(
    clientId: $shop->cmi_client_id,
    storeKey: $shop->cmi_store_key,
)->amount(100.00)
  ->orderId('CMD-003')
  ->email('test@test.com')
  ->pay();
```

Gestion des callbacks
---------------------

[](#gestion-des-callbacks)

### Automatique (Contrôleur intégré)

[](#automatique-contrôleur-intégré)

Le package enregistre automatiquement une route `POST /cmi/callback` qui gère la vérification du hash, la mise à jour des transactions et le dispatch des événements.

### Utilisation du Trait

[](#utilisation-du-trait)

Dans votre contrôleur, utilisez le trait `CmiGateway` pour gérer les redirections OK/Fail :

```
use Alouspike\CmiPayment\Traits\CmiGateway;
use Alouspike\CmiPayment\CmiPaymentResponse;

class PaymentController extends Controller
{
    use CmiGateway;

    protected function onCmiPaymentSuccess(CmiPaymentResponse $response)
    {
        $orderId = $response->getOrderId();
        // Mettre à jour la commande, notifier l'utilisateur...
        return redirect()->route('orders.show', $orderId)
            ->with('success', 'Paiement effectué avec succès !');
    }

    protected function onCmiPaymentFailed(CmiPaymentResponse $response)
    {
        return redirect()->route('checkout')
            ->with('error', 'Le paiement a échoué. Veuillez réessayer.');
    }
}
```

Puis dans vos routes :

```
Route::post('/payment/success', [PaymentController::class, 'cmiOk']);
Route::post('/payment/failed', [PaymentController::class, 'cmiFail']);
```

### Vérification manuelle du hash

[](#vérification-manuelle-du-hash)

```
use Cmi;

if (Cmi::verifyHash($request->all())) {
    // Le hash est valide
}
```

Événements
----------

[](#événements)

Le package dispatch les événements suivants :

ÉvénementQuand`CmiCallbackReceived`Chaque callback reçu`CmiPaymentSucceeded``ProcReturnCode === '00'` (paiement approuvé)`CmiPaymentFailed`Paiement échoué### Écouter les événements

[](#écouter-les-événements)

```
// Dans EventServiceProvider ou avec Event::listen
use Alouspike\CmiPayment\Events\CmiPaymentSucceeded;
use Alouspike\CmiPayment\Events\CmiPaymentFailed;

Event::listen(CmiPaymentSucceeded::class, function ($event) {
    $response = $event->response;
    $orderId = $response->getOrderId();
    $amount = $response->getAmount();
    // Envoyer un email de confirmation, mettre à jour le statut...
});

Event::listen(CmiPaymentFailed::class, function ($event) {
    $response = $event->response;
    // Journaliser l'échec, notifier l'administrateur...
});
```

Méthodes de CmiPaymentResponse
------------------------------

[](#méthodes-de-cmipaymentresponse)

MéthodeRetourDescription`isSuccessful()``bool`Si le paiement a réussi`isFailed()``bool`Si le paiement a échoué`getOrderId()``?string`ID de la commande`getAmount()``?string`Montant du paiement`getProcReturnCode()``?string`Code retour CMI`getAuthCode()``?string`Code d'autorisation`getTransId()``?string`ID de la transaction`getCardBrand()``?string`Marque de la carte (Visa, MC...)`getMaskedPan()``?string`Numéro de carte masqué`getClientIp()``?string`Adresse IP du client`getStatus()``string`Statut : approved/declined/error`getErrMsg()``?string`Message d'erreur éventuel`toArray()``array`Données complètes de la réponseCommande Artisan
----------------

[](#commande-artisan)

```
php artisan cmi:test
```

Vérifie votre configuration CMI et affiche un exemple de code de paiement.

Cartes de test
--------------

[](#cartes-de-test)

Utilisez ces cartes en mode sandbox :

Type de carteNuméroExpirationCVVVisa`4000 0000 0000 0002`Toute date future3 chiffresMastercard`5200 0000 0000 0007`Toute date future3 chiffresVisa (3DS)`4000 0000 0000 0051`Toute date future3 chiffres> **Note :** Les numéros de cartes de test peuvent varier selon votre contrat CMI. Contactez le support CMI pour les identifiants de test exacts.

Dépannage
---------

[](#dépannage)

### Erreurs "Hash invalide"

[](#erreurs-hash-invalide)

- Vérifiez que `CMI_STORE_KEY` correspond exactement à ce que CMI vous a fourni
- Assurez-vous que `CMI_HASH_ALGORITHM` correspond à votre configuration CMI (SHA512 ou SHA256)
- Vérifiez que votre URL de callback est accessible depuis internet (CMI envoie des requêtes serveur à serveur)

### Callback non reçu

[](#callback-non-reçu)

- L'URL de callback doit être accessible publiquement (pas localhost)
- Assurez-vous que votre pare-feu autorise les requêtes POST provenant des serveurs CMI
- Vérifiez que la route `cmi/callback` n'est pas bloquée par un middleware

### Token CSRF invalide

[](#token-csrf-invalide)

Le package exclut automatiquement les routes CMI de la vérification CSRF. Si vous rencontrez toujours des problèmes, assurez-vous que les routes du package sont chargées correctement.

### Transaction non sauvegardée

[](#transaction-non-sauvegardée)

- Assurez-vous d'avoir exécuté `php artisan migrate`
- Vérifiez que `CMI_STORE_TRANSACTIONS=true` dans votre `.env`

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

[](#sécurité)

- Toutes les données de callback sont vérifiées via le hash HMAC avant traitement
- La clé secrète n'est jamais exposée dans les formulaires ou le code côté client
- Les données de transaction sont validées côté serveur
- Le middleware `VerifyCmiHash` peut être appliqué à n'importe quelle route pour une sécurité supplémentaire
- La protection CSRF est maintenue sur toutes les routes non-CMI

Licence
-------

[](#licence)

Licence MIT. Voir [LICENSE](LICENSE) pour plus d'informations.

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance61

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

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/c75410f065deaf586d259daa5a30195e926e664ed0dfdc9ecc6a7e66e872b007?d=identicon)[alouspike](/maintainers/alouspike)

---

Top Contributors

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

### Embed Badge

![Health badge](/badges/alouspike-cmi-payment/health.svg)

```
[![Health](https://phpackages.com/badges/alouspike-cmi-payment/health.svg)](https://phpackages.com/packages/alouspike-cmi-payment)
```

###  Alternatives

[omnipay/paypal

PayPal gateway for Omnipay payment processing library

3156.8M53](/packages/omnipay-paypal)[eduardokum/laravel-boleto

Biblioteca com boletos para o laravel

626351.9k2](/packages/eduardokum-laravel-boleto)[tbbc/money-bundle

This is a Symfony bundle that integrates moneyphp/money library (Fowler pattern): https://github.com/moneyphp/money.

1961.9M](/packages/tbbc-money-bundle)[2checkout/2checkout-php

2Checkout PHP Library

83740.3k2](/packages/2checkout-2checkout-php)[smhg/sepa-qr-data

Generate QR code data for SEPA payments

61717.2k5](/packages/smhg-sepa-qr-data)[omnipay/braintree

Braintree gateway for Omnipay payment processing library

35558.0k3](/packages/omnipay-braintree)

PHPackages © 2026

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