Litiges
Quand un payeur conteste un paiement, comment vous répondez, et ce qu'une perte vous coûte.
Un litige, c'est un payeur qui signale à Wajub qu'un paiement qu'il a effectué pose problème. Il porte sur un seul paiement, ne bloque rien de votre côté, et se termine de l'une de deux façons : soit vous gardez l'argent, soit il repart et votre solde est débité.
Contrairement à un remboursement, ce n'est pas vous qui ouvrez un litige, et vous ne pouvez pas en créer un par l'API. Votre rôle est d'y répondre.
Les endpoints de litige exigent la clé secrète
Chaque appel de cette page passe par le contrôle de clé privée et répond 406 Not Acceptable
avec Private Key Required à une clé publique. Ces appels ont leur place sur votre serveur.
D'où vient un litige
Le payeur l'ouvre depuis Pocket, le portefeuille Wajub où il retrouve les paiements qu'il a effectués. Il choisit un motif, décrit le problème, et cette description devient le premier message du fil de discussion du litige.
| Motif choisi par le payeur | Ce qu'il affirme |
|---|---|
product_not_received | Il a payé et rien n'est arrivé |
product_not_as_described | Ce qui est arrivé ne correspond pas à ce qui était vendu |
duplicate_charge | Il a été débité deux fois pour la même chose |
fraudulent | Il n'a pas effectué ce paiement |
other | Tout autre cas, expliqué dans la description |
Un litige porte toujours sur le montant total du paiement, jamais sur une partie, et un paiement ne peut avoir qu'un seul litige en cours à la fois. Un second litige ne peut pas être ouvert tant que le premier n'est pas résolu.
Les litiges n'existent pas en sandbox
Impossible d'en produire un avec un paiement de test : le seul chemin de code qui crée un litige le fixe en dur en production. Ce parcours ne peut donc pas être répété de bout en bout avant de passer en live. Construisez votre handler à partir des payloads de cette page, puis vérifiez-le sur le premier vrai litige que vous recevez.
Les états d'un litige
Un litige arrive en open. L'envoi de justificatifs le fait passer de lui-même en under_review,
vous ne réglez pas ce statut vous-même. Depuis l'un ou l'autre de ces deux états, il peut se
terminer en won ou en lost, et les deux sont définitifs.
C'est Wajub qui tranche. Aucun endpoint ne vous permet de vous déclarer gagnant ; ce que vous pouvez faire, c'est présenter les justificatifs à ceux qui décident, ou concéder.
Un statut resolved que vous ne verrez pas
L'endpoint de liste accepte ?status=resolved, et la valeur existe dans le schéma, mais rien ne
l'écrit jamais sur un litige. Filtrez sur won et lost pour les litiges terminés.
Répondre avec des justificatifs
C'est cette étape qui décide de l'issue, et elle mérite d'être soignée. Chaque justificatif est classé sous un type, et vous pouvez faire plusieurs appels pour constituer votre dossier.
https://api.wajub.com/disputes/{id}/submit-evidenceevidence_typeenumobligatoirecustomer_communication, proof_of_delivery, service_documentation, receipt, product_description, cancellation_policy, refund_policy, duplicate_charge_documentation, other.evidence_textstringfacultatifevidence_filefilefacultatifmultipart/form-data.Le type est un emplacement, pas une étiquette. Envoyez deux appels avec proof_of_delivery et le
second remplace le premier, il ne s'y ajoute pas. Utilisez un type différent pour chaque
justificatif distinct, et mettez tout ce que vous voulez dire sur un justificatif dans cet unique
appel.
Comme un fichier est en jeu, il s'agit d'un envoi de formulaire et non d'un corps JSON.
curl https://api.wajub.com/disputes/dsp_hrgUOE225KMKULRQqYvlh/submit-evidence \
-H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
-F "evidence_type=proof_of_delivery" \
-F "evidence_text=Delivered 12 Sept, signed for by the customer." \
-F "evidence_file=@/path/to/delivery-note.pdf"L'appel répond 200 OK avec le litige dans son état actuel, déjà passé en under_review, et vos
justificatifs regroupés sous evidence.
Les justificatifs ne peuvent être déposés que tant que le litige est open ou under_review. Une
fois en won ou lost, l'appel répond 422 et le dossier est clos.
Concéder, et un appel qui ne fait pas ce que son nom laisse croire
Si le payeur a raison, concédez tôt plutôt que de laisser traîner.
https://api.wajub.com/disputes/{id}/acceptL'acceptation prend un merchant_response facultatif, 2 000 caractères maximum, enregistré sur le
litige. Elle passe le litige en lost immédiatement, sans retour possible.
close, c'est accept sous un autre nom
POST /disputes/{id}/close n'est pas une façon neutre de ranger un litige. Il exécute exactement
le même code que accept : le litige passe en lost, votre solde est débité, et l'issue est
définitive. Si vous cherchiez un appel qui classe un litige en votre faveur, il n'en existe pas.
Envoyez plutôt des justificatifs.
Échanger avec le payeur
Un litige porte un fil de messages, ouvert par la description du payeur lui-même. Vous pouvez y répondre.
https://api.wajub.com/disputes/{id}/messagesLes messages prennent content, obligatoire et limité à 5 000 caractères, et un tableau
attachments facultatif de fichiers soumis aux mêmes contraintes que les justificatifs.
POST /disputes/{id}/send-message est un alias du même appel. Vos messages sont enregistrés avec
un sender_type à merchant, ceux du payeur avec customer, et le fil complet est renvoyé
lorsque vous récupérez le litige.
Consulter les litiges
Récupérer un litige le renvoie avec sa transaction, son client et son fil de messages complet.
https://api.wajub.com/disputes/{id}https://api.wajub.com/disputes| Paramètre de requête | Valeurs acceptées |
|---|---|
per_page | De 1 à 100, 25 par défaut |
status | open, under_review, won, lost |
search | Texte libre sur l'id, le motif et la description du litige |
date_from, date_to | Dates, date_to pas antérieure à date_from |
cursor | Passe à la pagination par curseur |
Au-delà des champs évidents, un litige porte la description du payeur, votre
merchant_response, les justificatifs que vous avez déposés dans evidence, resolved_at une
fois terminé, et metadata.
due_date est toujours absent
La ressource déclare un due_date, mais rien ne le renseigne jamais, il n'apparaît donc dans
aucune réponse. Le payload ne contient aucune échéance à décompter. Considérez qu'un nouveau
litige appelle une réponse immédiate, et non qu'il porte un minuteur que vous pourriez lire.
Ce que coûte une perte
Quand un litige passe en lost, deux débits distincts frappent votre solde. Le montant contesté
part en premier, plafonné à ce qui n'est pas déjà sorti par un remboursement sur le même paiement,
pour que l'argent ne puisse pas être pris deux fois. Ensuite, des frais de litige forfaitaires
s'ajoutent, 15 000 XAF par défaut dans la devise du litige, et ceux-là s'appliquent qu'un
remboursement ait eu lieu ou non.
Perdre un litige de 25 000 XAF coûte donc 40 000 XAF, et non 25 000. Les deux débits ont lieu au changement de statut lui-même, pas lors d'un appel que vous feriez ensuite.
Le paiement d'origine n'est pas touché par tout cela. Il reste succeeded, exactement comme lors
d'un remboursement, et perdre un litige ne crée aucun objet remboursement. Le mouvement d'argent
est inscrit dans le registre du solde, et c'est là que vous le rapprochez.
La perte alimente aussi le score de risque : un litige perdu augmente le risque évalué du payeur concerné, et Shield examine donc ses futurs paiements avec plus de méfiance.
Webhooks
Six événements, et ceux qui méritent une action sont les issues.
| Événement | Déclenché quand |
|---|---|
dispute.created | Un payeur a ouvert un litige. Lisez-le et décidez comment répondre |
dispute.updated | Un champ a changé, y compris à chaque changement de statut |
dispute.won | Résolu en votre faveur, rien ne quitte votre solde |
dispute.lost | Résolu contre vous, le montant est débité |
dispute.closed | Le litige a atteint un état final |
dispute.deleted | L'enregistrement du litige a été supprimé |
Une perte vous envoie trois webhooks
Le passage en lost émet dispute.updated, dispute.lost et dispute.closed, dans cet ordre,
pour le même événement. Choisissez-en un pour agir, dispute.lost, et laissez passer les deux
autres. Agir aussi sur dispute.closed débitera deux fois votre propre comptabilité.
dispute.createdévénementDédupliquez sur X-Wajub-Delivery-Id, comme partout ailleurs. L'enregistrement et la vérification
de signature sont décrits dans Webhooks.
Dans le Dashboard
Disputes les liste avec leur statut et le paiement concerné. Ouvrir un litige vous donne la description du payeur, le fil de messages, et les trois mêmes actions que l'API, plus une qu'elle n'expose pas : vous pouvez marquer ici un litige comme gagné quand Wajub a tranché en votre faveur.
La section exige la permission manage_disputes, distincte de manage_payments, pour qu'un
coéquipier puisse gérer les commandes sans pouvoir concéder un litige à votre place.
Moins de litiges coûte moins cher que d'en gagner
Un litige vous coûte du temps quelle qu'en soit l'issue, et le travail le plus rentable se fait donc avant qu'il n'existe.
Remboursez de bon gré quand un client se plaint et que vous n'avez pas d'argument : un remboursement que vous choisissez vous coûte le montant, un litige perdu vous coûte le montant plus les frais de litige forfaitaires. Gardez vos preuves de livraison là où vous pouvez les joindre en un clic. Et laissez Shield refuser les paiements les plus susceptibles de se retourner contre vous, puisqu'un paiement refusé d'emblée ne peut pas du tout être contesté.
Pages associées
- Shield, détection de fraudeRefusez les paiements risqués avant qu'ils puissent être contestés.
- RemboursementsRendez l'argent selon vos conditions, pas selon les siennes.
- Solde et règlementsOù atterrit le débit d'un litige perdu.
- WebhooksEnregistrez un endpoint et vérifiez la signature des événements de litige.
- Bonnes pratiques de sécuritéLimitez la fraude côté intégration.
- Référence API des litigesChaque champ de la ressource, et les six endpoints.