CheckoutOTP ajoute une couche de vérification par e-mail avant que le client n'atteigne le paiement WooCommerce. L'acheteur saisit son e-mail, reçoit un code à 6 chiffres et le confirme. Ce n'est qu'ensuite qu'il peut finaliser l'achat.
Cela vous permet de :
Bloquer les fausses commandes, le spam et les bots utilisant des e-mails inventés.
Garantir que l'e-mail de facturation est réel et appartient à l'acheteur.
Réduire les remboursements, les rétrofacturations (chargebacks) et la fraude.
Conserver une liste d'e-mails propre pour vos campagnes marketing.
Idée clé
La vérification est préalable au paiement : le plugin redirige le client vers une page de vérification et, une fois le code confirmé, le renvoie au paiement avec son e-mail fixé et verrouillé.
2. Exigences
Composant
Minimum
Testé sur
WordPress
7.1
7.1.2
WooCommerce
11.2
11.2.1
PHP
8.3
8.3
WooCommerce doit être actif. Sans lui, le plugin affiche un avis et sa logique n'est pas activée.
Un serveur capable d'envoyer des e-mails (idéalement avec un plugin SMTP configuré ; voir Dépannage).
3. Installation
Téléchargez le paquet checkoutotp.zip.
Dans WordPress, allez dans Extensions → Ajouter → Téléverser une extension.
Sélectionnez le fichier .zip, cliquez sur Installer maintenant, puis sur Activer.
À l'activation, le plugin crée automatiquement ses tables et ses réglages par défaut.
Recommandation
Après l'activation, allez dans WooCommerce → CheckoutOTP pour vérifier les réglages avant d'ouvrir votre boutique au public.
4. Configuration initiale
La vérification se produit sur une page de votre site contenant un shortcode. Une seule page suffit.
Étape 1 — Créer la page de vérification
Allez dans Pages → Ajouter.
Donnez-lui un titre, par exemple Order Verification ou Vérification de commande.
Dans le contenu, ajoutez ce shortcode :
[checkoutotp_form]
Publiez la page.
Remarque
Le plugin détecte automatiquement la page contenant le shortcode et y redirige les clients non vérifiés. Vous n'avez aucune URL à configurer.
N'utilisez qu'une seule page de vérification
S'il existe deux pages publiées ou plus avec le shortcode [checkoutotp_form], le plugin redirige toujours vers la plus récente (la dernière publiée ou mise à jour). Les autres afficheront toujours le formulaire si on les visite directement, mais ne seront jamais la cible de la redirection. Pour éviter toute confusion (par exemple, modifier une page qui n'est pas celle utilisée), gardez une seule page active avec le shortcode et laissez les autres en brouillon ou à la corbeille.
Étape 2 — Régler les valeurs de base
Dans WooCommerce → CheckoutOTP → Settings, vérifiez au minimum :
OTP Expiry Time : durée de validité du code en minutes (15 par défaut).
Admin Notification Recipients : e-mails qui recevront les alertes de sécurité.
Notify When User is Blocked et Notify on Multiple Failed Attempts : activez-les si vous souhaitez recevoir des alertes.
Étape 3 — Tester
Dans une fenêtre de navigation privée, ajoutez un produit au panier et allez au paiement.
Vous devriez être redirigé vers la page de vérification.
Saisissez votre e-mail, recevez le code et confirmez-le.
Une fois vérifié, vous revenez au paiement avec l'e-mail verrouillé et pouvez finaliser l'achat.
5. Fonctionnement
Le parcours du client
Le client ajoute des produits au panier et tente d'accéder au paiement.
Le plugin le redirige vers la page de vérification ([checkoutotp_form]).
Il saisit son e-mail et clique sur envoyer → il reçoit un code à 6 chiffres par e-mail.
Il saisit le code. S'il est correct, il est vérifié.
Il revient au paiement : son e-mail apparaît fixé et en lecture seule.
Il finalise l'achat.
Quand la vérification est mémorisée
Situation
Comportement
Premier paiement après l'installation du plugin (administrateurs, clients existants, comptes nouvellement créés)
Tout le monde se vérifie une fois, sans exception. Aucun contournement automatique pour les connectés ni pour les comptes anciens.
Client avec un compte, déjà vérifié une fois
Vérifié de façon permanente (métadonnée utilisateur). Lors des achats suivants, le code ne lui est plus demandé.
Client invité
Un cookie signé est enregistré (7 jours, ou 30 s'il coche « se souvenir de moi »). S'il revient dans ce délai, il reste vérifié.
Important
Le badge Verification dans « Mon compte → Commandes » (clients avec compte uniquement) indique si, lors de la création de cette commande, l'acheteur était vérifié. Un client déjà vérifié aura toutes ses commandes marquées « Verified » sans qu'on lui demande le code à chaque fois.
Mode d'urgence
Si l'envoi d'e-mails échoue, le Mode d'urgence désactive temporairement la vérification pour ne pas perdre de ventes. À n'utiliser que ponctuellement et à désactiver dès que possible.
6. Le panneau CheckoutOTP
Tout se gère depuis WooCommerce → CheckoutOTP. Le panneau comporte ces onglets :
Onglet
À quoi il sert
⚙️ Settings
Toutes les options de configuration (voir section 7).
Protection contre les bots et l'abus de l'API REST.
📜 History
Les 50 derniers événements de sécurité (envois, vérifications, échecs, blocages).
🚫 Blocked Emails
E-mails temporairement bloqués, avec un bouton pour les débloquer manuellement.
7. Options de configuration
General OTP Settings
Option
Par défaut
Ce qu'elle fait
OTP Expiry Time
15 min
Durée de validité du code (1–60).
Maximum Failed Attempts
5
Tentatives autorisées par code avant de l'invalider (3–20).
Email Block Threshold
10
Échecs accumulés par e-mail (entre les codes) avant blocage (3–50).
Email Block Duration
60 min
Durée pendant laquelle un e-mail reste bloqué (5–1440 min).
🚨 Emergency Mode
Non
Désactive temporairement la vérification (urgences).
🌐 Site Behind Proxy/CDN
Non
Activez si votre site est derrière Cloudflare ou un proxy/CDN, pour détecter l'IP réelle du visiteur.
Express Checkout Protection
Masque les boutons de paiement express (PayPal, Google Pay, Apple Pay, Stripe…) aux clients qui ne sont pas encore vérifiés, afin qu'ils ne puissent pas contourner la vérification.
Option
Par défaut
Ce qu'elle fait
🔒 Strict Mode
Non
Masque les boutons de paiement express à l'aide de motifs CSS génériques (plus agressif).
Custom CSS Selectors
—
Sélecteurs CSS supplémentaires de votre thème/plugins (un par ligne) pour masquer des boutons précis.
À garder en tête
Le masquage visuel est une barrière au mieux (elle peut être contournée en manipulant le HTML). La protection réelle contre le débit sans vérification sur PayPal est appliquée sur le serveur de votre WordPress : le plugin intercepte la requête de paiement express avant qu'elle ne soit envoyée à PayPal, de sorte qu'aucun débit n'est effectué. Le serveur de PayPal n'intervient pas.
Security Notifications
Option
Par défaut
Ce qu'elle fait
Admin Notification Recipients
—
E-mails qui reçoivent les alertes (vous pouvez en ajouter plusieurs).
Notify When User is Blocked
Non
Prévient lorsqu'un e-mail est bloqué après des échecs répétés.
Notify on Multiple Failed Attempts
Non
Prévient en cas de plusieurs tentatives échouées.
REST API Security
Option
Par défaut
Ce qu'elle fait
Maximum Orders Per Hour
5
Limite de commandes par heure par IP/e-mail (1–50).
Block Bot User-Agents
Non
Bloque les requêtes des bots connus par leur User-Agent.
Notify on API Abuse
Non
Prévient en cas d'abus de l'API REST.
Notify on Suspicious Orders
Non
Prévient lorsqu'une commande est signalée comme suspecte.
Configurable Block Lists
Option
Ce qu'elle fait
Custom Disposable Email Domains
Domaines d'e-mail temporaire supplémentaires à rejeter (un par ligne). Ils sont ajoutés à la liste intégrée de 32 domaines ; ils ne la remplacent pas.
Custom Suspicious User-Agents
Signatures de bots supplémentaires (une par ligne).
Custom Suspicious Names
Noms suspects (par ex. « test », « asdf ») qui déclenchent la détection.
Enable Regex Patterns
Traite les listes ci-dessus comme des expressions régulières (avancé).
Liste de domaines jetables intégrée
Le plugin rejette déjà, sans aucune configuration, ces 32 domaines d'e-mail temporaire :
tempmail.com, guerrillamail.com, 10minutemail.com, throwaway.email, mailinator.com, maildrop.cc, temp-mail.org, fakeinbox.com, trashmail.com, yopmail.com, getnada.com, mailnesia.com, sharklasers.com, guerrillamail.info, grr.la, guerrillamail.biz, spam4.me, mailcatch.com, emailondeck.com, mohmal.com, mintemail.com, mytrashmail.com, tempr.email, disposablemail.com, throwawaymail.com, spamgourmet.com, mailexpire.com, tempinbox.com, dispostable.com, getairmail.com, mailnator.com et tempail.com.
Le champ Custom Disposable Email Domains ajoute des domaines à cette liste, ne la remplace jamais.
Data Maintenance
Option
Par défaut
Ce qu'elle fait
Auto Purge Logs
Oui
Supprime automatiquement les anciens enregistrements.
Log Retention Period
30 jours
Nombre de jours de conservation des enregistrements (7–365).
À la désinstallation
Si vous supprimez le plugin depuis WordPress (et non un simple désactivation), il efface complètement ses données : réglages, tables, métadonnées utilisateur, cookies de session et tâches planifiées. Il ne laisse aucune trace dans la base de données.
Design & Colors
Personnalisez l'apparence du formulaire de vérification :
Header Background ColorHeader Text ColorButton Background ColorButton Text Color
8. E-mails et personnalisation
Le code OTP est envoyé comme un e-mail WooCommerce, il apparaît donc dans WooCommerce → Réglages → E-mails sous le nom CheckoutOTP. De là, vous pouvez modifier l'objet, l'en-tête et le pied de page, et même le désactiver.
Modèles d'e-mail
Le plugin inclut deux modèles :
templates/emails/checkoutotp-otp.php — version HTML.
templates/emails/plain/checkoutotp-otp.php — version texte brut.
Comment personnaliser sans perdre les modifications lors d'une mise à jour
Copiez le modèle dans le dossier de votre thème, en respectant le chemin WooCommerce :
(pour la version texte brut, votre-theme/woocommerce/emails/plain/checkoutotp-otp.php). WordPress utilisera votre copie à la place de celle du plugin.
9. Compatibilité
Paiement classique
Compatible avec le paiement par shortcode de WooCommerce.
WooCommerce Blocks
Compatible avec le paiement par blocs (Store API), y compris le verrouillage du champ e-mail.
HPOS
Compatible avec le stockage des commandes à hautes performances.
Paiements express
Protection de PayPal Express et des autres boutons express.
Sécurité
Le code OTP est stocké sous forme de hachage SHA-256 (jamais en texte clair) et comparé de manière sécurisée ; les cookies de vérification sont signés et sont HttpOnly/SameSite=Strict. L'e-mail vérifié n'est jamais imprimé dans le HTML des pages mises en cache.
Langues
Le plugin inclut des traductions en espagnol, portugais (Brésil) et français, ainsi que le modèle .pot pour le traduire dans n'importe quelle autre langue. La langue de base (code source) est l'anglais.
10. Dépannage
Les e-mails contenant le code n'arrivent pas
L'envoi repose sur wp_mail() de WordPress. Si votre serveur n'est pas correctement configuré, installez un plugin SMTP (WP Mail SMTP, Post SMTP, etc.) et testez-le.
Vérifiez le dossier spam du destinataire.
Assurez-vous que le modèle d'e-mail CheckoutOTP est actif dans WooCommerce → Réglages → E-mails.
En dernier recours, activez le Mode d'urgence pour ne pas bloquer les ventes pendant que vous réglez l'e-mail.
L'IP enregistrée n'est pas celle du client (site derrière Cloudflare)
Activez l'option 🌐 Site Behind Proxy/CDN. Uniquement si votre site est réellement derrière Cloudflare ou un proxy/CDN.
Le client voit toujours le paiement sans vérifier (cache)
Le plugin envoie des en-têtes « no-cache », mais certains plugins de cache les ignorent.
Excluez les pages de paiement et de vérification de votre cache.
Les boutons de paiement express ne sont pas masqués
Activez le Strict Mode.
S'ils apparaissent toujours, ajoutez leur sélecteur CSS dans Custom CSS Selectors.
Un client légitime a été bloqué
Allez dans l'onglet 🚫 Blocked Emails et cliquez sur Unblock sur sa ligne. Les blocages expirent également d'eux-mêmes selon la durée configurée.
La colonne « Verification » affiche « Not verified »
Cela signifie que cette commande a été créée sans vérification enregistrée (par exemple, une commande manuelle créée par l'administrateur, ou créée avant l'installation du plugin). C'est le comportement correct.
11. FAQ
Fonctionne-t-il avec le paiement par blocs ?
Oui. La vérification, le verrouillage de l'e-mail et la validation côté serveur fonctionnent à la fois sur le paiement classique et par blocs.
Puis-je utiliser un client invité (sans compte) ?
Oui. Les invités se vérifient de la même manière, à l'aide d'un cookie signé.
Le code est-il demandé au client à chaque achat ?
Non. Tout le monde (administrateurs, clients existants, comptes nouvellement créés) ne se vérifie qu'une seule fois lors de son prochain paiement. Ensuite, il est mémorisé (compte : de façon permanente ; invité : cookie de 7 ou 30 jours). Pour forcer une nouvelle vérification, pour un invité il suffit d'attendre l'expiration du cookie ; sur un compte, il faudrait supprimer la marque de vérification de l'utilisateur (avancé).
Puis-je changer la page de vérification ?
Oui, toute page contenant le shortcode [checkoutotp_form]. Le plugin la détecte automatiquement.
Que se passe-t-il si j'ai deux pages ou plus avec le shortcode ?
Le plugin redirige toujours vers la plus récente. Les autres affichent toujours le formulaire si on les visite directement, mais ne sont pas la cible de la redirection. Recommandation : utilisez une seule page active avec le shortcode et laissez les autres en brouillon ou à la corbeille.
Que se passe-t-il si un attaquant essaie de nombreux codes ?
Chaque code autorise un nombre limité de tentatives. De plus, le plugin compte les échecs par e-mail et bloque temporairement l'adresse dès que le seuil configuré est dépassé.
Le plugin ralentit-il la boutique ?
Non. Il n'agit que sur les pages de paiement et de vérification et n'ajoute aucune requête lourde au reste du site.
12. Journal des modifications
1.3.0
Le CSS masquant Express Checkout n'est désormais chargé que sur le paiement, le panier, le produit et la page de vérification.
Nouveau réglage : nombre maximal d'envois OTP par heure (limite configurable des demandes de code).
Les motifs regex personnalisés sont validés à l'enregistrement avec un avertissement clair ; les invalides sont écartés.
Suppression des méthodes et de la table héritées inutilisées (les OTP utilisent des transients).
Les erreurs du paiement par blocs renvoient désormais un 403 propre au lieu d'un 500 générique.
Les blocages de sécurité (discordance d'e-mail, express) figurent aussi dans l'onglet Historique.
Le mode d'urgence journalise l'activation et la désactivation lors du changement d'état.
1.2.2
Traductions incluses : espagnol, portugais (Brésil) et français, ainsi que le modèle .pot pour ajouter d'autres langues.
1.2.1
Suppression du code hérité inutilisé (une ancienne classe d'e-mail et un ancien vérificateur).
Documentation mise à jour selon l'état réel.
1.2.0
Blocage temporaire des e-mails après des échecs répétés, avec seuil et durée configurables.
Onglet « Blocked Emails » avec déblocage manuel.
Notifications d'administration avec l'adresse e-mail complète.
Colonne « Verification » avec l'état réel par commande (Verified / Not verified).
Verrouillage du champ e-mail également sur le paiement par blocs.
1.1.0
Correctifs de sécurité (IP réelle, cookies renforcés, protection PayPal, cache sans données personnelles).
1.0.0
Version initiale : vérification OTP avant paiement, blocage des bots, journaux et notifications.
13. Confidentialité et données
CheckoutOTP conserve ses données dans la base de données de votre propre WordPress, vous gardez donc le contrôle. Voici ce qu'il traite :
Adresse e-mail saisie par le client pour recevoir le code, et les e-mails temporairement bloqués après des échecs répétés (onglet Blocked Emails).
Adresse IP, utilisée pour les limites de fréquence et les contrôles de sécurité.
Code OTP, stocké uniquement sous forme de hash SHA-256 et valable seulement pendant la durée d'expiration configurée (15 minutes par défaut).
Statut de vérification : pour les clients inscrits, il est enregistré dans leurs métadonnées utilisateur ; pour les invités, dans un cookie signé (7 jours, ou 30 s'ils cochent « se souvenir de moi »).
Journal de sécurité (onglet Historique) : événements tels que envois, vérifications, échecs et blocages, pouvant inclure l'e-mail et l'adresse IP concernés.
Aucun tiers
CheckoutOTP n'envoie aucune donnée à des tiers ni à des services externes. L'e-mail contenant le code est envoyé par le système de messagerie de votre propre site (WordPress ou le service SMTP que vous avez configuré).
Conservation et suppression
Avec Auto Purge Logs activé, les anciens enregistrements sont supprimés automatiquement après la durée de conservation (30 jours par défaut, configurable de 7 à 365).
Les e-mails bloqués sont libérés d'eux-mêmes à la fin de la durée de blocage configurée, ou manuellement depuis l'onglet Blocked Emails.
Si vous supprimez le plugin depuis WordPress (et pas seulement le désactiver), toutes ses données sont effacées : réglages, tables, métadonnées utilisateur, cookies de session et tâches planifiées.
Recommandation
Indiquez dans la politique de confidentialité de votre boutique que vous vérifiez l'e-mail du client par un code à usage unique et qu'un cookie de vérification est utilisé. La nécessité d'un consentement pour ce cookie dépend de votre pays ; rapprochez-vous de votre conseiller juridique.
14. Assistance
Si vous avez des questions ou des problèmes, ouvrez un ticket dans notre centre d'assistance en indiquant la version du plugin, la version de WordPress/WooCommerce et une description du problème.