Démarrage rapide
Ce guide couvre l’intégration minimale serveur à serveur : créer une Payment Session, présenter le paiement à votre client, recevoir la décision par webhook. Comptez une quinzaine de minutes.
| Ce qu’il vous faut | Où l’obtenir |
|---|---|
| Un compte marchand avec e-mail vérifié et profil complété | dashboard.kadryza.app |
Une clé API de test kadryza_test_… | Dashboard → Clés API |
| Une URL publique pour recevoir les webhooks | Votre serveur |
Kadryza propose deux intégrations qui partagent le même moteur de paiement : la Payment Session (vous choisissez l’opérateur et affichez le numéro de paiement dans votre interface) et le Hosted Checkout (votre client choisit son opérateur sur une page Kadryza). Ce guide utilise la Payment Session.
Créer une Payment Session
Depuis votre serveur, jamais depuis le navigateur :
cURL
curl -X POST https://api.kadryza.app/v1/payment-sessions \
-H "X-API-Key: $KADRYZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reference": "order_2026_001",
"amount": 5000,
"currency": "XAF",
"operator": "AIRTEL",
"customer_phone": "+23566000000",
"ttl_minutes": 15
}'{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"reference": "order_2026_001",
"ticket": "KDRZ-8F3K2",
"amount": 5000,
"currency": "XAF",
"operator": "AIRTEL",
"status": "AWAITING_PAYMENT",
"environment": "test",
"assigned_collection_number": "074000001",
"expires_at": "2026-06-05T12:45:00Z",
"created_at": "2026-06-05T12:30:00Z",
"instructions": "Envoyez 5000 XAF vers le numéro 074000001 (AIRTEL), puis conservez la référence KDRZ-8F3K2. La session expire si le paiement n'est pas reçu à temps.",
"checkout_url": "https://checkout.kadryza.com/pay/payment-sessions/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}reference est votre identifiant de commande : réutiliser la même référence
dans le même environnement renvoie 409 DUPLICATE_REFERENCE (retrouvez la
session avec GET /v1/payment-sessions/by-reference).
Présenter le paiement
Deux options, au choix :
- Votre interface : affichez
amount,operator,assigned_collection_number(le numéro vers lequel le client envoie l’argent),ticketet un compte à rebours jusqu’àexpires_at; - La page hébergée : redirigez vers
checkout_url. Elle suit le paiement en temps réel. Acceptez que son domaine soitcheckout.kadryza.comoucheckout.kadryza.app.
Enregistrer votre endpoint webhook
curl -X POST https://api.kadryza.app/v1/webhooks \
-H "X-API-Key: $KADRYZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://merchant.example.com/webhooks/kadryza" }'La réponse contient secret (64 caractères hexadécimaux), affiché une seule
fois. Stockez-le côté serveur. L’URL doit résoudre vers une adresse publique ;
HTTPS est obligatoire pour les livraisons live. Vérifiez la connectivité avec
POST /v1/webhooks/:id/test.
Recevoir et vérifier les webhooks
Chaque livraison est signée : X-Kadryza-Signature: sha256=<hmac_hex>,
HMAC-SHA256 du corps brut avec votre secret. Répondez 2xx rapidement et
traitez en arrière-plan.
import { verifyWebhookSignature, parseKadryzaWebhookPayload, getWebhookIdempotencyKey } from '@kadryza/sdk'
const valid = verifyWebhookSignature({
payload: rawBody, // corps brut, non re-sérialisé
signature: req.headers['x-kadryza-signature'],
secret: process.env.KADRYZA_WEBHOOK_SECRET!
})
if (!valid) return res.status(401).end()
const event = parseKadryzaWebhookPayload(rawBody)
const key = getWebhookIdempotencyKey(event) // event_id pour les Payment Sessions| Événement | Ce que vous faites |
|---|---|
payment_session.succeeded | Valider la commande |
payment_session.under_review | Garder la commande en attente : le paiement est en vérification, jamais confirmé automatiquement |
payment_session.expired | Session test expirée sans paiement : annuler ou proposer un nouveau paiement |
Détails : Webhooks, Vérifier les webhooks.
Suivre sans webhook (complément)
GET /v1/payment-sessions/:id renvoie l’état courant. Limitez-vous à une
requête toutes les 5 secondes pendant AWAITING_PAYMENT, et arrêtez dès que
le statut change.
Passer en production
Suivez la checklist go-live, puis remplacez la clé de test par
votre clé kadryza_live_…, côté serveur uniquement.
Tester votre intégration
Une Payment Session test n’aboutit pas toute seule : elle n’est confirmée
que si un crédit est effectivement observé sur un numéro de test. Sans
paiement, elle passe en EXPIRED (15 minutes de grâce après expires_at) et
vous recevez payment_session.expired. Il n’existe pas de numéro magique pour
les sessions.
Pour éprouver votre chaîne de webhooks sans paiement, utilisez
POST /v1/webhooks/:id/test : il envoie un événement transaction.test signé,
avec l’en-tête X-Kadryza-Test: true.
L’API Transactions historique Test uniquement
simule aussi des issues en sandbox (succès, échec, expiration) selon le numéro
de téléphone : pratique pour tester vos traitements transaction.*, mais elle
n’est pas disponible en live.