Aller au contenu
AfriContext

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.

Vérifié sur la doc officielle • Vérifié sur la doc officielle • 09.10.26API v1

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", {2  method: "POST",3  headers: { Authorization: "Bearer " + key },4  body: JSON.stringify({ email, amount: 5000 }),5});
Montant facturé : 50 NGN2 inventions de l'IAModèle testé : GPT-4o, CursorDocumentation source

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.
  • GET https://api.paystack.co/transaction/verify/:reference : data.status vaut success, failed ou abandoned.

Erreurs

  • Toutes les réponses contiennent status (booléen) et message.
  • 400 champ invalide, 401 clé invalide, 404 ré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 200 immédiatement.

Idempotence et limites

  • reference unique par transaction : la générer côté serveur.
  • Toujours appeler verify avant de livrer, même après un webhook.

Pièges courants

Ce que les LLMs inventent le plus souvent pour Paystack.

  • amount: 5000 signifie 50 NGN, pas 5000 NGN : multiplier par 100.
  • La signature est en SHA512, pas SHA256.
  • Il n'y a pas d'endpoint /charge/initialize pour 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_KEY
  • PAYSTACK_PUBLIC_KEY