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 |
Une clé se compose d'un préfixe, d'un point, puis de 96 caractères. Les SDKs serveur utilisent la clé secrète.
Une clé secrète n'atteint jamais le navigateur
L'API bloque toute requête sk. provenant d'une Origin de navigateur 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é
Chaque SDK serveur lit automatiquement WAJUB_API_KEY et WAJUB_WEBHOOK_SECRET dans l'environnement.
Un fichier .env suffit donc généralement pour toute la configuration.
WAJUB_API_KEY=sk_test.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…
WAJUB_WEBHOOK_SECRET=whsec_test_4f8c2b91d7e6a0f35c1dB7nY4hC6dF9jNode.js constitue la seule exception. Il n'utilise pas de valeur de repli issue de l'environnement. Vous devez donc transmettre explicitement la clé, comme dans l'exemple 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 | 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.1.1 | Java 17 |
| C# | dotnet add package Wajub | .NET 8 |
Le package Python sur PyPI est actuellement vide
pip install wajub réussit, mais n'installe aucun module importable. Le manifeste du package ne
prend pas en compte la structure src/. Le wheel contient donc les métadonnées sans le module.
En attendant une version corrigée, utilisez le SDK Go,
PHP ou Node.js, ou appelez directement l'API avec httpx.
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 et part d'aléa. Node.js en effectue trois |
| 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 |
Deux é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. Go
écrit le sigle en majuscules, sa classe de connexion est donc APIConnectionError.
Node.js utilise des noms différents
Six des sept SDKs utilisent exactement le tableau ci-dessus. @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.
Ruby, Java et C#
Tous trois fonctionnent exactement comme les cinq exemples ci-dessus, avec les mêmes dix-huit ressources et la même structure d'appel. Leurs pages adaptent chaque exemple à leurs conventions.
Le reste du premier appel
Étape suivante
Pages associées
- WebhooksL'événement qui confirme réellement un paiement.
- Scénarios de testLes cartes et numéros qui produisent chaque résultat.
- Checkout hébergéInté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.