Aller au contenu

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éfixeEmplacementPossibilités
sk_test.Votre serveur, sandboxTout faire avec de l'argent de test
sk.Votre serveur, liveTout faire avec de l'argent réel
pk_test. / pk.Le navigateurLire une session, rien d'autre
rk_test. / rk.Un script ou une tâche CIUniquement 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.

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.

.env
WAJUB_API_KEY=sk_test.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…
WAJUB_WEBHOOK_SECRET=whsec_test_4f8c2b91d7e6a0f35c1dB7nY4hC6dF9j

Node.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à.

LangageInstallationVersion minimale
Node.jsnpm install @wajub/nodeNode.js 18
Pythonpip install wajubPython 3.10
PHPcomposer require wajub/wajub-phpPHP 8.4
Gogo get github.com/wajubhq/wajub-goGo 1.22
Rubygem install wajubRuby 3.1
Javacom.wajub:wajub-java:1.1.1Java 17
C#dotnet add package Wajub.NET 8

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"
  }'

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.

Les champs importants
{
"id": "trx_test_8kQ2mW9vB4nL6hR1cY3d",
"reference": "order-4172",
"amount": 25000,
"currency": "XAF",
"status": "pending",
"authorization_url": "https://pay.wajub.com/tok_xxxxx",
"authorization_token": "tok_xxxxx",
"sandbox": true
}
ChampUtilisation
authorization_urlEnvoyez-y le client ou ouvrez-la vous-même pour tester
authorization_tokenLe jeton de session si vous intégrez le checkout au lieu de rediriger
idVotre identifiant du paiement pour retrieve et les remboursements. trx_test_ dans la sandbox, trx_ en live
referenceVotre référence, renvoyée dans l'objet et chaque webhook
statuspending à 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.

ComportementDétail
IdempotenceUne Idempotency-Key est générée pour chaque POST et PUT. Une répétition ne provoque jamais un double débit
Nouvelles tentativesDeux 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 aveugleUn POST est répété uniquement parce qu'il contient une clé d'idempotence
Délais d'expiration30 secondes par requête par défaut
ErreursUne exception typée par catégorie d'échec, pas un code de statut à tester
Paginationlist() 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.

HTTPClasseSignification
401AuthenticationErrorMauvaise clé ou clé live utilisée avec des données de sandbox
403PermissionErrorClé valide, mais scope manquant
404NotFoundErrorPaiement, client ou compte inexistant
400, 422InvalidRequestErrorRequête mal formée. errors identifie le champ
429RateLimitErrorTrop de requêtes. retry_after indique l'attente
autreWajubErrorClasse de base à intercepter pour couvrir tous les cas
aucunApiConnectionErrorRé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.

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;
}

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.

Étape suivante

Que pensez-vous de ce contenu ?