NaabigaPay · PHP
QuickstartsDocs

DocsQuickstarts › PHP

Backend

Intégrer NaabigaPay en PHP

PHP vanilla, sans dépendance : cURL pour créer le lien, hash_hmac et hash_equals pour le webhook.

Deux scripts côté serveur : l'un crée un lien de paiement, l'autre vérifie la signature du webhook avant de marquer la commande payée. La clé secrète (sk_live_…) reste sur le serveur.

1.Créer le lien

Votre front appelle ce script, qui appelle POST/v1/payment-links avec la clé secrète et renvoie l'url de paiement.

PHP · creer-lien.php
<?php
// Appelé par VOTRE front, jamais par NaabigaPay.
$secret   = getenv('NPAY_SECRET'); // sk_live_... : reste sur le serveur
$commande = $_POST['commande'];
$amount   = (int) $_POST['amount'];

$ch = curl_init('https://api.pay.naabiga.com/api/v1/payment-links');
curl_setopt_array($ch, [
  CURLOPT_POST           => true,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER     => [
    'Authorization: Bearer ' . $secret,
    'Content-Type: application/json',
    'Idempotency-Key: cmd-' . $commande, // évite un double lien en cas de retry
  ],
  CURLOPT_POSTFIELDS => json_encode([
    'amount'      => $amount,     // entier, en FCFA
    'reference'   => $commande,   // votre numéro de commande
    'description' => 'Commande ' . $commande,
    'return_url'  => 'https://monsite.com/merci',
    'cancel_url'  => 'https://monsite.com/panier',
    'single_use'  => true,
  ]),
]);
$res  = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($code !== 201) { http_response_code(502); exit($res); }

$link = json_decode($res, true);
header('Content-Type: application/json');
echo json_encode(['url' => $link['url']]); // le front ouvre cette URL

La réponse contient url (ex. https://pay.naabiga.com/link/9f3c…) : la page où le client paie. Pour un montant libre, remplacez amount par amount_min, amount_max et une description.

2.Vérifier le webhook

NaabigaPay envoie POST à votre URL avec X-NPay-Event et X-NPay-Signature (HMAC-SHA256 du corps brut). Lisez le corps avec php://input, recalculez le HMAC et comparez avec hash_equals (temps constant).

PHP · webhook-naabiga.php
<?php
// URL enregistrée dans le portail marchand.
$secret = getenv('NPAY_WEBHOOK_SECRET');

$raw       = file_get_contents('php://input');        // corps BRUT, non modifié
$signature = $_SERVER['HTTP_X_NPAY_SIGNATURE'] ?? '';
$expected  = hash_hmac('sha256', $raw, $secret);

if (!hash_equals($expected, $signature)) {
  http_response_code(400);
  exit('signature invalide');
}

$payload = json_decode($raw, true);
if (($_SERVER['HTTP_X_NPAY_EVENT'] ?? '') === 'payment.succeeded') {
  // Créditez selon le montant de VOTRE commande, pas celui reçu.
  marquer_commande_payee($payload['reference']);
}
http_response_code(200);

Astuce. Ne lisez jamais $_POST pour un webhook : la signature porte sur le corps brut exact. Toute reconstruction casserait la vérification.

Référence rapide

MéthodeEndpointRôle
POST/v1/payment-linksCréer un lien de paiement
GET/v1/payments/{reference}Statut d'un paiement

Base : https://api.pay.naabiga.com/api/v1 · Auth : Authorization: Bearer sk_…. Voir la documentation complète et le format des webhooks.