Remboursement (Refund)

Remboursement (Refund)

L’endpoint POST /v1/payin/{reference}/refund permet de rembourser partiellement ou totalement un paiement client (Payin) précédemment validé.

Cette opération crédite le compte du client ou annule la transaction selon le mode de règlement initial.


Endpoint

ÉlémentDescription
MéthodePOST
Url/v1/payin/{reference}/refund
AuthAuthorization: Basic base64(api_key:api_client)
IdempotenceX-Idempotency-Key obligatoire
Payload Typeapplication/json
Timeout recommandé30 secondes

Objectif

  • Effectuer un remboursement total d’un paiement validé.
  • Effectuer un remboursement partiel si le montant remboursé est inférieur au paiement original.
  • Rétablir la cohérence entre les transactions client et les soldes marchands.
  • Automatiser la gestion des litiges et annulations.

Exemple de Requête

POST /v1/payin/tr_fhchi842jyimwiugjgszcxvb8n/refund

Headers

KeyDescriptionObligatoire
AuthorizationBasic base64(api_key:api_client)
X-Idempotency-KeyUUID garantissant l’unicité de la requête

Request Body

{
  "amount": 150,
  "reason": "Client cancellation",
  "externalReference": "refund_9843b-9911c-qa87"
}

Exemple de Réponse

{
  "type": "refund",
  "reference": "rf_fhchi842jyimwiugjgszcxvb8n",
  "originalReference": "tr_fhchi842jyimwiugjgszcxvb8n",
  "amount": 150,
  "fee": 0,
  "currency": "XOF",
  "status": "processing",
  "reason": "Client cancellation",
  "refundType": "partial",
  "customerMsisdn": "+2250702968786",
  "customerName": "John",
  "createdAt": "2025-08-23T12:34:48.189Z",
  "transaction": {
    "reference": "tr_rf84dhf9pqiuhd38",
    "status": "pending",
    "processedAt": null
  }
}

Interprétation des Champs

ChampDescription
typeType d’opération (refund).
referenceIdentifiant unique du remboursement.
originalReferenceRéférence du paiement d’origine à rembourser.
amountMontant à rembourser.
feeFrais associés (si applicables).
currencyDevise du remboursement (XOF, USD, etc.).
statusStatut du remboursement (pending, processing, completed, failed).
reasonMotif du remboursement transmis par le marchand.
refundTypeType de remboursement (full ou partial).
customerMsisdnNuméro de téléphone du client remboursé.
customerNameNom du client.
createdAtHorodatage de création de la demande de remboursement.
transactionDétails de la transaction de remboursement côté Core System.

Les Statuts de Remboursement

StatutDescription
pendingDemande reçue, en attente de traitement.
processingRemboursement en cours d’exécution.
completedRemboursement validé et crédité au client.
failedRemboursement refusé ou rejeté (fonds insuffisants, délai dépassé, etc.).
reversedMontant reversé au marchand après un échec ou une annulation manuelle.

Différence entre Remboursement Total et Partiel

TypeDescriptionCondition
Total (full)Remboursement intégral du montant initial.amount = montant du paiement original
Partiel (partial)Remboursement d’une partie du montant initial.amount < montant du paiement original

💡 Un paiement peut être remboursé plusieurs fois partiellement, tant que le total des montants remboursés ≤ montant initial.


Vérification du Remboursement

Une fois le remboursement initié, son statut peut être suivi via :

GET /v1/payin/{reference}

ou via les webhooks :

ÉvénementDescription
refund.processingRemboursement en cours.
refund.completedRemboursement exécuté avec succès.
refund.failedRemboursement refusé.

Cycle de Vie d’un Refund


Contraintes et Bonnes Pratiques

RègleDescription
Remboursement unique par référenceChaque remboursement génère une nouvelle référence (rf_...).
Montant maximalNe peut pas dépasser le montant original de la transaction.
Fenêtre temporelleUn remboursement ne peut être demandé que pendant la période autorisée (ex. 7 jours après le paiement).
Fonds disponiblesLe marchand doit disposer d’un solde suffisant pour couvrir le remboursement.
SécuritéVérification par signature HMAC et journalisation des remboursements

Erreurs Possibles

CodeMessageCause probableAction recommandée
400Invalid amountMontant supérieur au paiement originalVérifier le montant
401UnauthorizedAuthentification invalideVérifier la clé API
403Refund not allowedTransaction non remboursableVérifier les conditions de remboursement
404Payment not foundRéférence introuvableVérifier la référence d’origine
409Duplicate refundTentative de remboursement déjà effectuéeUtiliser une clé d’idempotence différente
500Internal Server ErrorErreur du serveurRéessayer plus tard

Exemple d’Utilisation Courante

CasExempleDescription
Annulation clientreason: "Client cancellation"L’utilisateur annule sa commande après paiement.
Remboursement partielamount: 500Le marchand rembourse partiellement un achat.
Erreur de facturationreason: "Duplicate charge"Paiement doublon à rembourser.

Typologie des Transactions

TypeConfirmation ClientInteraction Mobile MoneyNotification
Paiement déclenché✅ Oui❌ Non✅ Oui
Transfert interne (P2P)❌ Non❌ Non✅ OuI