Aller au contenu
Chargement des API keys…

Paiements

Initialisez, récupérez, listez et annulez des paiements avec l'API Payments.

L'objet Payment (transaction) représente une tentative d'encaissement. Son cycle de vie va de pending à succeeded (ou failed). Toutes les routes partagent la base https://api.wajub.com.

Avant de commencer

Créez un paiement depuis votre serveur avec votre clé privée (sk. ou sk_test.), ou depuis un navigateur avec votre clé publique (pk. ou pk_test.). Les deux se trouvent dans le dashboard Wajub.

Marketplaces : agir pour le compte d'un sous-compte

Une plateforme peut attribuer un paiement à un sous-compte connecté en envoyant un en-tête X-Sync avec sa propre clé. Consultez Sous-comptes pour les règles et les cas d'erreur.

Endpoints

MéthodeCheminDescription
POST/paymentsInitialiser un paiement
POST/payments/{id}Débiter un paiement depuis votre serveur
POST/payments/{id}/confirmConfirmer une étape d'un débit (code, PIN, fenêtre du prestataire)
POST/payments/{id}/splitsDébiter la tranche suivante (Mobile Money en live)
POST/payments/{id}/closeClôturer un paiement réglé en partie en tranches
GET/payments/{id}Récupérer un paiement
GET/paymentsLister les paiements
DELETE/payments/{id}Annuler un paiement
GET/payments/{id}/refundsLister les remboursements d'un paiement
PATCH/payments/{id}Changer le montant d'un paiement préparé
POST/payments/{id}/activateCréer un paiement préparé une fois la commande passée

Paiements préparés

Un paiement créé avec deferred: true est seulement préparé. Il existe pour les champs de paiement montés sur votre page de commande avant que la commande existe, et il reste à l'écart de tout le reste jusqu'à ce que vous l'activiez.

PréparéActivé
Dans GET /payments et le dashboardNonOui
GET /payments/{id}Se lit pending, puis expired ou cancelled ; répond 404 une heure après son expiration ou son annulationLe paiement
payment.createdNon envoyéEnvoyé à l'activation
Montant et devisePATCH /payments/{id}Fixés
Peut être débitéNonOui
DELETE /payments/{id}Met fin à la session, sans webhookAnnule, envoie payment.cancelled

L'activation conserve l'id et le jeton de session que vous avez déjà transmis au navigateur. Un paiement préparé jamais activé expire avec sa session, et rien n'en parvient à vos paiements ni à votre endpoint de webhook, tant que vous n'avez envoyé aucun client en le préparant : ce client-là est créé, avec son customer.created.

L'objet Payment

Réponse de création ou réponse de lecture

La réponse de POST /payments (création) contient deux champs de plus, authorization_url et authorization_token, absents des réponses de lecture suivantes. Ce sont les deux champs les plus importants de la réponse de création.

Un champ sans valeur est absent de la réponse au lieu d'être envoyé à null.

idstringfacultatif
Identifiant unique de la transaction : trx_ suivi de 20 caractères, trx_test_ en sandbox. C'est l'identifiant à utiliser dans chaque appel d'API (GET /payments/{id}, corps de POST /refunds, etc.).
authorization_urlstringfacultatif
**Renvoyé par POST /payments uniquement.** L'URL de la page de paiement hébergée vers laquelle rediriger votre client. Une URL de session opaque : ne l'analysez pas et ne la construisez pas vous-même.
authorization_tokenstringfacultatif
**Renvoyé par POST /payments uniquement.** Jeton de session utilisable dans le navigateur, limité à ce paiement. Passez-le comme sessionId aux Wajub Components pour un checkout intégré.
referencestringfacultatif
La reference envoyée sur POST /payments : votre propre référence de commande, enregistrée et renvoyée telle quelle. Ce n'est pas un identifiant d'API, et Wajub ne vérifie jamais qu'elle est unique.
statusenumfacultatif
État actuel : pending, processing, succeeded, failed, cancelled, expired, partial, refunded, partially_refunded.
amountnumberfacultatif
Montant dans l'unité principale de la devise (par exemple 25000 = 25 000 XAF).
amount_paidnumberfacultatif
Ce que le payeur a payé jusqu'ici. Inférieur à amount tant qu'un paiement réglé en tranches est partial, et sur un tel paiement clôturé avant sa dernière tranche (POST /payments/{id}/close).
currencystringfacultatif
Code ISO 4217 de n'importe quelle devise active chez Wajub. Les canaux qui peuvent l'encaisser, et la devise dans laquelle ils règlent, sont sur [Couverture](/resources/coverage) ; la Sierra Leone est SLL.
channelstring?facultatif
Canal de paiement utilisé (par exemple cm.mtn, cm.orange, sn.wave).
payment_methodobject?facultatif
Moyen de paiement résolu : { channel, account }.
descriptionstring?facultatif
Libellé visible par le client sur la page de paiement.
itemsarray?facultatif
Lignes passées à l'initialisation, chacune avec name, description et quantity. Affichées sur la page de paiement, elles ne portent aucun prix et ne changent jamais amount. Sur un paiement fait sur la page d'une facture, ce sont les lignes de la facture, chacune avec son unit_price et son total, net de sa remise et taxe comprise ; à partir de la version 2026-10-12 de l'API, une remise sur toute la facture termine la liste, sous la forme d'un élément avec kind: discount, name: Discount, un total négatif, et quantity et unit_price à null.
taxobject?facultatif
Détail de la taxe quand une taxe s'est appliquée à un paiement live : { amount, taxable_amount, rate, name, country, inclusive }. Jamais présent en sandbox.
failure_reasonstring?facultatif
Pourquoi le paiement a échoué : le code du prestataire qui a refusé la dernière tentative, transmis tel quel, ou un code propre à Wajub (voir [Motifs d'échec](/api/failure-reasons#failed-payments)). Présent uniquement quand status=failed.
failure_messagestring?facultatif
Une phrase qui explique failure_reason, pour vos journaux et votre support. Présent uniquement quand status=failed.
receipt_urlstring?facultatif
Un lien permanent et signé vers le reçu du payeur. Présent une fois le paiement réussi, sauf si vous avez désactivé les reçus dans le Dashboard.
customerobject?facultatif
Le client : { id, name, email, phone }.
shipping_addressobject?facultatif
L'adresse de livraison du client : { address_line1, address_line2, city, state, postal_code, country }.
billing_addressobject?facultatif
L'adresse de facturation du client, mêmes champs.
metadataobject?facultatif
Données libres passées à la création.
invoicestring?facultatif
L'id de la facture que ce paiement règle, quand il a été fait sur la page d'une facture. Absent sinon.
linkstring?facultatif
L'id du [lien de paiement](/api/payment-links) par lequel ce paiement a été fait. Absent sinon.
clientobject?facultatif
D'où le payeur a payé, tel que son application ou sa page l'indique : { name, version, platform, os_version }. name vaut hosted-checkout, wajub-js, wajub-android, wajub-ios, wajub-flutter, wajub-react-native ou le nom que déclare une autre application, et platform l'une des valeurs android, ios, web, macos, windows ou linux. version, platform et os_version peuvent valoir null. Renseigné par la première tentative du payeur, jamais par un débit depuis votre serveur, et donné à titre indicatif. Non renvoyé à une clé publique.
callbackstring?facultatif
URL de redirection après le paiement.
bearerstringfacultatif
Qui supporte les frais Wajub : merchant, ou customer quand le payeur les paie en plus de amount.
expires_atdatetime?facultatif
Jusqu'à quand le payeur peut payer, défini avec expires.in à la création. Passé ce délai, le paiement devient expired, sauf si un débit est en cours : le paiement attend alors l'issue de ce débit. Voir [Expiration](/payments/lifecycle#expiry).
sandboxbooleanfacultatif
true pour les transactions du mode test.
credited_atdatetime?facultatif
Date à laquelle les fonds ont été crédités sur votre solde.
created_atdatetimefacultatif
Date de création ISO 8601, en UTC (+00:00).
updated_atdatetimefacultatif
Date ISO 8601 de la dernière modification.

Cycle de vie

Événements

ÉvénementDéclencheur
payment.createdPaiement initialisé, ou paiement préparé activé
payment.processingPaiement soumis au prestataire
payment.succeededPaiement validé avec succès
payment.failedPaiement échoué (voir failure_reason)
payment.attempt_failedUne tentative a été refusée sur-le-champ et le paiement est de nouveau pending
payment.expiredL'échéance du paiement (expires_at) est passée avant qu'il soit payé
payment.cancelledPaiement annulé avec DELETE /payments/{id} ou le bouton Annuler de la page hébergée
payment.split.processingUne tranche a été envoyée au payeur
payment.split.succeededUne tranche a été payée, et créditée sur votre solde
payment.split.failedUne tranche a été refusée ; l'appel suivant la débite de nouveau

Consultez le catalogue complet des événements pour les événements propres aux remboursements. Un remboursement sur un paiement ne réémet pas d'événement payment.* : il émet des événements refund.*.

Que pensez-vous de ce contenu ?