Docs › Quickstarts › Laravel
BackendIntégrer NaabigaPay en Laravel
Le client HTTP de Laravel pour créer le lien, une route webhook signée pour confirmer le paiement.
Placez la clé secrète dans config/services.php (jamais en dur). Un contrôleur crée le lien de paiement ; une route vérifie la signature du webhook avant de marquer la commande payée.
1.Créer le lien
Votre front appelle cette route, qui appelle POST/v1/payment-links via Http::withToken() et renvoie l'url de paiement.
<?php
// app/Http/Controllers/PaiementController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class PaiementController
{
// Route appelée par VOTRE front (POST /api/pay).
public function creerLien(Request $request)
{
$commande = $request->input('commande');
$res = Http::withToken(config('services.naabiga.secret')) // sk_live_...
->withHeaders(['Idempotency-Key' => 'cmd-' . $commande])
->acceptJson()
->post('https://api.pay.naabiga.com/api/v1/payment-links', [
'amount' => (int) $request->input('amount'), // FCFA
'reference' => $commande, // votre commande
'description' => 'Commande ' . $commande,
'return_url' => url('/merci'),
'cancel_url' => url('/panier'),
'single_use' => true,
]);
abort_unless($res->created(), 502, $res->body());
return response()->json(['url' => $res->json('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
Récupérez le corps brut avec $request->getContent(), recalculez le HMAC-SHA256 avec le secret du webhook, comparez avec hash_equals. Excluez ce chemin de la protection CSRF.
<?php
// Pensez à ajouter '/webhooks/naabiga' dans VerifyCsrfToken::$except.
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::post('/webhooks/naabiga', function (Request $request) {
$secret = config('services.naabiga.webhook_secret');
$raw = $request->getContent(); // corps BRUT
$signature = $request->header('X-NPay-Signature', '');
$expected = hash_hmac('sha256', $raw, $secret);
abort_unless(hash_equals($expected, $signature), 400, 'signature invalide');
if ($request->header('X-NPay-Event') === 'payment.succeeded') {
$reference = $request->json('reference');
// Créditez selon le montant de VOTRE commande, pas celui reçu.
Commande::where('reference', $reference)->update(['statut' => 'paye']);
}
return response()->noContent();
});Astuce. N'utilisez pas $request->all() ni le JSON déjà décodé pour vérifier la signature : elle porte sur le corps brut exact reçu.
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.