Docs › Quickstarts › Python
BackendInté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.
# 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 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
Lisez le corps brut avec request.get_data(), recalculez le HMAC-SHA256 avec hmac.new(...).hexdigest() et comparez avec hmac.compare_digest (temps constant).
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 "", 200Astuce. 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é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.