
Paystack
Paystack - Initialize et Verify
Initialise une transaction Paystack en sous-unités, vérifie par référence et valide x-paystack-signature en SHA512.
Même prompt, avec et sans ce contexte
Les passages barrés sont ceux que l'IA a inventés. Basculez pour voir la sortie avec le contexte.
› Initialise un paiement Paystack de 5 000 NGN.
1const res = await fetch("https://api.paystack.co/charge/initialize", {Mauvais endpoint2 method: "POST",3 headers: { Authorization: "Bearer " + key },4 body: JSON.stringify({ email, amount: 5000 }),50 NGN au lieu de 5 0005});Authentification
- Header
Authorization: Bearer <PAYSTACK_SECRET_KEY>. - La clé publique sert uniquement côté navigateur (Popup / Inline).
Endpoints
POST https://api.paystack.co/transaction/initialize- Requis :
email,amount(entier, en sous-unité : kobo, pesewas, centimes). - Optionnel :
currency,reference,callback_url,metadata,channels. - Réponse :
data.authorization_url,data.access_code,data.reference.
- Requis :
GET https://api.paystack.co/transaction/verify/:reference:data.statusvautsuccess,failedouabandoned.
Erreurs
- Toutes les réponses contiennent
status(booléen) etmessage. 400champ invalide,401clé invalide,404référence inconnue.
Webhooks
- Header
x-paystack-signature: HMAC-SHA512 du corps brut avec la clé secrète. - Événement principal :
charge.success. - Répondre
200immédiatement.
Idempotence et limites
referenceunique par transaction : la générer côté serveur.- Toujours appeler
verifyavant de livrer, même après un webhook.
Pièges courants
Ce que les LLMs inventent le plus souvent pour Paystack.
amount: 5000signifie 50 NGN, pas 5000 NGN : multiplier par 100.- La signature est en SHA512, pas SHA256.
- Il n'y a pas d'endpoint
/charge/initializepour ce flux : c'est/transaction/initialize.
Exemple minimal
1type PaystackInit = { status: boolean; data: { authorization_url: string; reference: string } };2 3export async function initPaystack(email: string, amountMajor: number): Promise<PaystackInit["data"]> {4 const res = await fetch("https://api.paystack.co/transaction/initialize", {5 method: "POST",6 headers: { Authorization: "Bearer " + process.env.PAYSTACK_SECRET_KEY, "Content-Type": "application/json" },7 body: JSON.stringify({ email, amount: Math.round(amountMajor * 100), reference: crypto.randomUUID() }),8 });9 const json = (await res.json()) as PaystackInit;10 if (!json.status) throw new Error("Paystack init failed");11 return json.data;12}Variables d'environnement
PAYSTACK_SECRET_KEYPAYSTACK_PUBLIC_KEY