NaabigaPay · Laravel
QuickstartsDocs

DocsQuickstarts › Laravel

Backend

Inté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.

Laravel · PaiementController
<?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.

Laravel · routes/web.php
<?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é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.