API de Paiement avec Coffre-fort

Acceptez les paiements MTN et Airtel en toute securite. L'argent est protege dans un coffre-fort jusqu'a confirmation de livraison. Protection acheteur ET vendeur.

https://api.mayfipay.com/v1
đź”’

Coffre-fort Escrow

L'argent est securise jusqu'a confirmation de livraison par code SMS

📱

Code Livraison SMS

L'acheteur recoit un code 6 chiffres. Le vendeur l'entre pour liberer les fonds

🏪

Mode Marketplace

Gerez plusieurs vendeurs avec commissions automatiques

🔌

Plugin WordPress

Integration WooCommerce en 5 minutes. Compatible Dokan/WCFM

Démarrage rapide

Intégrez MayfiPay en quelques minutes.

1. Créer une clé API
  1. Connectez-vous sur app.mayfipay.com
  2. Profil → API & Intégration → + Nouveau projet
  3. Copiez votre clé mfp_live_xxx
2. Initier un paiement
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"
  }'
3. Rediriger vers le checkout
// Réponse → récupérer checkout_url
window.location.href = response.data.checkout_url;
4. Recevoir la confirmation webhook
// 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.

EnvironnementClé APIComportement
🟢 Live mfp_live_xxx Paiements réels Mobile Money
🔵 Sandbox mfp_test_xxx Simule les paiements — aucun argent réel prélevé
URL de base (identique pour les deux)
https://api.mayfipay.com/v1
Numéros de test (Sandbox uniquement)
NuméroOpérateurRésultat simulé
+242065000001MTN MoMo✅ Succès
+242065000002Airtel Money✅ Succès
+242065000003MTN MoMo❌ Échec (fonds insuffisants)
+242065000004Airtel Money⏱ Timeout (30s)
Obtenir vos clés
  1. Connectez-vous sur app.mayfipay.com
  2. Profil → API & Intégration → créez un projet et copiez la clé live (mfp_...)
  3. Ouvrez le projet → onglet Sandbox → « Activer le sandbox » pour générer une clé de test (mfp_test_...) rattachée au projet
Comment fonctionne la simulation
  • Avec une clĂ© de test, checkout_url pointe 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.

Comment ca marche
// 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.

Delai d'expiration

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.

Headers requis
Authorization: Bearer mfp_votre_cle_api
Content-Type: application/json
Obtenir votre cle
  1. Creez un compte vendeur sur app.mayfipay.com
  2. Completez votre KYC
  3. Profil → API & Intégration → + Nouveau projet
  4. 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.

TypeLimite (prévue)Fenetre
Paiements100 requĂŞtespar minute
Confirmations200 requĂŞtespar minute
Retraits10 requĂŞtespar minute

Idempotence

Utilisez le header Idempotency-Key pour éviter les doublons en cas de retry réseau.

Comportement
  • Si le header Idempotency-Key est 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
Recommandation
// 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)
Exemple
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)
POST POST /v1/payments

Creer un paiement

Cree une commande avec coffre-fort et retourne une URL de checkout.

Parametres
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
Exemple
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"
}
Reponse
{
  "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.

GET GET /v1/payments/:id

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.

Exemple (recommande)
curl "https://api.mayfipay.com/v1/payments?id=MONSITE-0042" \
  -H "Authorization: Bearer mfp_xxx"
Forme alternative (chemin)
curl https://api.mayfipay.com/v1/payments/MONSITE-0042 \
  -H "Authorization: Bearer mfp_xxx"
Reponse succes
{
  "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"}.

POST POST /v1/confirm

Confirmer la livraison

Le vendeur entre le code donne par l'acheteur pour liberer l'argent du coffre-fort.

Parametres
Parametre Type Description
order_number requis string Numero de commande (ex: MONSITE-0042)
code requis string Code 6 chiffres donne par l'acheteur
Exemple
POST /v1/confirm
Authorization: Bearer mfp_xxx

{
  "order_number": "MONSITE-0042",
  "code": "847293"
}
Reponse succes
{
  "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.

POST POST /v1/vendors

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.

Creer un sous-vendeur
POST /v1/vendors
Authorization: Bearer mfp_xxx

{
  "external_id": "vendor_123",
  "name": "Boutique Mode CG",
  "phone": "+242066789012",
  "email": "[email protected]"
}
Reponse
{
  "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.

Repartition des fonds (Marketplace)
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
POST Votre URL webhook

Webhooks

MayfiPay envoie des notifications a votre URL webhook configuree.

Evenements
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")
Payload payment.success
{
  "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.

⚠️ Vérification de signature

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.

POST POST /v1/payouts

Retrait vers Mobile Money

Le sous-vendeur d'une marketplace transfère ses fonds disponibles (portefeuille MayfiPay) vers son numéro Mobile Money.

Paramètres
ParamètreTypeDescription
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.

Frais et délais
OpérateurFraisDélai
MTN MoMo2%Instantané à 5 min
Airtel Money2%Instantané à 5 min
Exemple
POST /v1/payouts
Authorization: Bearer mfp_live_xxx

{
  "user_id": "uuid-du-sous-vendeur",
  "amount": 50000,
  "phone": "+242065123456"
}
Réponse (HTTP 201)
{
  "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.

Format
https://mayfipay.com/s/{order_number}?t={suivi_token}
Ce que voit le client
  • 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).

Fonctionnalites
  • 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
Installation
  1. Telechargez le plugin
  2. Dans WordPress: Extensions > Ajouter > Televerser
  3. Activez le plugin
  4. Allez dans MayfiPay > Configuration
  5. Entrez votre cle API
  6. C'est pret!
Telecharger le plugin WordPress v2.0.0
Mode Marketplace

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