Introduction
L'API MaliaPay vous permet d'accepter les paiements mobiles et bancaires en Côte d'Ivoire. Une seule intégration pour accéder à Wave, Orange Money, MTN MoMo, Moov, Djamo et les paiements par carte bancaire.
https://business.malia.ci/api/v1
Format des requêtes
- Toutes les requêtes sont en JSON
- Header obligatoire :
Content-Type: application/json - Authentification marchand :
X-API-Key: VOTRE_CLE_API - Le champ
montantaccepteintoustringet est normalisé côté serveur - Le champ
customer_emailest facultatif
1. Authentification
L'API de paiement n'accepte qu'un seul mode d'authentification : la clé API (header X-API-Key).
Clé API — obligatoire
Envoyez votre clé API via le header X-API-Key. La clé est liée à un marchand actif et permet d'appeler les endpoints de paiement sans login préalable.
Le merchant_id présent dans le body est forcé côté serveur pour correspondre à celui de la clé API. Cela évite qu'un client paie au nom d'un autre marchand.
2. Clé API (X-API-Key)
Chaque marchand dispose d'une clé API unique, générée automatiquement à la création du compte. Elle est visible et régénérable depuis l'espace marchand.
Où trouver ma clé API ?
Connectez-vous à votre espace marchand → Paramètres → Clé API. Vous pouvez copier la clé ou en générer une nouvelle.
Utiliser la clé API
Protection du merchant_id
Le middleware identifie le marchand grâce à la clé API et remplace le merchant_id du body par celui associé. Même si le client modifie merchant_id dans la requête, c'est la clé API qui fait autorité.
Ne partagez jamais votre clé API dans du code côté client. Stockez-la dans vos variables d'environnement et appelez l'API depuis votre backend.
3. Canaux de paiement
Utilisez ces codes pour spécifier le canal de paiement lors de la création d'une transaction.
| Canal | Code API | Type | Description |
|---|---|---|---|
| Wave CI | WAVECI | Mobile Money | Paiement via l'application Wave |
| Orange Money | OMCI | Mobile Money | Paiement via Orange Money CI |
| MTN MoMo | MTNCII | Mobile Money | Paiement via MTN Mobile Money |
| Moov CI | MOOVCI | Mobile Money | Paiement via Moov Money |
| Djamo | DJAMO | Mobile Money | Paiement via l'application Djamo |
| PeyaPay | PEYA_PAY | Mobile Money | Paiement via PeyaPay (avec OTP) |
| Carte Bancaire | CARD | Carte | Paiement par carte Visa/Mastercard |
4. Créer un paiement
Cet endpoint crée une transaction de paiement et retourne une URL de redirection pour le client final.
Headers requis
Corps de la requête
Connectez-vous à votre espace marchand → Paramètres → Informations du compte. Votre ID Marchand commence par MI_.
Réponse succès (200/201)
Redirigez votre client vers l'URL retournée dans le champ link. Le client complètera le paiement directement avec l'opérateur.
Formats acceptés : 0700000000, +2250700000000 ou 225700000000. Le serveur normalise automatiquement les numéros avant d'appeler les opérateurs.
Avec MTNCII aucune redirection n'est retournée. Le statut est pending et le client reçoit une notification push/ USSD pour valider la demande. Surveillez le statut via GET /payments/{transaction_id} ou le webhook.
Flux de paiement par canal
Wave, Orange, Moov, Djamo
Redirection vers une page de confirmation. Le client valide sur son téléphone et retourne automatiquement.
PeyaPay
Nécessite une validation par OTP. Le client entre le code reçu par SMS sur la page de paiement.
Carte Bancaire
Redirection vers l'interface sécurisée de SycaPay pour saisie des informations de carte.
5. PeyaPay (OTP)
Le canal PEYA_PAY fonctionne en deux étapes : une requête d'initiation envoie un OTP au client, puis une requête de vérification finalise le paiement.
Étape 1 — Initier
Le body est identique à la création de paiement standard, avec "channel": "PEYA_PAY" et un numéro de téléphone valide. La réponse contient peyapay_transaction_id à mémoriser.
Exemple de réponse (201)
Étape 2 — Vérifier le OTP
Le client reçoit un code par SMS et le renvoie via votre backend.
Étape 3 — Consulter le statut (optionnel)
Le endpoint verify est synchrone. En cas de traitement asynchrone, utilisez le statut PeyaPay pour suivre l'opération.
6. Vérifier le statut d'un paiement
Consultez le statut d'une transaction pour savoir si elle a été complétée, est en attente, ou a échoué.
Exemple de requête
-H "X-API-Key: mk_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json"
Réponse
Statuts possibles
| Statut | Description |
|---|---|
| pending | Paiement initié, en attente de confirmation client |
| processing | Paiement en cours de traitement chez l'opérateur |
| pending_otp | En attente de validation OTP (PeyaPay) |
| success | Paiement confirmé et réussi |
| failed | Paiement échoué (fonds insuffisants, erreur opérateur...) |
| cancelled | Paiement annulé par le client ou expiré |
7. Webhooks (Notifications)
Recevez des notifications en temps réel lorsqu'un paiement change de statut. Configurez votre URL webhook dans votre espace marchand.
Dans votre espace marchand : Paramètres → Webhooks. Ajoutez l'URL de votre endpoint de réception.
Endpoints des webhooks (appelés par les opérateurs)
| Canal | URL | Verbe |
|---|---|---|
| Wave | /api/webhooks/wave | POST |
| Orange | /api/webhooks/orange | POST |
| MTN | /api/webhooks/mtn | POST |
| Moov | /api/webhooks/moov | POST |
| Djamo | /api/webhooks/djamo | POST |
| Carte | /api/webhooks/card | POST |
Payload du webhook
Types d'événements
| Événement | Description |
|---|---|
payment.pending | Paiement initié |
payment.completed | Paiement réussi |
payment.failed | Paiement échoué |
payment.cancelled | Paiement annulé |
Vérification de la signature
Pour sécuriser vos webhooks, vérifiez la signature reçue dans l'en-tête ou le payload :
Retournez toujours un HTTP 200 à la réception du webhook. Traitez les événements de manière idempotente (une transaction peut générer plusieurs webhooks).
8. Codes d'erreur
| Code HTTP | Erreur | Description |
|---|---|---|
| 400 | Bad Request | Données manquantes ou invalides |
| 401 | Unauthorized | Clé API ou token manquant/invalide |
| 403 | Forbidden | Accès non autorisé à cette ressource |
| 404 | Not Found | Transaction ou ressource introuvable |
| 422 | Validation Error | Erreur de validation des champs |
| 429 | Too Many Requests | Rate limit dépassé |
| 500 | Server Error | Erreur serveur, réessayez plus tard |
Format d'erreur standard
9. Exemples complets
Exemple PHP complet
Exemple JavaScript (Node.js)
Exemple Python
10. Bac à sable (sandbox)
Utilisez le bac à sable pour tester votre intégration sans effectuer de vrai paiement. L'endpoint accepte le même body que /payments mais ne déclenche aucun appel opérateur.
Comportement
- Mêmes règles de validation que
/payments - Mêmes frais calculés
- Crée une transaction enregistrée avec le statut
successetgateway_transaction_id=TEST - Aucun appel à Wave, Orange, MTN, Moov, Djamo ou SycaPay
Exemple de requête
Réponse (201)
Utilisez ce endpoint pour valider votre clé API, votre format JSON et la structure des réponses avant de passer en production.
Support & Contact
Besoin d'aide pour l'intégration ? Notre équipe technique est disponible pour vous accompagner.
Une solution proposée par Lkmdigital
MaliaPay