> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc-business.easytransfert.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Étape 3 - Réception de la notification IPN

> Comprendre et traiter les notifications IPN (webhooks)

## Principe

La confirmation finale d'une transaction est envoyée de façon asynchrone à votre `ipn_url`.

## Exemple IPN – Succès

```json theme={null}
{
  "transaction_id": "EFB.144358",
  "amount": 1000,
  "benefice": 1000,
  "commission": 0,
  "destination": "0500156008",
  "fee": 0,
  "reponse": "operation succes",
  "error": "",
  "service_id": 14,
  "customer_name": "KAYBIC AFRICA",
  "state": "SUCCESSFUL",
  "custom_data": "order_789",
  "ipn_url": "",
  "provider_id": null,
  "sms_link": 0,
  "created_at": "2022-10-18T02:38:44.000+00:00",
  "updated_at": "2022-10-18T02:38:44.000+00:00",
  "ipn_state": 0
}
```

## Exemple IPN – Échec

```json theme={null}
{
  "transaction_id": "EFB.144359",
  "amount": 2000,
  "benefice": 2000,
  "commission": 0,
  "destination": "0670123456",
  "fee": 0,
  "reponse": "",
  "error": "Solde insuffisant",
  "service_id": 10,
  "customer_name": "KAYBIC AFRICA",
  "state": "FAILED",
  "custom_data": "order_789",
  "ipn_url": "",
  "provider_id": null,
  "sms_link": 0,
  "created_at": "2022-10-18T02:38:44.000+00:00",
  "updated_at": "2022-10-18T02:38:44.000+00:00",
  "ipn_state": 0
}
```

## Champs du payload IPN

| Champ            | Type        | Description                                                                                    |
| ---------------- | ----------- | ---------------------------------------------------------------------------------------------- |
| `transaction_id` | string      | Identifiant unique de la transaction                                                           |
| `state`          | string      | État de la transaction : SUCCESSFUL ou FAILED                                                  |
| `amount`         | number      | Montant de la transaction en FCFA                                                              |
| `benefice`       | number      | Bénéfice de la transaction                                                                     |
| `commission`     | number      | Commission appliquée                                                                           |
| `destination`    | string      | Numéro du bénéficiaire                                                                         |
| `fee`            | number      | Frais de transaction                                                                           |
| `reponse`        | string      | Message de succès (si SUCCESSFUL)                                                              |
| `error`          | string      | Message d'erreur (si FAILED)                                                                   |
| `service_id`     | number      | Identifiant du service utilisé                                                                 |
| `customer_name`  | string      | Nom du client/partenaire                                                                       |
| `custom_data`    | string      | Données personnalisées envoyées à l'initiation                                                 |
| `ipn_url`        | string      | URL de callback utilisée                                                                       |
| `provider_id`    | number/null | Identifiant du fournisseur                                                                     |
| `sms_link`       | number      | Indicateur de lien SMS                                                                         |
| `created_at`     | string      | Date de création (ISO 8601)                                                                    |
| `updated_at`     | string      | Date de mise à jour (ISO 8601)                                                                 |
| `ipn_state`      | number      | État de l'IPN                                                                                  |
| `hash`           | string      | Cette valeur vient confirmer que la réponse du webhook provient véritablement de KAYBIC AFRICA |

## Vérification du Hash

Pour la vérification du hash, vous devez générer une clé SHA256 en concatenant votre clé d'api `API_KEY` et l'id de la transaction courante `TRANSACTION_ID` que vous comparez ensuite à la valeur du `hash` que vous recevez dans l'IPN.

`const generatedHash = sha256(api_key + transaction_id)`

`generatedHash == hash ? console.log('la réponse vient de chez nous') : console.log('la réponse ne viens pas de chez nous)`

## États possibles

| État         | Description         |
| ------------ | ------------------- |
| `SUCCESSFUL` | Transaction réussie |
| `FAILED`     | Transaction échouée |

## Recommandations

* Toujours répondre HTTP 200 OK à l'IPN pour confirmer la réception
* Vérifier l'unicité du `transaction_id` pour éviter les traitements en double
* Utiliser `custom_data` pour faire le lien avec votre système interne
* Vérifier que la réponse provient de nous véritablement à partir du `hash`
