NaabigaPay · Python
QuickstartsDocs

DocsQuickstarts › Python

Backend

Intégrer NaabigaPay en Python

requests pour créer le lien, un webhook Flask qui vérifie la signature avec hmac.compare_digest.

Côté serveur : une route crée le lien de paiement, une autre vérifie la signature du webhook avant de créditer. La clé secrète (sk_live_…) reste sur le serveur, dans une variable d'environnement.

1.Créer le lien

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

Python · Flask
# pip install flask requests
import os
import requests
from flask import Flask, request, jsonify

app = Flask(__name__)
NPAY = "https://api.pay.naabiga.com/api/v1"
SECRET = os.environ["NPAY_SECRET"]  # sk_live_... : reste sur le serveur

# Votre front appelle CETTE route, jamais NaabigaPay directement.
@app.post("/api/pay")
def creer_lien():
    commande = request.json["commande"]
    r = requests.post(
        f"{NPAY}/payment-links",
        headers={
            "Authorization": f"Bearer {SECRET}",
            "Idempotency-Key": f"cmd-{commande}",  # évite un double lien si retry
        },
        json={
            "amount": int(request.json["amount"]),  # entier, en FCFA
            "reference": commande,                   # votre numero de commande
            "description": f"Commande {commande}",
            "return_url": "https://monsite.com/merci",
            "cancel_url": "https://monsite.com/panier",
            "single_use": True,
        },
        timeout=20,
    )
    if r.status_code != 201:
        return jsonify(error=r.text), 502
    return jsonify(url=r.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

Lisez le corps brut avec request.get_data(), recalculez le HMAC-SHA256 avec hmac.new(...).hexdigest() et comparez avec hmac.compare_digest (temps constant).

Python · webhook Flask
import hmac
import hashlib

WEBHOOK_SECRET = os.environ["NPAY_WEBHOOK_SECRET"].encode()

@app.post("/webhooks/naabiga")
def webhook():
    raw = request.get_data()  # corps BRUT (bytes), avant tout parsing
    signature = request.headers.get("X-NPay-Signature", "")
    expected = hmac.new(WEBHOOK_SECRET, raw, hashlib.sha256).hexdigest()

    if not hmac.compare_digest(expected, signature):
        return "signature invalide", 400

    if request.headers.get("X-NPay-Event") == "payment.succeeded":
        payload = request.get_json()
        # Créditez selon le montant de VOTRE commande, pas celui reçu.
        marquer_commande_payee(payload["reference"])

    return "", 200

Astuce. Appelez request.get_data() avant request.get_json() : le HMAC doit porter sur les octets exacts reçus, pas sur un JSON re-sérialisé.

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.