PS PrestaShop Intermédiaire

Espace Membre & Contenu Payant (dfmembership) — Guide complet

Installer, configurer et exploiter un espace membre et du contenu réservé payant : plans mappés sur les groupes clients, accès à durée limitée (cron) ou abonnement récurrent (Stripe), bibliothèque avec paywall et schéma SEO pour PrestaShop 8 et 9.

Mis à jour Version du module 1.0.0

Présentation

Le module Espace Membre & Contenu Payant (dfmembership) transforme votre boutique en plateforme d’adhésion : vous vendez des abonnements qui ouvrent l’accès à un espace membre et à du contenu réservé (articles, vidéos, fichiers, liens), à des prix de groupe, ou à des pages CMS privées. Chaque plan est relié à un groupe client natif de PrestaShop, ce qui laisse la boutique gérer nativement la visibilité catalogue et les prix par groupe ; le module ajoute par-dessus la facturation, le paywall, la bibliothèque, l’expiration automatique et la synchronisation des groupes.

Deux modèles économiques sont disponibles dès la première version, et se choisissent plan par plan : un accès à durée limitée (le client paie une fois pour N jours, l’accès expire automatiquement) et un abonnement récurrent réel via Stripe Billing (renouvellement et résiliation pilotés par webhooks).

Compatibilité

  • PrestaShop 8.0 à 9.x
  • PHP 7.4 à 8.3
  • Mono-boutique et multi-boutique
  • 5 langues : FR, EN, ES, DE, IT
  • Thème Classic et thèmes personnalisés
  • Aucune dépendance : pas de Composer, pas de SDK Stripe embarqué (appels API en cURL natif)

Concepts clés

Plan = groupe client

Un plan représente une formule d’adhésion (par exemple « Premium » ou « Pro annuel »). Chaque plan est mappé à un groupe client PrestaShop : quand un client devient membre, il est ajouté à ce groupe ; quand son abonnement expire ou est résilié, il en est retiré. Vous bénéficiez ainsi de toute la mécanique native de PrestaShop : prix spécifiques par groupe, restrictions de transporteurs, visibilité de catégories, etc. — sans configuration supplémentaire dans le module.

Créez d’abord vos groupes clients dans Clients > Groupes, puis associez-les à vos plans. Un même groupe peut servir de socle à vos prix de groupe et à la réservation de contenu.

Les deux modes de facturation

  • Durée limitée : le client paie une fois et obtient l’accès pour la durée du plan (en jours). Une tâche cron expire les accès arrivés à terme. Idéal pour un pass ponctuel, un accès saisonnier ou un contenu à durée déterminée. En cas de renouvellement anticipé, le temps restant se cumule.
  • Abonnement Stripe : un véritable abonnement récurrent géré par Stripe Billing. Le renouvellement, l’échec de paiement et la résiliation sont reçus par webhooks et reflétés automatiquement sur l’accès du client. Idéal pour un revenu récurrent (MRR).

Installation

  1. Dans le back-office, ouvrez Modules > Gestionnaire de modules.
  2. Cliquez sur Installer un module puis sélectionnez le fichier dfmembership.zip.
  3. Une fois installé, cliquez sur Configurer.

À l’installation, le module crée ses tables (plans, abonnements, contenus), enregistre ses hooks, génère un jeton cron aléatoire et ajoute un menu Membership dans Vendre, avec trois sous-onglets : Plans, Abonnements et Contenu. Un lien Mon adhésion apparaît dans l’espace client.

Configuration générale

La page de configuration du module regroupe les réglages globaux ainsi que les deux URL d’intégration (webhook Stripe et cron) à reporter dans vos outils externes.

Réglages Stripe

  • Clé secrète Stripe : votre clé sk_live_… (ou sk_test_… en test). Requise pour la facturation récurrente.
  • Clé publiable Stripe : votre clé pk_….
  • Secret de signature des webhooks : la valeur whsec_… fournie par Stripe pour le point de terminaison. Elle sert à vérifier la signature de chaque webhook entrant.

Contenu et paywall

  • Pages CMS protégées : la liste des identifiants de pages CMS réservées aux membres, séparés par des virgules (par exemple 4,7,9). Les non-membres qui tentent d’y accéder sont redirigés vers la bibliothèque.
  • Schéma SEO du paywall : injecte des données structurées isAccessibleForFree à false sur le contenu réservé, afin qu’il reste indexable par Google sans être considéré comme du cloaking.
  • Longueur du teaser (mots) : nombre de mots affichés avant le paywall lorsqu’aucun teaser explicite n’est saisi sur un contenu.
  • Régénérer le jeton cron : remplace le jeton de l’URL cron (utile s’il a fuité).

La clé secrète et le secret de webhook sont sensibles. Utilisez les clés de test tant que vous validez le parcours, puis basculez sur les clés live en production. Ne partagez jamais l’URL cron avec son jeton publiquement.

Créer un plan

Dans Membership > Plans, ajoutez une formule et renseignez :

  • Nom, accroche, description (multilingues) : affichés sur la page d’abonnement et le bloc d’accueil.
  • Mode de facturation : « Accès à durée limitée (cron) » ou « Abonnement récurrent (Stripe) ».
  • Prix : le montant affiché au client.
  • Durée (jours) : durée de l’accès en mode durée limitée.
  • Essai (jours) : période d’essai éventuelle (0 = aucun). En mode Stripe, l’essai est transmis à l’abonnement Stripe.
  • Stripe Price ID : l’identifiant price_… du tarif récurrent créé dans Stripe (mode Stripe uniquement).
  • Groupe client associé : le groupe dans lequel le membre est placé tant que son accès est actif.
  • Position et Actif : ordre d’affichage et disponibilité du plan.

Mode durée limitée et cron

En mode durée, l’abonnement est créé puis activé pour la durée du plan ; sa date de fin est calculée à partir de la date d’activation. Les plans gratuits (prix nul) sont activés immédiatement, et un plan avec essai ouvre d’abord une fenêtre d’essai.

Pour fermer automatiquement les accès arrivés à terme, programmez l’URL cron affichée dans la configuration (protégée par un jeton). Une exécution quotidienne suffit :

curl "https://votre-boutique/index.php?fc=module&module=dfmembership&controller=cron&token=VOTRE_JETON"

Le cron passe en statut « expiré » tout abonnement durée dont la date de fin est dépassée, puis resynchronise les groupes du client concerné. Sans cron, les accès n’expirent pas tout seuls : pensez à le planifier.

Mode abonnement Stripe

En mode Stripe, le client est redirigé vers une page de paiement Stripe Checkout en mode abonnement. À la fin du paiement, Stripe notifie votre boutique par webhook et l’accès est activé. Le cycle de vie complet est ensuite piloté par Stripe.

Mise en place

  1. Dans Stripe, créez un produit et un tarif récurrent (mensuel, annuel…), puis copiez son price_… dans le plan correspondant.
  2. Renseignez vos clés Stripe et le secret de webhook dans la configuration du module.
  3. Dans Stripe, ajoutez un point de terminaison webhook pointant vers l’URL affichée dans la configuration, et abonnez-le aux événements : checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.updated et customer.subscription.deleted.

Que font les webhooks ?

  • checkout.session.completed : active l’abonnement et enregistre l’identifiant d’abonnement Stripe.
  • invoice.paid : renouvelle l’accès et reporte la date de fin de période.
  • invoice.payment_failed : laisse l’accès pendant la période de relance (dunning) gérée par Stripe.
  • customer.subscription.updated : reflète une résiliation programmée en fin de période ou un changement de date.
  • customer.subscription.deleted : clôt définitivement l’accès et retire le client de son groupe.

Chaque webhook est vérifié par signature à l’aide du secret whsec_…. Si la signature est invalide ou si le secret n’est pas renseigné, la requête est rejetée. Vérifiez ce réglage en premier si les abonnements ne s’activent pas.

Bibliothèque de contenu et paywall

Dans Membership > Contenu, créez les éléments réservés. Chaque contenu possède :

  • Type : article, vidéo, fichier ou lien.
  • Titre, teaser, contenu (multilingues). Le teaser est l’aperçu public affiché avant le paywall ; laissé vide, il est généré automatiquement à partir des premiers mots du contenu (longueur réglable).
  • URL média : l’intégration vidéo, le fichier à télécharger ou le lien externe.
  • Plan requis : le plan donnant accès au contenu. La valeur « Tout membre actif » ouvre le contenu à n’importe quel abonnement en cours.
  • Délai de drip (jours) : nombre de jours après le début de l’abonnement avant que le contenu ne se débloque, pour diffuser progressivement une bibliothèque (drip content).

Côté boutique, la bibliothèque liste les contenus avec leur teaser. Un membre voit le contenu complet ; un visiteur ou un non-membre voit le teaser puis un paywall l’invitant à s’abonner. Le contrôle d’accès combine le plan requis et le délai de drip.

Référencement du contenu réservé

Lorsque l’option de schéma SEO est activée, le module ajoute sur le contenu débloqué des données structurées indiquant qu’il s’agit de contenu payant (échantillonnage flexible de Google). Le bloc réservé est marqué par une classe CSS dédiée, ce qui permet à Google d’indexer la page sans pénaliser la différence entre ce que voient le robot et le membre.

Pages CMS réservées

Pour réserver des pages CMS existantes (page de ressources, espace privé…), indiquez leurs identifiants dans Pages CMS protégées. Un non-membre qui ouvre l’une de ces pages est automatiquement redirigé vers la bibliothèque, où il peut découvrir les formules. Les membres y accèdent normalement.

Espace membre

Depuis Mon compte > Mon adhésion, le client retrouve ses abonnements en cours : plan, statut, mode de facturation, date de renouvellement ou de fin. Il peut ouvrir la bibliothèque et, le cas échéant, résilier un abonnement. La résiliation se fait en fin de période : l’accès reste ouvert jusqu’au terme déjà payé, puis se ferme. En mode Stripe, la demande est transmise à Stripe ; en mode durée, l’accès n’est tout simplement pas reconduit.

Gérer les abonnements (back-office)

Dans Membership > Abonnements, vous visualisez tous les abonnements (client, e-mail, plan, statut, mode, dates) avec recherche et export. La vue détaillée permet de forcer un statut (actif, expiré, résilié) en cas de besoin : un geste commercial, une régularisation, un litige. Tout changement de statut resynchronise immédiatement le groupe du client.

Les groupes sont également resynchronisés à la connexion du client et à la validation d’une commande, pour garantir que l’accès reflète toujours les abonnements réellement actifs.

Aller plus loin

L’architecture de facturation est extensible : un nouveau fournisseur (par exemple PayPal récurrent) s’ajoute en implémentant l’interface BillingManagerInterface du dossier src/Billing/ et en l’enregistrant dans la fabrique BillingManagerFactory, sans toucher au reste du module. Parmi les évolutions envisageables : teasers générés par IA, e-mails de relance, abonnements cadeaux, changement de formule avec prorata, ou tableau de bord MRR / taux de résiliation.

FAQ et dépannage

Un client a payé mais n’a pas accès

En mode Stripe, vérifiez d’abord le secret de webhook et que le point de terminaison reçoit bien les événements dans le tableau de bord Stripe (onglet Webhooks). L’activation dépend de l’événement checkout.session.completed. En mode durée, vérifiez que l’abonnement est bien passé en statut actif ; vous pouvez le forcer depuis la vue détaillée.

Les accès n’expirent jamais

Le mode durée repose sur le cron. Assurez-vous d’avoir programmé l’URL cron (quotidienne) avec le bon jeton. Vous pouvez l’appeler manuellement pour tester : la réponse JSON indique le nombre d’abonnements expirés.

Comment relier le plan à des prix réduits ?

Associez le plan à un groupe client, puis définissez des prix spécifiques pour ce groupe dans vos fiches produits (ou via une règle de prix catalogue). Tant que le membre est actif, il appartient au groupe et bénéficie de ces prix automatiquement.

Le contenu réservé est-il indexable par Google ?

Oui, si l’option de schéma SEO est activée : le contenu payant est signalé comme tel via des données structurées, ce qui correspond aux recommandations de Google sur l’échantillonnage flexible. Vous gardez l’indexation sans masquer la nature payante.

Puis-je proposer un essai gratuit ?

Oui. Renseignez un nombre de jours d’essai sur le plan. En mode durée, une fenêtre d’essai est ouverte ; en mode Stripe, l’essai est transmis à l’abonnement Stripe (trial_period_days).

PayPal est-il géré ?

La version 1 implémente les modes durée et Stripe. PayPal récurrent peut être ajouté grâce à l’interface de facturation extensible, sans refonte du module.

Est-ce compatible PrestaShop 9 ?

Oui. Le module est compatible PrestaShop 8 et 9, en multi-boutique et multilingue (FR, EN, ES, DE, IT).

Cette page vous a-t-elle été utile ?

Toujours bloqué ? Contactez le support