Passer au contenu principal
Ce guide explique le flux de paiement complet dans Yabetoo, de la création d’une intention de paiement à la réception de la confirmation via les webhooks.

Vue d’ensemble

Le flux de paiement Yabetoo suit un processus en deux étapes qui vous donne un contrôle total sur le moment et la manière dont les paiements sont capturés.

Étape 1 : Créer une intention de paiement

Une intention de paiement représente votre intention de collecter un paiement. Elle suit le cycle de vie du paiement et stocke les informations sur la transaction.
curl https://pay.sandbox.yabetoopay.com/v1/payment-intents \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_test_XXXXXXXXXXXXXXXXXXXXXXXX" \
  -d '{
    "amount": 5000,
    "currency": "xaf"
  }'
À cette étape :
  • Aucun argent n’a été transféré
  • L’intention est au statut pending
  • Vous avez un client_secret pour l’étape suivante

Étape 2 : Confirmer l’intention de paiement

La confirmation déclenche le paiement réel. Vous fournissez les détails du moyen de paiement du client (informations Mobile Money).
curl https://pay.sandbox.yabetoopay.com/v1/payment-intents \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_test_XXXXXXXXXXXXXXXXXXXXXXXX" \
  -d '{
    "client_secret": "pi_xxx_secret_yyy",
    "first_name": "Jean",
    "last_name": "Dupont",
    "receipt_email": "[email protected]",
    "payment_method_data": {
      "type": "momo",
      "momo": {
        "country": "cg",
        "msisdn": "+242066594470",
        "operator_name": "mtn"
      }
    }
  }'
Après la confirmation :
  • Le client reçoit une notification push sur son téléphone
  • Il entre son code PIN pour autoriser le paiement
  • Yabetoo attend la réponse du fournisseur Mobile Money

Étape 3 : Gérer le résultat

Réponse synchrone

La requête de confirmation retourne immédiatement avec le statut du paiement :
{
  "intent_id": "pi_9aATHBv8UXuD6H5qrSav",
  "amount": 5000,
  "currency": "xaf",
  "status": "succeeded",
  "captured": true
}

Notification Webhook

Pour plus de fiabilité, écoutez toujours les webhooks. Yabetoo envoie un événement intent.completed lorsque le paiement réussit :
// Votre endpoint webhook
app.post("/webhook", (req, res) => {
  const event = req.body;

  if (event.type === "intent.completed") {
    const payment = event.data;
    // Mettre à jour votre base de données
    // Envoyer une confirmation au client
  }

  res.status(200).send("OK");
});

Statuts de paiement

StatutDescription
pendingIntention de paiement créée, pas encore confirmée
processingLe paiement est en cours de traitement par le fournisseur Mobile Money
succeededPaiement effectué avec succès
failedPaiement échoué (fonds insuffisants, rejeté, etc.)

Codes d’erreur courants

Lorsqu’un paiement échoue, vous pouvez recevoir l’un de ces codes d’erreur :
CodeDescription
LOW_BALANCE_OR_PAYEE_LIMIT_REACHED_OR_NOT_ALLOWEDFonds insuffisants, limite de transaction atteinte, ou transaction non autorisée
TIMEOUTLe client n’a pas confirmé le paiement à temps
Gérez toujours l’erreur LOW_BALANCE_OR_PAYEE_LIMIT_REACHED_OR_NOT_ALLOWED gracieusement en informant le client que son paiement n’a pas pu être traité en raison d’un solde insuffisant ou de restrictions sur son compte.

Bonnes pratiques

  1. Vérifiez toujours les webhooks - Ne vous fiez pas uniquement à la réponse synchrone
  2. Stockez l’ID de l’intention de paiement - Liez-le à votre commande pour le suivi
  3. Gérez les échecs gracieusement - Affichez des messages d’erreur clairs aux utilisateurs
  4. Implémentez l’idempotence - Prévenez les paiements en double lors des nouvelles tentatives

Alternative : Sessions de paiement

Pour une intégration plus simple, utilisez les Sessions de paiement. Yabetoo gère l’interface de paiement complète :
curl https://buy.api.yabetoopay.com/v1/sessions \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk_test_XXXXXXXXXXXXXXXXXXXXXXXX" \
  -d '{
    "total": 5000,
    "currency": "xaf",
    "accountId": "acct_XXXXXXXX",
    "successUrl": "https://votresite.com/success",
    "cancelUrl": "https://votresite.com/cancel",
    "items": [{
      "productId": "prod_123",
      "productName": "Plan Premium",
      "quantity": 1,
      "price": 5000
    }]
  }'
Pour plus de détails sur chaque étape, consultez la documentation de l’API Payment Intent.