Checkout hébergé
La page que Wajub affiche à votre client, ce qu'elle prend en charge et ce que vous contrôlez.
Le checkout hébergé est le chemin le plus court vers un paiement qui fonctionne. Vous créez le paiement, vous envoyez le client vers la page affichée par Wajub, et vous vérifiez le résultat à son retour. La liste des opérateurs, la demande de confirmation, la nouvelle tentative quand le délai est dépassé et le libellé de chaque échec sont de notre ressort, et ils continuent de s'améliorer sans que vous ayez à toucher quoi que ce soit.
Cette page décrit le comportement, pas le code
Ce que fait la page hébergée, ce qu'elle décide seule et ce que vous pouvez y changer. Le code d'intégration lui-même, l'URL à construire et le composant à monter pour une redirection, une iframe intégrée ou une fenêtre superposée, se trouve dans Wajub Components → Checkout hébergé.
Créer le paiement
Tout ce dont la page a besoin vient de l'appel de création. Envoyez-le depuis votre serveur avec la clé secrète : la clé publique crée aussi des paiements, mais elle existe pour le cas où l'appel est fait depuis un navigateur.
https://api.wajub.com/paymentsamountnumberobligatoire10.50 vaut dix dollars cinquante. En XAF et XOF, le paiement doit être compris entre 25 et 2 000 000.currencystringobligatoirecustomerobjectfacultatifemail, phone, name, ainsi que address et metadata. Au moins un des champs customer, email, phone ou customer_id est obligatoire, et l'objet est la forme qui évolue avec vous.descriptionstringfacultatifitemsarrayfacultatifname, une description et une quantity. Elles sont affichées, jamais additionnées : amount reste le montant que vous débitez.callbackstring (url)facultatifreferencestringfacultatifexpires.inintegerfacultatifbearerstringfacultatifmerchant par défaut, ou customer, qui ajoute les frais au montant et affiche le détail sur la page.metadataobjectfacultatifreturn_url, en repli quand aucun callback n'est défini, et cancel_url, pour envoyer un client qui abandonne ailleurs que sur l'URL de succès.Un appel de création qui utilise les champs propres à la page hébergée ressemble à ceci :
curl https://api.wajub.com/payments \
-H "Authorization: sk_test.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
-H "Content-Type: application/json" \
-d '{
"amount": 25000,
"currency": "XAF",
"customer": { "email": "amina@example.com", "name": "Amina N." },
"description": "Order #4172",
"reference": "order-4172",
"items": [
{ "name": "Wireless earbuds", "quantity": 1 },
{ "name": "Delivery", "quantity": 1 }
],
"expires": { "in": 60 },
"callback": "https://shop.example.com/order/complete"
}'La réponse contient le paiement et la page vers laquelle envoyer le client. Enregistrez
transaction.id avec votre commande avant de rediriger :
authorization_url contient un jeton de session opaque, pas l'id de la transaction. Redirigez vers
cette URL exactement telle qu'elle est renvoyée : ne l'analysez jamais et n'en construisez jamais une
vous-même. L'hôte n'est d'ailleurs pas toujours pay.wajub.com, car un compte sur le plan Scale
peut servir son checkout depuis son propre domaine vérifié.
Ce que la page décide seule
Le client voit les opérateurs qui peuvent réellement prendre son argent, pas une liste figée. Wajub filtre par devise, par environnement et par montant : un canal incapable de traiter du XAF n'est jamais proposé, plutôt que d'échouer à la dernière étape.
Le Mobile Money plafonne un débit unique à 500 000 XAF, et au même montant en XOF. Un paiement
au-dessus n'est pas refusé : la page le découpe en tranches successives et les encaisse l'une après
l'autre. C'est la situation dans laquelle un paiement reste en partial, décrite dans le cycle de
vie d'un paiement.
Pendant que la demande de l'opérateur est en cours, la page affiche l'instruction propre au canal :
le code à composer de type #150# pour un opérateur, la confirmation dans l'application pour un
autre. Si vous définissez bearer à customer, elle affiche aussi les frais ajoutés à votre montant
et le total réellement débité.
La langue est l'anglais ou le français. Elle suit le réglage Settings → Regional → Language, qui
accepte auto, en ou fr, puis le preferred_language du client lui-même quand le réglage reste
sur auto.
Gérer le retour
Une fois la tentative terminée, le client revient sur votre callback, avec le paiement identifié
dans les paramètres de l'URL :
https://shop.example.com/order/complete?reference=trx_test_CSUGajfv9xh0XQ5wu2lx&status=succeeded&trxref=order-4172reference est l'id du paiement Wajub et trxref est la reference que vous avez envoyée, présente
seulement si vous en avez défini une. status vaut succeeded ou cancelled, rien d'autre : un
client qui abandonne sans annuler ne revient jamais.
Le retour ne prouve rien
N'importe qui peut ouvrir cette URL à la main et modifier status. Un client qui ferme l'onglet ne
l'ouvre jamais. Confirmez avec GET /payments/{id} depuis votre serveur, ou agissez sur le webhook
payment.succeeded, avant de livrer quoi que ce soit.
L'appel de vérification prend l'id que vous avez enregistré avant la redirection :
curl https://api.wajub.com/payments/trx_test_CSUGajfv9xh0XQ5wu2lx \
-H "Authorization: sk_test.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…"Vérifiez le montant et la devise en plus du statut, et laissez le webhook clôturer les commandes dont le client n'est jamais revenu.
Personnaliser la page
L'apparence de la page se règle une fois pour tout le compte, dans Settings → Branding, et s'applique à chaque page de paiement que vous créerez, en sandbox comme en production.
| Ce que vous réglez | Où cela apparaît |
|---|---|
| Logo rectangulaire, logo carré, favicon | L'en-tête de la page et l'onglet du navigateur |
| Couleurs principale, secondaire et d'arrière-plan | Les boutons, les liens et le fond de la page |
| Couleurs du texte et du texte des boutons | Le contraste avec votre propre palette |
| Couleurs de succès et d'erreur | Les états de confirmation et d'échec |
| Police et arrondi des bordures | Toute la page |
| Mode d'apparence | system, light ou dark |
| Densité et style de couverture | La compacité de la mise en page et le cadrage de l'en-tête |
| CSS personnalisé | Tout ce que les champs ci-dessus ne couvrent pas |
L'image de marque demande un plan payant
Settings → Branding dépend de la fonctionnalité design_customization, disponible à partir de
Growth. Sur Pay as you go, la page de paiement garde l'apparence par défaut. Servir le checkout
depuis votre propre domaine est une fonctionnalité distincte, disponible à partir de Scale.
Vous pouvez aussi collecter des informations que le paiement lui-même ne contient pas, une note de
livraison ou un numéro de table, en ajoutant des champs dans Settings → Collect → Fields. Chaque
champ a un type parmi text, textarea, select, checkbox, number, email et tel, un
libellé, un placeholder facultatif et un indicateur obligatoire. Les champs apparaissent sur la page
hébergée dans l'ordre où vous les disposez, et ce que le client saisit revient avec le paiement.
Deux éléments qui semblent personnalisables et ne le sont pas
L'objet theming accepté par POST /payments est enregistré sur le paiement et renvoyé lors des
lectures, mais la page hébergée ne le lit jamais : l'apparence vient du compte, pas de l'appel. Et
il n'existe aucun paramètre locale ou channels dans le corps de la requête, donc passer l'un ou
l'autre n'a aucun effet sur ce que voit le client.
Pages associées
- Démarrage rapide PaiementsLe même parcours de bout en bout, de la création au webhook vérifié.
- Intégration du checkout hébergéRedirection, iframe intégrée ou fenêtre superposée, avec le code de chacune.
- Image de marqueChaque réglage d'apparence et la façon dont il atteint la page.
- Moyens de paiement et canauxLes opérateurs proposés, pays par pays.
- Cycle de vie d'un paiementChaque état du paiement pendant que le client est sur la page.
- Tester la page de paiementDes numéros sandbox qui déclenchent chaque résultat à la demande.