Passer au contenu principal
Après avoir créé l’intention de paiement, vous devez la confirmer pour capturer le montant. Cela se produit généralement lorsque l’utilisateur final a terminé toutes les étapes nécessaires (comme fournir les informations de paiement ou accepter les conditions générales).

Confirmer une intention de paiement

Pour collecter le paiement auprès du client, vous devez confirmer l’intention de paiement précédemment générée. Vous pouvez confirmer l’intention de paiement autant de fois que nécessaire jusqu’à ce qu’elle soit confirmée avec un paiement réussi.

Préparer votre requête

Le point de terminaison à utiliser est POST https://pay.sandbox.yabetoopay.com/v1/payment-intents/:id/confirm pour l’environnement sandbox et POST https://pay.api.yabetoopay.com/v1/payment-intents/:id/confirm pour l’environnement de production, où :id correspond à l’identifiant de l’intention de paiement. Vous devez utiliser les paramètres suivants pour confirmer l’intention de paiement :
  • client_secret : Ce paramètre est l’identifiant secret de l’intention de paiement. Il est utilisé pour effectuer des opérations sécurisées liées à cette intention de paiement spécifique.
  • Informations du client (optionnel) :
    • first_name : Le prénom du client
    • last_name : Le nom de famille du client
    • receipt_email : L’adresse email du client
  • payment_method_data : Cette section contient les détails spécifiques du mode de paiement choisi par le client.
    • type : Le type de moyen de paiement momo (Mobile Money).
    • momo : Les détails du mobile money.
      • country : Le code pays du mobile money.
      • msisdn : Le numéro de mobile money au format international (ex : +242XXXXX).
      • operator_name : Le nom de l’opérateur du mobile money.
client_secret doit rester confidentiel et ne doit jamais être exposé dans le frontend ou le code client. Il doit uniquement être utilisé côté serveur. Il est utilisé pour authentifier l’intention de paiement.
Le corps de la requête doit être en JSON :
{
  "client_secret": "pi_AmBKcXsbKWQZOjPLDEQoxW06U35Xqt5nt1GN_secret_scKRe9xZ4l2ST2Yy6uwUQ0qBMNC9l2Z8vGGY",
  "first_name": "Loumbou",
  "last_name": "Scoty",
  "receipt_email": "scott@artkodes.com",
  "payment_method_data": {
    "type": "momo",
    "momo": {
      "country": "cg",
      "msisdn": "242065607120",
      "operator_name": "mtn"
    }
  }
}
const response = await fetch(
  "https://pay.sandbox.yabetoopay.com/v1/payment-intents/PAYMENT_INTENT_ID/confirm",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer YOUR_SECRET_KEY",
    },
    body: JSON.stringify({
      client_secret: "YOUR_CLIENT_SECRET",
      first_name: "Loumbou",
      last_name: "Scoty",
      receipt_email: "scott@artkodes.com",
      payment_method_data: {
        type: "momo",
        momo: {
          country: "cg",
          msisdn: "242065607120",
          operator_name: "mtn",
        },
      },
    }),
  }
);

const data = await response.json();
En appelant cette méthode, le montant associé à l’intention de paiement sera capturé, et le paiement sera considéré comme réussi si tout se passe bien. Avec ce modèle en deux étapes, les développeurs peuvent obtenir un plus grand contrôle sur le processus de paiement tout en offrant une expérience utilisateur fluide. Vous pouvez adapter ces deux étapes à vos besoins spécifiques (par exemple, pré-autorisation ou paiement différé).
La gestion des erreurs est importante, car la confirmation d’une intention de paiement peut échouer pour diverses raisons (fonds insuffisants, informations de paiement incorrectes, etc.).

Réponse

200 OK - Paiement réussi

Le corps de la réponse contiendra les paramètres suivants :
{
  "intentId": "pi_3r8utQTUlCY5hjV2pMtjtaNYsZ30FylO3PZk",
  "financialTransactionId": "7331529368",
  "transactionId": "pi_3r8utQTUlCY5hjV2pMtjtaNYsZ30FylO3PZk",
  "amount": 2228,
  "currency": "xaf",
  "status": "succeeded",
  "captured": true,
  "externalId": "ext_7hp8lsjCFwTemoeL",
  "id": "ch_ADdQhObdEDlz4L0kl7qNRniFjruNcrcY85xq",
  "createdAt": "2026-02-16T06:51:43.103+00:00",
  "updatedAt": "2026-02-16T06:51:43.177+00:00",
  "paymentMethodId": "pm_evILNJIgAyJs7S4KYmy5n5Ect8itay2GeycL"
}

200 OK - Paiement échoué

Lorsque le paiement échoue (ex : délai dépassé, solde insuffisant), la réponse retourne toujours un code 200 mais avec un statut d’échec :
{
  "intentId": "pi_HUHh0kAg9H8QZvHtFf0taIspdWlUVftSOLhB",
  "transactionId": "pi_HUHh0kAg9H8QZvHtFf0taIspdWlUVftSOLhB",
  "amount": 10363,
  "currency": "xaf",
  "status": "expired",
  "captured": false,
  "externalId": "ext_mQliBh5ZbdQ9w15S",
  "failureMessage": "Transaction timed out",
  "failureCode": "Transaction timed out",
  "id": "ch_nZBtA8euTJFnpFMTSO402WJOP1g2WwWSGiC7",
  "createdAt": "2026-02-16T14:07:02.061+00:00",
  "updatedAt": "2026-02-16T14:07:02.190+00:00",
  "paymentMethodId": "pm_tU0HivHLBjozujmhwbVk3LO0B2ttcd0Rk1j3"
}

422 Mauvaise requête

Si l’opération n’est pas autorisée, le serveur renverra un code d’état 422 avec un message d’erreur.
{
  "status": 422,
  "path": "/v1/payment-intents/pi_2GlfKbBC6IMYBPDhOaFIRdn0nrXDDEAjBxyW/confirm",
  "timestamp": "2026-02-16T15:54:49.730+00:00",
  "code": "E_OPERATION_NOT_PERMITTED",
  "message": "Operation not permitted",
  "detail": "You are not permitted to perform this operation."
}

404 Non trouvé

Si l’identifiant de l’intention de paiement est invalide ou introuvable, le serveur renverra un code d’état 404.
{
  "message": "Row not found"
}

401 Non autorisé

Si la clé secrète est invalide, le serveur renverra un code d’état 401 avec un message d’erreur.
{
  "error": {
    "message": "Non autorisé",
    "code": "Unauthorized"
  }
}