Démarrage rapide
Intégrez MayfiPay en quelques minutes.
- Connectez-vous sur app.mayfipay.com
- Profil → API & Intégration → + Nouveau projet
- Copiez votre clé
mfp_live_xxx
curl -X POST https://api.mayfipay.com/v1/payments \
-H "Authorization: Bearer mfp_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"amount": 10000,
"description": "T-shirt Nike XL",
"external_id": "order_12345",
"customer": { "phone": "+242065123456", "name": "Jean Dupont" },
"return_url": "https://monsite.com/success"
}'
// Réponse → récupérer checkout_url
window.location.href = response.data.checkout_url;
// Votre serveur reçoit POST sur votre webhook_url
{
"event": "payment.success",
"data": { "order_number": "MONSITE-0042", "status": "payee" }
}
Activation immédiate
Votre clé API est active immédiatement après création. Testez avec les numéros sandbox avant de passer en production.
Environnements : Sandbox & Live
MayfiPay propose deux environnements. La différence est uniquement dans la clé API utilisée — la même URL de base pour les deux.
| Environnement | Clé API | Comportement |
|---|---|---|
| 🟢 Live | mfp_live_xxx |
Paiements réels Mobile Money |
| 🔵 Sandbox | mfp_test_xxx |
Simule les paiements — aucun argent réel prélevé |
https://api.mayfipay.com/v1
| Numéro | Opérateur | Résultat simulé |
|---|---|---|
+242065000001 | MTN MoMo | ✅ Succès |
+242065000002 | Airtel Money | ✅ Succès |
+242065000003 | MTN MoMo | ❌ Échec (fonds insuffisants) |
+242065000004 | Airtel Money | ⏱ Timeout (30s) |
- Connectez-vous sur app.mayfipay.com
- Profil → API & Intégration → créez un projet et copiez la clé live (
mfp_...) - Ouvrez le projet → onglet Sandbox → « Activer le sandbox » pour générer une clé de test (
mfp_test_...) rattachée au projet
- Avec une clé de test,
checkout_urlpointe vers une page MayfiPay de simulation (aucun appel Mobile Money) - Le client clique « Payer » ou « Simuler un échec » — la commande change de statut comme en réel
- Après un paiement simulé réussi, la page affiche le code de livraison à 6 chiffres pour tester la libération des fonds ; ce code est aussi inclus dans le payload du webhook (
data.code_livraison) - Votre webhook reçoit un vrai événement signé (
payment.success/payment.failed) avec"sandbox": true - Aucun argent réel, aucune commission — l'escrow n'est pas déclenché sur les commandes test, et elles n'apparaissent jamais dans vos statistiques
Bonne pratique
Stockez vos clés dans des variables d'environnement, jamais dans votre code source :
# .env
MAYFIPAY_API_KEY=mfp_live_xxx # Production
# MAYFIPAY_API_KEY=mfp_test_xxx # Sandbox
Systeme Coffre-fort (Escrow)
MayfiPay protege acheteurs et vendeurs grace au coffre-fort securise.
// 1. Client paie sur votre site
Client -> Paiement Mobile Money -> MayfiPay
// 2. Argent securise dans le coffre-fort
MayfiPay -> Coffre-fort (l'argent ne va PAS au vendeur)
// 3. SMS envoye au client avec code 6 chiffres
"Votre code livraison: 847293. Donnez-le au vendeur apres reception."
// 4. Vendeur livre le produit
Vendeur -> Livre -> Demande le code au client
// 5. Vendeur entre le code
POST /v1/confirm { "order_number": "MONSITE-0042", "code": "847293" }
// 6. Argent libere vers le vendeur
Coffre-fort -> Portefeuille vendeur -> Retrait Mobile Money
Protection double
Acheteur: Ne donne le code qu'apres avoir recu le produit. En cas de probleme, l'argent reste dans le coffre-fort.
Vendeur: Le paiement est deja confirme avant la livraison. Pas de risque d'impaye.
Si le code n'est pas entre dans les 7 jours et qu'aucun litige n'est ouvert, l'argent est automatiquement rembourse a l'acheteur.
Authentification
Toutes les requetes API necessitent votre cle API dans le header Authorization.
Authorization: Bearer mfp_votre_cle_api
Content-Type: application/json
- Creez un compte vendeur sur app.mayfipay.com
- Completez votre KYC
- Profil → API & Intégration → + Nouveau projet
- Configurez votre prefix de commandes (ex: "MONSITE")
Securite
Ne jamais exposer votre cle API cote client. Utilisez-la uniquement sur votre serveur.
Rate limits
Ă€ venir
Le rate limiting n'est pas encore appliqué par l'API. Les limites documentées ci-dessous correspondent aux valeurs prévues — aucune erreur 429 n'est actuellement renvoyée. Nous recommandons de ne pas dépasser 100 requêtes/minute par clé pour préparer votre intégration.
| Type | Limite (prévue) | Fenetre |
|---|---|---|
| Paiements | 100 requĂŞtes | par minute |
| Confirmations | 200 requĂŞtes | par minute |
| Retraits | 10 requĂŞtes | par minute |
Idempotence
Utilisez le header Idempotency-Key pour éviter les doublons en cas de retry réseau.
- Si le header
Idempotency-Keyest envoyé et qu'une requête avec cette même clé existe déjà → retourne la réponse originale (HTTP 200) sans créer de nouveau paiement - Si aucun header n'est fourni → chaque requête crée un nouveau paiement
- L'idempotence est garantie pendant 24 heures après la création
- La clé est propre à votre clé API : deux marchands peuvent utiliser la même valeur sans collision
// Utilisez l'ID de votre commande comme clé d'idempotence
POST /v1/payments
Authorization: Bearer mfp_xxx
Idempotency-Key: order_12345
{
"external_id": "order_12345", // Reference de commande (informatif)
"amount": 10000,
...
}
Frais
Structure tarifaire simple et transparente.
Taux configurables
Ces taux sont susceptibles d'evoluer. Les valeurs ci-dessous correspondent au tarif standard en vigueur.
| Etape | Frais | Paye par |
|---|---|---|
| Paiement | +3.5% | Acheteur (frais Mobile Money) |
| Commission | 3% | Vendeur (sur le montant de la vente) |
| Retrait | 2% | Vendeur (frais Mobile Money) |
Produit: 10 000 FCFA
Acheteur paie: 10 350 FCFA (10 000 + 3.5%)
Vendeur recoit: 9 700 FCFA (10 000 - 3% commission)
Apres retrait: 9 506 FCFA (9 700 - 2% frais retrait)
Creer un paiement
Cree une commande avec coffre-fort et retourne une URL de checkout.
| Parametre | Type | Description |
|---|---|---|
| amount requis | integer | Montant en FCFA (minimum: 100) |
| customer.phone requis | string | Telephone acheteur (pour recevoir le code SMS) |
| customer.name | string | Nom de l'acheteur |
| description | string | Description du produit/service |
| external_id | string | Votre reference de commande |
| return_url | string | URL apres paiement reussi |
| webhook_url | string | URL pour recevoir les notifications |
| sub_vendor_id | string | ID sous-vendeur (mode marketplace) |
| service_fee | integer | Commission marketplace en FCFA |
POST /v1/payments
Authorization: Bearer mfp_xxx
{
"amount": 10000,
"description": "T-shirt Nike XL",
"external_id": "order_12345",
"customer": {
"phone": "+242065123456",
"name": "Jean Dupont"
},
"return_url": "https://monsite.com/success",
"webhook_url": "https://monsite.com/webhook"
}
{
"success": true,
"data": {
"payment_id": "pay_abc123",
"order_number": "MONSITE-0042",
"checkout_url": "https://checkout.moneroo.io/pay_abc123",
"tracking_url": "https://mayfipay.com/s/MONSITE-0042?t=xxx",
"amount": 10000,
"fees": 350,
"total": 10350,
"status": "pending",
"expires_at": "2026-07-09T12:00:00Z"
}
}
Numero de commande
Le format est PREFIX-XXXX ou PREFIX est configure dans votre compte. Chaque commande a un numero unique incremente automatiquement.
Consulter un paiement
Recupere le statut d'une commande. L'identifiant accepte trois formats : le payment_id, le numero de commande (order_number) ou votre reference external_id.
Deux formes equivalentes
La forme par query param (?id=) est recommandee : elle fonctionne dans tous les cas. La forme chemin (/payments/:id) est supportee egalement.
curl "https://api.mayfipay.com/v1/payments?id=MONSITE-0042" \
-H "Authorization: Bearer mfp_xxx"
curl https://api.mayfipay.com/v1/payments/MONSITE-0042 \
-H "Authorization: Bearer mfp_xxx"
{
"success": true,
"data": {
"payment_id": "pay_abc123",
"order_number": "MONSITE-0042",
"external_id": "order_12345",
"amount": 10000,
"fees": 350,
"total": 10350,
"currency": "XAF",
"status": "payee", // pending | payee | livree | annulee | expire
"description": "T-shirt Nike XL",
"customer": {
"name": "Jean Dupont",
"phone": "+242065123456"
},
"tracking_url": "https://mayfipay.com/s/MONSITE-0042?t=xxx",
"created_at": "2026-08-01T12:00:00Z",
"paid_at": "2026-08-01T12:03:41Z",
"expires_at": "2026-08-08T12:00:00Z"
}
}
Statuts possibles
pending → en attente de paiement · payee → argent dans le coffre-fort · livree → livraison confirmée, fonds libérés · annulee → annulée · expire → délai de 7 jours dépassé.
En cas de commande inexistante ou n'appartenant pas à votre clé API : HTTP 404 {"success": false, "error": "Order not found"}.
Confirmer la livraison
Le vendeur entre le code donne par l'acheteur pour liberer l'argent du coffre-fort.
| Parametre | Type | Description |
|---|---|---|
| order_number requis | string | Numero de commande (ex: MONSITE-0042) |
| code requis | string | Code 6 chiffres donne par l'acheteur |
POST /v1/confirm
Authorization: Bearer mfp_xxx
{
"order_number": "MONSITE-0042",
"code": "847293"
}
{
"success": true,
"message": "Livraison confirmee, argent libere",
"data": {
"order_number": "MONSITE-0042",
"status": "livree",
"vendor_amount": 9700
}
}
Securite
Apres 3 codes incorrects, la commande est bloquee. Contactez le support pour debloquer.
Gestion des sous-vendeurs (Marketplace)
Si votre projet est en mode Marketplace, vous pouvez ajouter des sous-vendeurs qui recevront leur part automatiquement.
Commission automatique
Dans app.mayfipay.com → votre projet → bloc Commission marketplace, combinez librement un pourcentage et/ou un montant fixe (ex: 5% + 200 FCFA par vente). C'est votre commission : MayfiPay ajoute ses 3% par-dessus, et le total est visible par vos vendeurs. Exemple : vous configurez 10% → vos vendeurs voient 13% (vous 10% + MayfiPay 3%). Cette commission totale est appliquée automatiquement à chaque vente si votre intégration ne transmet pas service_fee. Si service_fee est transmis, il prime.
POST /v1/vendors
Authorization: Bearer mfp_xxx
{
"external_id": "vendor_123",
"name": "Boutique Mode CG",
"phone": "+242066789012",
"email": "[email protected]"
}
{
"success": true,
"data": {
"external_id": "vendor_123",
"name": "Boutique Mode CG",
"status": "invited",
"invite_url": "https://mayfipay.com/join/xxx"
}
}
Le sous-vendeur recoit un SMS d'invitation pour creer son compte MayfiPay. Une fois connecte, il recoit automatiquement sa part des ventes.
Vente: 10 000 FCFA avec service_fee: 1000
Coffre-fort recu: 10 000 FCFA
|
v
Apres confirmation livraison:
- MayfiPay: 300 FCFA (3%)
- Marketplace: 1 000 FCFA (service_fee)
- Sous-vendeur: 8 700 FCFA
Webhooks
MayfiPay envoie des notifications a votre URL webhook configuree.
| Evenement | Description |
|---|---|
| payment.success | Paiement reussi, argent dans le coffre-fort |
| payment.failed | Paiement echoue |
| payment.cancelled | Paiement annule par l'acheteur ou expiration |
| delivery.confirmed | Livraison confirmee, argent libere au vendeur |
| webhook.test | Ping de test envoy depuis votre tableau de bord (bouton "Envoyer un webhook de test") |
{
"event": "payment.success",
"data": {
"order_number": "MONSITE-0042",
"external_id": "order_12345",
"amount": 10000,
"status": "payee",
"customer": {
"name": "Jean Dupont",
"phone": "+242065123456"
},
"tracking_url": "https://mayfipay.com/s/MONSITE-0042?t=xxx"
}
}
Note importante
Le webhook payment.success signifie que l'argent est dans le coffre-fort, PAS que vous l'avez recu. Attendez delivery.confirmed pour marquer comme "livre" ou utilisez le tracking_url pour que le client suive sa commande.
Chaque webhook envoyé par MayfiPay inclut un header X-MayfiPay-Signature contenant un HMAC-SHA256 du corps de la requête, signé avec votre secret webhook. Validez toujours cette signature avant de traiter un webhook — sans ça, n'importe qui peut usurper un événement payment.success.
Condition
La signature n'est envoyée que si un webhook_secret est configuré sur votre clé API. Générez-le depuis votre tableau de bord (Profil → API & Intégration → votre projet → Secret webhook). Sans secret défini, aucun header de signature n'est présent.
// Node.js — Vérification de signature
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const computed = crypto
.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(computed),
Buffer.from(signature)
);
}
// Dans votre route POST /webhook :
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-mayfipay-signature'];
const secret = process.env.MAYFIPAY_WEBHOOK_SECRET;
if (!verifyWebhookSignature(req.body, sig, secret)) {
return res.status(401).json({ error: 'Signature invalide' });
}
const event = JSON.parse(req.body);
if (event.event === 'payment.success') {
// Mettre Ă jour votre commande
}
res.json({ received: true }); // Répondre 200 sous 30s
});
Secret webhook
Récupérez votre secret webhook sur app.mayfipay.com → Profil → API & Intégration → votre projet → Secret Webhook. Ce secret est différent de votre clé API.
Retrait vers Mobile Money
Le sous-vendeur d'une marketplace transfère ses fonds disponibles (portefeuille MayfiPay) vers son numéro Mobile Money.
| Paramètre | Type | Description |
|---|---|---|
| user_id requis | string | ID MayfiPay du vendeur (sous-vendeur de votre marketplace) |
| amount requis | integer | Montant en FCFA (minimum: 500) |
| phone requis | string | Numéro Mobile Money destinataire |
Conditions
Le user_id doit être un sous-vendeur enregistré sur votre clé API (via POST /v1/vendors). Le solde disponible du portefeuille du vendeur doit couvrir le montant. En cas d'erreur, HTTP 400/403 avec le détail.
| Opérateur | Frais | Délai |
|---|---|---|
| MTN MoMo | 2% | Instantané à 5 min |
| Airtel Money | 2% | Instantané à 5 min |
POST /v1/payouts
Authorization: Bearer mfp_live_xxx
{
"user_id": "uuid-du-sous-vendeur",
"amount": 50000,
"phone": "+242065123456"
}
{
"success": true,
"data": {
"withdrawal_id": "uuid-retrait",
"amount": 50000,
"frais": 1000,
"montant_net": 49000,
"phone": "+242065123456",
"status": "en_cours"
}
}
Suivi de commande (côté client)
Chaque commande possède une URL de suivi publique, fournie dans la réponse de création (tracking_url) et dans le webhook payment.success. Aucune authentification n'est nécessaire — le token dans l'URL fait foi.
https://mayfipay.com/s/{order_number}?t={suivi_token}
- Statut en temps réel : en attente → payée → livrée (ou annulée/expirée)
- Montant, description et date de la commande
- Le code de livraison à 6 chiffres s'affiche uniquement après paiement réussi
Bon pratique
Affichez le lien tracking_url dans votre page de confirmation et dans vos e-mails/SMS transactionnels : le client y retrouve son code de livraison sans que vous ayez à le gérer.
Plugin WordPress / WooCommerce
Integrez MayfiPay sur votre site WordPress en 5 minutes. Compatible avec les plugins multi-vendeurs (Dokan, WCFM, WC Vendors).
- Paiement Mobile Money (MTN, Airtel)
- Coffre-fort securise automatique
- Code livraison par SMS
- Dashboard admin pour confirmer les livraisons
- Mode Marketplace avec commissions
- Invitation automatique des sous-vendeurs
- Telechargez le plugin
- Dans WordPress: Extensions > Ajouter > Televerser
- Activez le plugin
- Allez dans MayfiPay > Configuration
- Entrez votre cle API
- C'est pret!
Si vous utilisez Dokan, WCFM ou WC Vendors, le plugin detecte automatiquement les nouveaux vendeurs et leur envoie une invitation pour creer leur compte MayfiPay.
Shortcode
Vous pouvez aussi ajouter un bouton de paiement n'importe ou avec:
[mayfipay_button amount="5000" description="Mon produit"]
Codes d'erreur
| Erreur | Description |
|---|---|
| Invalid API key | Cle API invalide ou manquante |
| Invalid amount | Montant invalide (min: 100 FCFA) |
| Customer phone is required | Numero de telephone manquant |
| Order not found | Commande non trouvee |
| Code incorrect | Code de livraison incorrect |
| Compte bloque | 3 codes incorrects - commande bloquee |
| Commande expiree | Delai de 7 jours depasse |