Aller au contenu

Limites et sécurité

Les limites

Limite Valeur
Quota de requêtes 120 requêtes par minute et par application (clés sandbox et live comptées ensemble pour l’application)
Montant minimum 0.01
Montant 12 chiffres au plus au total, dont 2 décimales au plus
description 500 caractères
customer_phone 20 caractères
Délai d’attente de votre webhook 15 secondes
Nouvelles tentatives d’une notification 3, à 1 minute d’intervalle
Paiement PENDING sans réponse de l’opérateur expiré au bout de 30 minutes

Au-delà du quota, vous recevez 429 Too Many Requests. Attendez quelques secondes puis réessayez. Si vous interrogez le statut en boucle, espacez les requêtes (3 à 5 secondes) et préférez les webhooks.

La sécurité, en 10 règles

  1. Tous les appels à MafPay se font depuis votre serveur. Jamais depuis un navigateur ou une application mobile.
  2. Le secret sk_… ne quitte jamais votre serveur : ni front-end, ni dépôt Git, ni logs, ni email.
  3. Variables d’environnement pour les clés, jamais dans le code.
  4. HTTPS partout, y compris pour votre webhook_url en production.
  5. Vérifiez la signature de chaque notification (Webhooks), sur le corps brut, en temps constant.
  6. Vérifiez le montant et la référence d’un paiement avant de livrer.
  7. Soyez idempotent : traitez une notification une seule fois même si elle arrive plusieurs fois.
  8. Ne croyez jamais le navigateur : « le client est revenu sur ma page de succès » ne prouve rien. Seul le statut SUCCESS (par notification ou par consultation du statut) fait foi.
  9. Régénérez immédiatement vos clés dans le portail si vous soupçonnez une fuite.
  10. Utilisez des applications séparées pour vos environnements et produits (test, production, chaque site) : chacune a ses propres clés et se régénère indépendamment.

Les montants

  • Envoyez amount sous forme de texte ("5000") : cela évite les erreurs d’arrondi des nombres à virgule.
  • En franc CFA (XOF), utilisez des montants entiers. Orange Money les impose.
  • Ne recalculez pas un montant à partir de la réponse : comparez data.amount de la notification ("5000.00") à votre commande en tant que nombre (Number("5000.00") === 5000), pas en texte.

Vos données (metadata)

  • metadata est un objet JSON libre que MafPay conserve tel quel et vous renvoie dans la réponse d’initiation, dans le statut de paiement et dans chaque notification.
  • Mettez-y l’identifiant de votre commande (order_id), pas de données sensibles (mots de passe, numéros de carte…).
  • MafPay ne modifie jamais vos metadata : les données de l’opérateur sont stockées à part.

Les adresses de notification et la protection SSRF

MafPay n’appelle jamais une adresse webhook_url qui pointe vers un réseau privé (localhost, 10.x, 192.168.x, adresses internes des hébergeurs…) : c’est une protection contre les attaques par détournement. En production, votre adresse doit donc être publique et en HTTPS. En développement, utilisez un tunnel (ngrok, Cloudflare Tunnel) pour exposer votre machine.