> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yabetoopay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirmer une intention de paiement

> Confirmez une intention de paiement pour traiter un paiement

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.

<Note>
  `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.
</Note>

Le corps de la requête doit être en JSON :

```json theme={null}
{
  "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"
    }
  }
}
```

```javascript theme={null}
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é).

<Warning>
  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.).
</Warning>

## Réponse

### 200 OK - Paiement réussi

Le corps de la réponse contiendra les paramètres suivants :

```json theme={null}
{
  "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 :

```json theme={null}
{
  "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.

```json theme={null}
{
  "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.

```json theme={null}
{
  "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.

```json theme={null}
{
  "error": {
    "message": "Non autorisé",
    "code": "Unauthorized"
  }
}
```
