Docs › Quickstarts › PHP
BackendInté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
// 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 URLLa 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
// 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éthode | Endpoint | Rôle |
|---|---|---|
| POST | /v1/payment-links | Cré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.