# Installation du générateur TIH sur OVH Performance

Version 0.3.0 du 23 septembre 2026. Préparée et vérifiée localement avec PHP 8.3. Aucun compte OVH ou Stripe n’a été connecté. Aucun paiement réel n’est activé.

## La prochaine étape

Installer une version de test à une adresse dédiée, proposée ici comme `https://attestations.creizic.com`. Cette adresse n’a pas encore été créée. Le site WordPress peut poursuivre sa refonte en parallèle.

Le générateur est une petite application PHP autonome. Il n’exige ni extension WordPress, ni WooCommerce, ni compte client. Son formulaire est identique à celui validé. Stripe ouvre sa page de paiement dans un autre onglet, puis le générateur confirme le paiement et produit le PDF côté serveur.

La présentation commerciale, les conditions de vente et la notice complète sur les données seront préparées avant la vente au public. Elles ne sont pas incluses dans cette étape.

## Contenu du dossier

| Élément | Rôle |
| --- | --- |
| `public/` | fichiers servis à l’adresse du générateur |
| `prive/` | programme, bibliothèques, polices et configuration confidentielle |
| `prive/config.example.php` | modèle à copier en `config.php`, puis à renseigner directement sur l’hébergement |
| `prive/check.php` | diagnostic en ligne de commande, sans affichage de clés |
| `prive/export-billing.php` | export volontaire des coordonnées et montants de facturation |
| `exemples/` | deux PDF fictifs pour contrôler la mise en page, à ne pas transférer sur le site |

L’archive installable contient les bibliothèques nécessaires. Il n’est pas nécessaire d’installer Composer ou Node.js sur OVH. Conserver les fichiers `.htaccess` lors du transfert.

## Installer les fichiers

Prévoir PHP 8.2 ou plus récent, en 64 bits, avec `curl`, `mbstring`, `intl` et `pdo_sqlite`. La bibliothèque SQLite doit prendre en charge `RETURNING` (version 3.35 ou plus récente). Ces éléments restent à vérifier sur l’hébergement précis. Ne pas modifier la version PHP globale du WordPress sans contrôler ses propres compatibilités.

Dans l’espace FTP de l’hébergement, créer un dossier `tih`, à côté du dossier du site WordPress. Placer dedans `public` et `prive`. Le dossier `prive` doit être hors de toutes les racines web configurées dans OVH ; son `.htaccess` ajoute une seconde protection.

Dans OVH, ouvrir l’hébergement, puis l’onglet **Multisite**. Ajouter le sous-domaine choisi et lui affecter **uniquement** le dossier racine `tih/public`. Ne pas remplacer le dossier racine de `creizic.com`. Activer HTTPS sur cette nouvelle adresse. Ne pas activer de cache CDN sur les routes de l’application.

Le service utilise des chemins partant de la racine (`/api/...`). Il est prévu pour un sous-domaine dédié, pas pour un sous-dossier de WordPress. La page publique WordPress pourra ensuite ouvrir ce générateur avec un lien ; une intégration dans la page pourra être étudiée séparément.

Si un accès SSH est disponible, lancer depuis le dossier `prive`, avec la bonne version PHP :

```sh
php check.php
```

Cette commande n’affiche aucun secret. La configuration peut rester signalée comme incomplète jusqu’au raccordement Stripe.

## Raccorder Stripe en mode test

Copier `prive/config.example.php` en `prive/config.php`. Garder ce fichier uniquement dans le dossier privé et limiter ses droits au compte d’hébergement. Les identifiants ne doivent jamais être saisis dans le formulaire, Elementor ou une conversation.

Renseigner les paramètres suivants :

- `mode` reste `stripe_test` ;
- `origin` correspond exactement à l’adresse HTTPS du générateur, sans sous-chemin ;
- `stripe_key` reçoit la clé secrète de l’environnement de test, commençant par `sk_test_` ;
- `webhook_secret` reçoit le secret du point de notification de test, commençant par `whsec_` ;
- `binding_key` reçoit une chaîne aléatoire stable, différente des clés Stripe ;
- `live_enabled` reste `false`.

Pour générer la clé de liaison en SSH, à copier uniquement dans le fichier privé :

```sh
php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'
```

Conserver cette clé et la base technique ensemble pour que les reprises de téléchargement restent possibles. Changer la clé après les paiements invaliderait les empreintes existantes.

Dans l’environnement de test Stripe, créer une destination de notifications à l’adresse `https://adresse-du-generateur/api/stripe/webhook`, avec les événements suivants :

- `checkout.session.completed` ;
- `checkout.session.async_payment_succeeded` ;
- `charge.refunded`.

Le secret de cette destination va dans `webhook_secret`. Le formulaire vérifie aussi directement la session auprès de Stripe ; un retour dans le navigateur ne suffit jamais à autoriser le PDF. Une notification reçue plusieurs fois ne crée ni nouveau paiement ni facture.

Ne pas créer de lien de paiement permanent ou de produit manuellement pour ce générateur. Le code construit chaque session Checkout avec le prix centralisé. La création automatique de factures Stripe est désactivée. Les réglages de reçu de paiement du compte Stripe restent distincts.

## Prix

Deux valeurs de `prive/config.php` suffisent :

```php
'price_net_cents' => 250,
'vat_rate_bps' => 2000,
```

Le montant est alors de 2,50 € HT, 0,50 € de TVA et 3 € TTC. Un changement s’applique aux nouvelles demandes. Une commande déjà créée conserve son tarif. Si l’hébergement met les scripts PHP en cache, tenir compte de son délai de rafraîchissement après modification.

Cette version vise les achats professionnels en France métropolitaine, avec une TVA française fixe. Elle ne calcule pas les règles fiscales internationales. Si une personne change son pays dans Checkout, cette situation doit être repérée avant facturation et traitée ; l’ouverture commerciale hors du périmètre annoncé nécessite une adaptation.

## Vérification sur OVH

Faire le parcours sur l’adresse de test avec des informations fictives :

- remplir et vérifier l’attestation ;
- ouvrir Stripe et contrôler le prix, la TVA, l’identité, l’adresse, le SIRET et le courriel ;
- utiliser les moyens de paiement fictifs proposés dans la documentation de test Stripe ;
- vérifier un paiement réussi, un refus et une authentification bancaire ;
- vérifier que le PDF arrive uniquement après confirmation et porte la mention de démonstration ;
- simuler un remboursement dans l’environnement de test, puis contrôler que le téléchargement est bloqué ;
- vérifier dans Stripe que les coordonnées nécessaires à la facture sont récupérables ;
- contrôler les notifications Stripe, la transmission de l’en-tête d’autorisation par OVH et l’inaccessibilité du dossier privé.

Les essais locaux ne remplacent pas cette vérification du raccordement réel. Une page de test publiée sans lien public peut tout de même être découverte : ne l’utiliser qu’avec des données fictives, garder `stripe_test` et demander la non-indexation via le serveur.

## Facturation dans macompta.fr

Les coordonnées sont collectées dans Stripe en réutilisant celles du formulaire. Le SIREN est dérivé du SIRET. Frédérique établit ensuite la facture dans macompta.fr. Aucune connexion à ce logiciel n’est requise pour démarrer.

Un export privé facultatif est disponible, en ligne de commande depuis `prive` :

```sh
php export-billing.php facturation-2026-09.csv
```

Le fichier est créé dans `prive/exports`, jamais dans le dossier public. Il contient les paiements confirmés, l’identité, le SIREN/SIRET, l’adresse, le courriel, le numéro de TVA si fourni, la date, les montants, le taux et les identifiants Stripe. Il s’agit de données pour préparer les factures, pas d’un import macompta.fr garanti ni d’une facture électronique. Les remboursements sont exclus et restent à traiter séparément dans la comptabilité.

L’export est cumulatif : utiliser l’identifiant de transaction pour éviter les doublons. Choisir un autre nom à chaque export. Protéger ou supprimer volontairement les fichiers exportés selon le processus de facturation.

## Données conservées

Le contenu de l’attestation et le PDF ne sont pas archivés par l’application. Avant paiement, le serveur reçoit les coordonnées de facturation et une empreinte. Après paiement, il reçoit le formulaire complet, produit le PDF en mémoire et le renvoie. Les bibliothèques peuvent conserver des métriques des polices fixes ; elles ne contiennent pas les textes des utilisateurs.

La base `prive/data/orders.sqlite` conserve les références de paiement, les montants du service, les dates, le statut, le nombre de téléchargements, le condensat du code d’accès et l’empreinte protégée du document. Les coordonnées de facturation sont dans Stripe, puis dans les exports volontaires et macompta.fr. Des compteurs globaux par minute limitent les abus sans enregistrer d’IP ni d’identité ; les fenêtres expirées sont purgées à la requête suivante.

L’application n’écrit pas les corps des requêtes, les clés ou les PDF dans les journaux. Les journaux techniques de l’hébergeur restent à examiner, notamment pour les adresses IP. Ne pas activer d’enregistrement de session utilisateur ou de capture des requêtes. Le choix d’hébergement et sa configuration doivent respecter cette séparation.

Le fichier de reprise conserve une référence privée, pas le document. En cas de fermeture du formulaire, l’utilisateur doit ressaisir exactement la même attestation pour retrouver son téléchargement. En cas de difficulté, prévoir une assistance ou un remboursement, sans l’inciter à payer deux fois.

## Passage en réel, ultérieurement

Le code exige simultanément un mode réel, une clé réelle, `live_enabled` à `true`, et les URL HTTPS des conditions du service et des informations sur les données. Ces paramètres sont volontairement absents de cette livraison. Les règles de conservation, d’assistance et de remboursement doivent être finalisées avant le lancement public.

Le formulaire conserve ses aides d’accessibilité. Le PDF contient du texte sélectionnable et Luciole incorporée ; il n’est pas balisé PDF/UA. Les essais automatiques du formulaire ne constituent pas un audit RGAA complet.

## Références et licences

- OVH, configuration multisite : https://docs.ovhcloud.com/fr/guides/web-cloud/web-hosting/multisites-configure-multisite ;
- OVH, environnement PHP : https://docs.ovhcloud.com/fr/guides/web-cloud/web-hosting/configure-your-web-hosting ;
- Stripe, notifications : https://docs.stripe.com/webhooks ;
- Stripe, tests : https://docs.stripe.com/testing ;
- bibliothèque officielle Stripe PHP : https://github.com/stripe/stripe-php, licence MIT incluse dans `prive/vendor/stripe/stripe-php/LICENSE` ;
- tFPDF 1.33 : https://www.fpdf.org/en/script/script92.php, licence LGPL 2.1, sources et licence redistribuées ;
- Luciole : licence et crédits dans `prive/assets/LUCIOLE-LICENCE.txt`.
