# Vente en ligne & téléchargement — mise en place

## Ce qui a été ajouté

- `src/StripeClient.php` — petit client Stripe en PHP pur (aucun SDK externe), même esprit que `SmtpMailer.php`. Gère la création/récupération de Checkout Session et la vérification de signature webhook.
- `src/DownloadToken.php` — génère et vérifie des liens de téléchargement signés (HMAC) et temporaires (24h par défaut), sans base de données.
- `public/create-checkout-session.php` — reçoit le POST du bouton "Buy Now", crée une session Stripe Checkout et redirige le navigateur vers la page de paiement hébergée par Stripe.
- `public/success.php` — page de retour après paiement. Revérifie le statut du paiement **directement auprès de Stripe** (jamais fait confiance à l'URL seule) avant de générer un lien de téléchargement.
- `public/download.php` — endpoint protégé qui ne sert le fichier produit que si le token signé est valide et non expiré.
- `public/webhook.php` — filet de sécurité : enregistre les paiements confirmés côté serveur (`storage/purchases.log`), même si l'acheteur ferme l'onglet avant d'arriver sur `success.php`.
- `.env.example` — nouvelles variables à configurer (voir ci-dessous).
- `public/index.php` — le tier "Starter / Campus" est devenu un achat immédiat à prix fixe avec bouton "Buy Now & Download". Les tiers "Institutional" et "Enterprise" restent en devis sur mesure via le formulaire de contact existant.

## Pourquoi cette architecture

- **Stripe Checkout** (page hébergée par Stripe) plutôt qu'un formulaire de carte custom : aucune donnée de carte ne transite par le serveur SysVote, ce qui simplifie énormément la conformité PCI-DSS.
- **Vérification côté serveur avant de livrer le fichier** : `success.php` ne fait jamais confiance à un simple paramètre d'URL — il interroge l'API Stripe pour confirmer `payment_status = paid` avant d'émettre un lien de téléchargement.
- **Fichier produit hors du webroot** : `PRODUCT_FILE_PATH` doit pointer vers un chemin en dehors de `public/`, sinon n'importe qui pourrait le télécharger directement sans payer, en devinant l'URL.
- **Pas de dépendance externe** (pas de `stripe-php`) : cohérent avec le choix déjà fait pour `SmtpMailer.php`, un simple appel cURL vers l'API REST de Stripe suffit pour ce besoin.

## Étapes de mise en place

1. **Créer un compte Stripe** (ou utiliser le compte existant de l'organisation) sur https://dashboard.stripe.com.
2. **Créer un Produit + un Price** dans Dashboard > Product catalog, ex. "SysVote — Starter/Campus License" à $499, paiement unique (pas d'abonnement). Copier l'ID du Price (`price_...`).
3. **Récupérer les clés API** dans Dashboard > Developers > API keys (clé secrète `sk_...` et publique `pk_...`). Utiliser les clés `test` tant que le paiement n'est pas testé en conditions réelles.
4. **Copier `.env.example` en `.env`** à la racine du projet et remplir :
   - `APP_URL` (domaine réel du site)
   - `STRIPE_SECRET_KEY`, `STRIPE_PUBLISHABLE_KEY`
   - `STRIPE_PRICE_STARTER_LICENSE` (l'ID du Price créé à l'étape 2)
   - `DOWNLOAD_SECRET` (générer avec `openssl rand -hex 32`)
   - `PRODUCT_FILE_PATH` (chemin absolu vers le zip du produit, placé dans un dossier `storage/` à la racine du projet — **pas** dans `public/`)
5. **Placer le fichier produit** (le zip livrable de SysVote) au chemin indiqué par `PRODUCT_FILE_PATH`.
6. **Configurer le webhook** dans Dashboard > Developers > Webhooks : endpoint `https://votre-domaine.com/webhook.php`, événement `checkout.session.completed`. Copier le "Signing secret" affiché dans `STRIPE_WEBHOOK_SECRET`.
7. **Tester en mode test** : utiliser une carte de test Stripe (ex. `4242 4242 4242 4242`, n'importe quelle date future, n'importe quel CVC) depuis la page tarifs. Vérifier que :
   - le paiement redirige vers `success.php` avec un lien de téléchargement actif,
   - `storage/purchases.log` contient bien une ligne pour cet achat,
   - le téléchargement fonctionne, puis échoue si on réutilise le lien après 24h ou avec un token modifié.
8. **Basculer en mode live** une fois les tests validés : remplacer les clés `sk_test_...`/`pk_test_...` par les clés `sk_live_...`/`pk_live_...`, et recréer le webhook en mode live (les clés et webhooks test/live sont totalement séparés chez Stripe).

## Limites actuelles / prochaines étapes possibles

- Pas d'envoi d'email automatique du lien de téléchargement (webhook.php le journalise seulement). Une fois la vraie signature de `SmtpMailer::send()` confirmée, on peut brancher l'envoi d'un email de confirmation avec le lien, en backup du téléchargement immédiat sur `success.php`.
- Un seul produit/plan est branché (`starter-license`). Pour vendre plusieurs SKUs, ajouter une entrée dans le tableau `$catalog` de `create-checkout-session.php` et le Price Stripe correspondant.
- Pas de taxes automatiques (`automatic_tax` désactivé) — à activer dans Stripe si nécessaire selon la juridiction.
