Démarrage rapide des SDKs
Une clé, une commande d'installation, un appel et une page de paiement à ouvrir.
Le parcours le plus court vers un paiement fonctionnel compte quatre étapes. Créez une clé dans le Dashboard, placez-la dans une variable d'environnement, installez un package et effectuez un appel. Vous recevez une URL qui ouvre une véritable page de paiement Wajub.
Tout le reste de cette section repose sur cet appel.
1. Obtenir une clé
Les clés se trouvent dans le Dashboard, sous Settings, puis Developer, puis API keys. Chaque compte possède deux jeux de clés dès le premier jour. Leur préfixe permet de les distinguer.
| Préfixe | Emplacement | Possibilités |
|---|---|---|
sk_test. | Votre serveur, sandbox | Tout faire avec de l'argent de test |
sk. | Votre serveur, live | Tout faire avec de l'argent réel |
pk_test. / pk. | Le navigateur | Lire une session, rien d'autre |
rk_test. / rk. | Un script ou une tâche CI | Uniquement les scopes accordés |
Les SDKs serveur utilisent la clé secrète.
Une clé secrète n'atteint jamais le navigateur
Une clé secrète ne doit jamais être utilisée depuis un navigateur. Quand Wajub en détecte une, l'API la refuse et envoie un e-mail au propriétaire de la clé. Si une clé a déjà figuré dans du code client, renouvelez-la. Le navigateur reçoit plutôt un jeton de session, présenté dans Sessions et sécurité.
2. Enregistrer la clé
Python, Ruby, Go, Java et C# lisent automatiquement WAJUB_API_KEY dans l'environnement, et chaque
SDK serveur se rabat sur WAJUB_WEBHOOK_SECRET. Un fichier .env suffit donc généralement pour
toute la configuration.
WAJUB_API_KEY=sk_test.xxxxxxxxxxxxxxxx…
WAJUB_WEBHOOK_SECRET=whsec_test_xxxxxxxxxxxxxxxxNode.js et PHP sont les exceptions pour la clé : ils ne lisent pas WAJUB_API_KEY. Vous devez donc
transmettre explicitement la clé, comme dans les exemples ci-dessous.
3. Installer
Un package par langage, depuis le registre que vous utilisez déjà.
| Langage | Installation | Version minimale |
|---|---|---|
| Node.js | npm install @wajub/node | Node.js 18 |
| Python | pip install "wajub>=1.2.1" | Python 3.10 |
| PHP | composer require wajub/wajub-php | PHP 8.4 |
| Go | go get github.com/wajubhq/wajub-go | Go 1.22 |
| Ruby | gem install wajub | Ruby 3.1 |
| Java | com.wajub:wajub-java:1.2.1 | Java 17 |
| C# | dotnet add package Wajub | .NET 8 |
Python : installez la 1.2.1 ou une version ultérieure
wajub 1.1.0 et 1.1.1 n'installent aucun module importable : le wheel a été publié sans le
module. La 1.2.1 est la première version qui le contient. La ligne ci-dessus la demande donc
explicitement.
4. Créer un paiement
Voici l'appel : un montant, une devise, un moyen de contacter le client et une URL de retour.
curl https://api.wajub.com/payments \
-H "Authorization: $WAJUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 25000,
"currency": "XAF",
"email": "amina@example.com",
"description": "Order 4172",
"reference": "order-4172",
"callback": "https://shop.example.com/complete"
}'Le montant utilise l'unité principale, pas les centimes
25000 en XAF représente vingt-cinq mille francs, pas deux cent cinquante. Wajub utilise partout
l'unité ordinaire de la devise. Une devise décimale s'écrit donc avec ses décimales :
"amount": 12.50 en GHS. Tous les plafonds suivent la même règle. En XAF, ils vont de 25 à 2 000 000.
Seuls amount et currency sont réellement obligatoires. Vous devez aussi identifier le payeur
avec l'un des trois champs email, phone ou customer_id. callback permet le fonctionnement
du flux de redirection. reference est votre propre numéro de commande, renvoyé dans chaque webhook.
5. Lire la réponse
Les SDKs aplatissent l'enveloppe de l'API. Vous recevez donc un seul objet qui réunit les champs de la transaction et les deux champs d'autorisation.
| Champ | Utilisation |
|---|---|
authorization_url | Envoyez-y le client ou ouvrez-la vous-même pour tester |
authorization_token | Le jeton de session si vous intégrez le checkout au lieu de rediriger |
id | Votre identifiant du paiement pour retrieve et les remboursements. trx_test_ dans la sandbox, trx_ en live |
reference | Votre référence, renvoyée dans l'objet et chaque webhook |
status | pending à la création. Ce statut n'est pas définitif |
Ouvrez maintenant authorization_url dans un navigateur. Cette page correspond au checkout et
contient déjà l'image de marque de votre compte. La sandbox accepte les
cartes et numéros de test.
6. Confirmer côté serveur
La redirection ramène le client vers votre URL de callback avec un paramètre status. Utilisez-le
pour choisir la page à afficher, jamais pour livrer les biens.
curl https://api.wajub.com/payments/trx_test_8kQ2mW9vB4nL6hR1cY3d \
-H "Authorization: $WAJUB_API_KEY"Le navigateur n'est pas une source fiable. Un client peut fermer l'onglet après un paiement réussi. Une confirmation Mobile Money peut arriver plusieurs minutes après la redirection. La livraison du webhook est garantie. Livrez donc la commande à sa réception et utilisez cet appel comme repli.
Ce que le SDK fait pour vous
Les sept SDKs offrent le même comportement. C'est la raison d'utiliser un package plutôt qu'un appel HTTP brut.
| Comportement | Détail |
|---|---|
| Idempotence | Une Idempotency-Key est générée pour chaque POST et PUT. Une répétition ne provoque jamais un double débit |
| Nouvelles tentatives | Deux nouvelles tentatives automatiques sur 429 et 5xx, avec attente exponentielle. Node.js en effectue trois. Node.js, Python, PHP et Go y ajoutent une part d'aléa, pas Ruby, Java ni C# |
| Jamais de répétition aveugle | Un POST est répété uniquement parce qu'il contient une clé d'idempotence |
| Délais d'expiration | 30 secondes par requête par défaut |
| Erreurs | Une exception typée par catégorie d'échec, pas un code de statut à tester |
| Pagination | list() renvoie une page que vous pouvez parcourir et récupère la suivante pour vous |
La version de l'API est fixée sur votre compte, pas dans le SDK
Aucun SDK n'envoie d'en-tête X-Wajub-Version. La version est fixée à la création de votre compte.
Les nouveaux comptes reçoivent la version actuelle. Vous pouvez la remplacer pour une requête en
envoyant vous-même cet en-tête. Consultez Gestion des versions.
En cas d'échec de l'appel
Chaque SDK génère une erreur typée au lieu de renvoyer un statut. La classe détermine l'action à prendre : réessayer, corriger la requête ou informer le payeur.
| HTTP | Classe | Signification |
|---|---|---|
| 401 | AuthenticationError | Mauvaise clé ou clé live utilisée avec des données de sandbox |
| 403 | PermissionError | Clé valide, mais scope manquant |
| 404 | NotFoundError | Paiement, client ou compte inexistant |
| 400, 422 | InvalidRequestError | Requête mal formée. errors identifie le champ |
| 429 | RateLimitError | Trop de requêtes. retry_after indique l'attente |
| autre | WajubError | Classe de base à intercepter pour couvrir tous les cas |
| aucun | ApiConnectionError | Réseau ou délai d'expiration, aucune réponse reçue |
Trois écritures diffèrent de cette liste. PHP ajoute le suffixe Exception à ses sous-classes. La
ligne ci-dessus devient donc InvalidRequestException, tandis que la base reste WajubError. Java
ajoute Exception à toutes ses classes, la base comprise : WajubException,
InvalidRequestException, ApiConnectionException, toutes non vérifiées. Go écrit le sigle en
majuscules, sa classe de connexion est donc APIConnectionError.
Node.js utilise des noms différents
Les six autres suivent le tableau ci-dessus, avec les écritures décrites plus haut. @wajub/node préfixe chaque classe
par Wajub, intègre 403 à WajubAuthenticationError et 404 à WajubInvalidRequestError, puis
ajoute WajubPaymentError pour 402 et WajubApiError comme classe générale. Sa classe de connexion
est WajubConnectionError. Interceptez WajubError pour toutes les couvrir.
Quelle que soit la classe, quatre champs sont toujours présents : le message, un code, le statut
HTTP et une map errors indexée par nom de champ. Affichez cette dernière dans votre formulaire.
import { WajubError, WajubInvalidRequestError, WajubRateLimitError } from '@wajub/node';
try {
await wajub.payments.create({ amount, currency: 'XAF', email });
} catch (error) {
if (error instanceof WajubInvalidRequestError) {
return res.status(422).json({ fields: error.errors });
}
if (error instanceof WajubRateLimitError) {
return res.status(503).set('Retry-After', String(error.retryAfter ?? 5)).end();
}
if (error instanceof WajubError) {
logger.error({ code: error.code, status: error.httpStatus });
}
throw error;
}En PHP, le code se trouve dans errorCode, pas getCode
Wajub\Exception\WajubError transmet uniquement le message à Exception. getCode() renvoie donc
0 pour chaque échec Wajub. La véritable valeur se trouve dans la propriété en lecture seule
$e->errorCode, avec $e->httpStatus, $e->errors et $e->raw.
Étape suivante
Pages associées
- Démarrage rapide, de bout en boutPayer en sandbox, vérifier côté serveur et recevoir le webhook.
- WebhooksL'événement qui confirme réellement un paiement.
- Scénarios de testLes cartes et numéros qui produisent chaque résultat.
- Afficher le checkoutIntégrez la page au lieu d'effectuer une redirection.
- Choisir une intégrationRedirection, intégration ou formulaire personnalisé. Découvrez quoi choisir et pourquoi.
- IdempotenceCe que protège la clé générée et ce qu'elle ne protège pas.
- Choisir votre SDKLes versions minimales des environnements d'exécution et les contraintes qui excluent une option.