Démarrage rapide des SDKs
Une clé, une commande d'installation, un appel et une page de paiement à ouvrir.
Obtenez une clé, installez un package et effectuez un appel : vous recevez une page de paiement Wajub à ouvrir, et un paiement que vous confirmez ensuite sur votre serveur.
1. Obtenir une clé
Les clés se trouvent dans le Dashboard, sous Paramètres, puis Développeurs, puis Clés API. 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 WAJUB_API_KEY dans l'environnement, et chaque SDK serveur lit
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 |
La version de l'API est fixée sur votre compte, pas dans le SDK
Mettre à jour un SDK ne change jamais la version de l'API que vous recevez : elle est fixée à la
création de votre compte. Pour essayer une autre version sur une requête, envoyez vous-même
l'en-tête X-Wajub-Version. Consultez Gestion des versions.
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
Vous recevez 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.
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
@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
Lisez le code de l'erreur dans $e->errorCode, avec $e->httpStatus, $e->errors et
$e->raw. getCode() ne le contient pas.
É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 une clé d'idempotence 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.