Configuration du Webhook Stripe
🎯 Objectif
Configurer le webhook Stripe pour confirmer automatiquement les paiements et mettre à jour le statut des commandes dans votre base de données.
📋 Prérequis
- Supabase CLI installé :
npm install -g supabase - Projet Supabase initialisé :
supabase init - Connecté à Supabase :
supabase login - Clés Stripe configurées dans
stripe_config.dart
🚀 Déploiement du Webhook
Étape 1 : Déployer la Fonction
# Utiliser le script de déploiement
./deploy_webhook_improved.sh
# Ou manuellement
supabase functions deploy stripe-webhook
Étape 2 : Récupérer l'URL du Webhook
# Lister les fonctions déployées
supabase functions list
# L'URL sera quelque chose comme :
# https://[votre-projet-id].supabase.co/functions/v1/stripe-webhook
🔧 Configuration dans Stripe
Étape 1 : Accéder aux Webhooks
- Allez sur dashboard.stripe.com
- Cliquez sur "Developers" dans le menu
- Cliquez sur "Webhooks"
- Cliquez sur "Add endpoint"
Étape 2 : Configurer l'Endpoint
- URL du webhook :
https://[votre-projet-id].supabase.co/functions/v1/stripe-webhook - Description : "Kazalendar - Confirmation des paiements"
- Événements à écouter :
- ✅
checkout.session.completed - ✅
payment_intent.succeeded
- ✅
Étape 3 : Récupérer la Clé Secrète
- Après avoir créé le webhook, cliquez dessus
- Copiez la "Signing secret" (commence par
whsec_...) - Gardez cette clé précieusement !
🔐 Configuration des Variables d'Environnement
Étape 1 : Ajouter les Variables dans Supabase
# Ajouter la clé secrète du webhook
supabase secrets set STRIPE_WEBHOOK_SECRET=whsec_...
# Ajouter l'URL de votre projet Supabase
supabase secrets set SUPABASE_URL=https://[votre-projet-id].supabase.co
# Ajouter la clé de service Supabase
supabase secrets set SUPABASE_SERVICE_ROLE_KEY=eyJ...
Étape 2 : Vérifier les Variables
# Lister les secrets configurés
supabase secrets list
🧪 Test du Webhook
Étape 1 : Tester avec Stripe CLI (Recommandé)
# Installer Stripe CLI
# macOS
brew install stripe/stripe-cli/stripe
# Se connecter
stripe login
# Écouter les webhooks en local
stripe listen --forward-to https://[votre-projet-id].supabase.co/functions/v1/stripe-webhook
Étape 2 : Tester avec l'Application
- Créez une commande avec un prix
- Passez au statut "Payée"
- Sélectionnez "Carte bancaire"
- Cliquez sur "Créer et partager"
- Utilisez la carte de test :
4242 4242 4242 4242
Étape 3 : Vérifier les Logs
# Voir les logs de la fonction
supabase functions logs stripe-webhook
# Vous devriez voir :
# Processing checkout.session.completed: cs_test_...
# Payment confirmed successfully for session: cs_test_...
# Commande updated: [commande-id]
🔍 Vérification du Fonctionnement
Dans l'Application
- La commande devrait passer automatiquement au statut "Payée"
- Le champ
payment_confirmeddevrait êtretrue - La date de paiement devrait être mise à jour
Dans la Base de Données
-- Vérifier les liens de paiement
SELECT * FROM payment_links WHERE is_paid = true;
-- Vérifier les commandes payées
SELECT * FROM commandes WHERE payment_confirmed = true;
🚨 Dépannage
Problème : Webhook non reçu
Vérifications :
- L'URL du webhook est correcte
- Les événements sont bien sélectionnés
- Le webhook est actif dans Stripe
Solution :
# Vérifier les logs
supabase functions logs stripe-webhook
# Redéployer si nécessaire
supabase functions deploy stripe-webhook
Problème : Erreur 404 - Payment link not found
Cause : Le lien de paiement n'existe pas en base
Solution :
- Vérifier que le lien est bien créé avant le paiement
- Vérifier que l'ID de session correspond
Problème : Erreur 500 - Database error
Cause : Problème de permissions ou de structure de base
Solution :
- Vérifier les RLS policies
- Vérifier que la clé de service a les bonnes permissions
- Vérifier la structure des tables
📊 Événements Gérés
checkout.session.completed
- Déclencheur : Session de paiement terminée avec succès
- Action : Met à jour le statut de la commande
- Champs mis à jour :
payment_links.is_paid = truepayment_links.paid_at = now()commandes.status = 'paid'commandes.payment_confirmed = true
payment_intent.succeeded (Fallback)
- Déclencheur : Paiement confirmé (fallback)
- Action : Même traitement que checkout.session.completed
🔒 Sécurité
Vérification de la Signature (Production)
Pour la production, ajoutez la vérification de signature :
// Dans index.ts
import { createHmac } from 'https://deno.land/std@0.168.0/crypto/mod.ts'
const webhookSecret = Deno.env.get('STRIPE_WEBHOOK_SECRET')
const signature = req.headers.get('stripe-signature')
// Vérifier la signature
const expectedSignature = createHmac('sha256', webhookSecret)
.update(body)
.digest('hex')
if (signature !== expectedSignature) {
return new Response('Invalid signature', { status: 400 })
}
📈 Monitoring
Logs Supabase
# Voir les logs en temps réel
supabase functions logs stripe-webhook --follow
# Voir les logs d'une période spécifique
supabase functions logs stripe-webhook --since 1h
Dashboard Stripe
- Allez sur "Webhooks" dans Stripe
- Cliquez sur votre webhook
- Vérifiez les "Recent deliveries"
- Regardez les codes de statut (200 = succès)
✅ Checklist de Configuration
- Fonction webhook déployée
- URL du webhook récupérée
- Webhook configuré dans Stripe
- Événements sélectionnés
- Clé secrète récupérée
- Variables d'environnement configurées
- Test avec carte de test réussi
- Vérification des logs
- Commande mise à jour automatiquement
Une fois toutes ces étapes terminées, votre système de paiement sera entièrement automatisé ! 🎉