Área de Miembros y Contenido de Pago (dfmembership) — Guía completa
Instalar, configurar y explotar un área de miembros y contenido reservado de pago: planes asignados a grupos de clientes, acceso de duración limitada (cron) o suscripción recurrente (Stripe), biblioteca con muro de pago y esquema SEO para PrestaShop 8 y 9.
Presentación
El módulo Área de Miembros y Contenido de Pago (dfmembership) convierte tu tienda en una plataforma de membresía: vendes suscripciones que abren el acceso a un área de miembros y a contenido reservado (artículos, vídeos, archivos, enlaces), a precios de grupo o a páginas CMS privadas. Cada plan está vinculado a un grupo de clientes nativo de PrestaShop, de modo que la tienda gestiona de forma nativa la visibilidad del catálogo y los precios por grupo; el módulo añade encima la facturación, el muro de pago, la biblioteca, la expiración automática y la sincronización de grupos.
Hay dos modelos de negocio disponibles desde la primera versión, y se eligen plan por plan: un acceso de duración limitada (el cliente paga una vez por N días y el acceso expira automáticamente) y una suscripción recurrente real mediante Stripe Billing (renovación y cancelación gestionadas por webhooks).
Compatibilidad
- PrestaShop 8.0 a 9.x
- PHP 7.4 a 8.3
- Monotienda y multitienda
- 5 idiomas: FR, EN, ES, DE, IT
- Tema Classic y temas personalizados
- Sin dependencias: ni Composer ni SDK de Stripe embebido (llamadas a la API por cURL nativo)
Conceptos clave
Un plan equivale a un grupo de clientes
Un plan representa una fórmula de membresía (por ejemplo «Premium» o «Pro anual»). Cada plan está asignado a un grupo de clientes de PrestaShop: cuando un cliente se hace miembro, se añade a ese grupo; cuando su suscripción expira o se cancela, se le retira de él. Así heredas toda la mecánica nativa de PrestaShop: precios específicos por grupo, restricciones de transportistas, visibilidad de categorías, etc., sin configuración adicional en el módulo.
Crea primero tus grupos de clientes en Clientes > Grupos y luego asígnalos a tus planes. Un mismo grupo puede servir de base para tus precios de grupo y para la reserva de contenido.
Los dos modos de facturación
- Duración limitada: el cliente paga una vez y obtiene acceso durante la duración del plan (en días). Una tarea cron expira los accesos vencidos. Ideal para un pase puntual, un acceso de temporada o contenido por tiempo limitado. En caso de renovación anticipada, el tiempo restante se acumula.
- Suscripción Stripe: una verdadera suscripción recurrente gestionada por Stripe Billing. La renovación, el fallo de pago y la cancelación se reciben por webhooks y se reflejan automáticamente en el acceso del cliente. Ideal para ingresos recurrentes (MRR).
Instalación
- En el back-office, abre Módulos > Gestor de módulos.
- Haz clic en Subir un módulo y selecciona el archivo
dfmembership.zip. - Una vez instalado, haz clic en Configurar.
Durante la instalación, el módulo crea sus tablas (planes, suscripciones, contenidos), registra sus hooks, genera un token cron aleatorio y añade un menú Membership en Vender, con tres subpestañas: Planes, Suscripciones y Contenido. Aparece un enlace Mi membresía en el área del cliente.
Configuración general
La página de configuración del módulo reúne los ajustes globales y las dos URL de integración (webhook de Stripe y cron) que debes copiar en tus herramientas externas.
Ajustes de Stripe
- Clave secreta de Stripe: tu clave
sk_live_…(osk_test_…en modo prueba). Necesaria para la facturación recurrente. - Clave publicable de Stripe: tu clave
pk_…. - Secreto de firma de los webhooks: el valor
whsec_…que Stripe facilita para el endpoint. Sirve para verificar la firma de cada webhook entrante.
Contenido y muro de pago
- Páginas CMS protegidas: la lista de identificadores de páginas CMS reservadas a los miembros, separados por comas (por ejemplo
4,7,9). Los no miembros que intenten acceder son redirigidos a la biblioteca. - Esquema SEO del muro de pago: inyecta datos estructurados con
isAccessibleForFreeen false sobre el contenido reservado, para que siga siendo indexable por Google sin considerarse cloaking. - Longitud del teaser (palabras): número de palabras mostradas antes del muro de pago cuando no se ha indicado un teaser explícito en un contenido.
- Regenerar el token cron: sustituye el token de la URL cron (útil si se ha filtrado).
La clave secreta y el secreto del webhook son sensibles. Usa las claves de prueba mientras validas el flujo y cambia a las claves live en producción. Nunca compartas públicamente la URL cron con su token.
Crear un plan
En Membership > Planes, añade una fórmula y rellena:
- Nombre, eslogan, descripción (multilingües): se muestran en la página de suscripción y en el bloque de inicio.
- Modo de facturación: «Acceso de duración limitada (cron)» o «Suscripción recurrente (Stripe)».
- Precio: el importe mostrado al cliente.
- Duración (días): la duración del acceso en modo duración limitada.
- Prueba (días): un periodo de prueba opcional (0 = ninguno). En modo Stripe, la prueba se transmite a la suscripción de Stripe.
- Stripe Price ID: el identificador
price_…del precio recurrente creado en Stripe (solo modo Stripe). - Grupo de clientes asociado: el grupo en el que se coloca al miembro mientras su acceso está activo.
- Posición y Activo: orden de visualización y disponibilidad del plan.
Modo de duración limitada y cron
En modo duración, la suscripción se crea y luego se activa durante la duración del plan; su fecha de fin se calcula a partir de la fecha de activación. Los planes gratuitos (precio cero) se activan de inmediato, y un plan con prueba abre primero una ventana de prueba.
Para cerrar automáticamente los accesos vencidos, programa la URL cron mostrada en la configuración (protegida por un token). Una ejecución diaria es suficiente:
curl "https://tu-tienda/index.php?fc=module&module=dfmembership&controller=cron&token=TU_TOKEN"
El cron pone en estado «expirado» toda suscripción de duración cuya fecha de fin haya pasado y luego resincroniza los grupos del cliente afectado. Sin el cron, los accesos no expiran solos: recuerda programarlo.
Modo suscripción Stripe
En modo Stripe, el cliente es redirigido a una página de pago Stripe Checkout en modo suscripción. Al finalizar el pago, Stripe notifica a tu tienda por webhook y se activa el acceso. Después, todo el ciclo de vida lo gestiona Stripe.
Puesta en marcha
- En Stripe, crea un producto y un precio recurrente (mensual, anual…) y copia su
price_…en el plan correspondiente. - Rellena tus claves de Stripe y el secreto del webhook en la configuración del módulo.
- En Stripe, añade un endpoint de webhook que apunte a la URL mostrada en la configuración y suscríbelo a los eventos:
checkout.session.completed,invoice.paid,invoice.payment_failed,customer.subscription.updatedycustomer.subscription.deleted.
Qué hacen los webhooks
- checkout.session.completed: activa la suscripción y guarda el identificador de suscripción de Stripe.
- invoice.paid: renueva el acceso y avanza la fecha de fin de periodo.
- invoice.payment_failed: mantiene el acceso durante el periodo de reclamación (dunning) gestionado por Stripe.
- customer.subscription.updated: refleja una cancelación programada al final del periodo o un cambio de fecha.
- customer.subscription.deleted: cierra definitivamente el acceso y retira al cliente de su grupo.
Cada webhook se verifica por firma con el secreto whsec_…. Si la firma no es válida o el secreto está vacío, la solicitud se rechaza. Comprueba este ajuste en primer lugar si las suscripciones no se activan.
Biblioteca de contenido y muro de pago
En Membership > Contenido, crea los elementos reservados. Cada contenido tiene:
- Tipo: artículo, vídeo, archivo o enlace.
- Título, teaser, contenido (multilingües). El teaser es la vista previa pública mostrada antes del muro de pago; si se deja vacío, se genera automáticamente con las primeras palabras del contenido (longitud ajustable).
- URL del medio: la integración de vídeo, el archivo a descargar o el enlace externo.
- Plan requerido: el plan que da acceso al contenido. El valor «Cualquier miembro activo» abre el contenido a cualquier suscripción en curso.
- Retardo de drip (días): número de días tras el inicio de la suscripción antes de que el contenido se desbloquee, para difundir una biblioteca de forma progresiva (drip content).
En la tienda, la biblioteca lista los contenidos con su teaser. Un miembro ve el contenido completo; un visitante o un no miembro ve el teaser y luego un muro de pago que le invita a suscribirse. El control de acceso combina el plan requerido y el retardo de drip.
Posicionamiento del contenido reservado
Cuando la opción de esquema SEO está activada, el módulo añade datos estructurados sobre el contenido desbloqueado indicando que es contenido de pago (muestreo flexible de Google). El bloque reservado se marca con una clase CSS dedicada, lo que permite a Google indexar la página sin penalizar la diferencia entre lo que ven el robot y el miembro.
Páginas CMS reservadas
Para reservar páginas CMS existentes (una página de recursos, un área privada…), indica sus identificadores en Páginas CMS protegidas. Un no miembro que abra una de estas páginas es redirigido automáticamente a la biblioteca, donde puede descubrir las fórmulas. Los miembros acceden con normalidad.
Área de miembros
Desde Mi cuenta > Mi membresía, el cliente encuentra sus suscripciones en curso: plan, estado, modo de facturación, fecha de renovación o de fin. Puede abrir la biblioteca y, si procede, cancelar una suscripción. La cancelación se hace al final del periodo: el acceso permanece abierto hasta el término ya pagado y luego se cierra. En modo Stripe, la solicitud se transmite a Stripe; en modo duración, el acceso simplemente no se renueva.
Gestionar las suscripciones (back-office)
En Membership > Suscripciones, visualizas todas las suscripciones (cliente, correo, plan, estado, modo, fechas) con búsqueda y exportación. La vista de detalle permite forzar un estado (activo, expirado, cancelado) cuando sea necesario: un gesto comercial, una regularización, un litigio. Cualquier cambio de estado resincroniza de inmediato el grupo del cliente.
Los grupos también se resincronizan al iniciar sesión el cliente y al validar un pedido, para garantizar que el acceso refleje siempre las suscripciones realmente activas.
Ir más lejos
La arquitectura de facturación es extensible: se añade un nuevo proveedor (por ejemplo PayPal recurrente) implementando la interfaz BillingManagerInterface de la carpeta src/Billing/ y registrándola en la fábrica BillingManagerFactory, sin tocar el resto del módulo. Entre las evoluciones posibles: teasers generados por IA, correos de reclamación, membresías de regalo, cambio de fórmula con prorrateo o un panel de MRR / tasa de cancelación.
FAQ y resolución de problemas
Un cliente ha pagado pero no tiene acceso
En modo Stripe, comprueba primero el secreto del webhook y que el endpoint recibe efectivamente los eventos en el panel de Stripe (pestaña Webhooks). La activación depende del evento checkout.session.completed. En modo duración, comprueba que la suscripción ha pasado a estado activo; puedes forzarlo desde la vista de detalle.
Los accesos nunca expiran
El modo duración se basa en el cron. Asegúrate de haber programado la URL cron (diaria) con el token correcto. Puedes llamarla manualmente para probar: la respuesta JSON indica el número de suscripciones expiradas.
¿Cómo vinculo el plan a precios reducidos?
Asocia el plan a un grupo de clientes y luego define precios específicos para ese grupo en tus fichas de producto (o mediante una regla de precio de catálogo). Mientras el miembro esté activo, pertenece al grupo y se beneficia de esos precios automáticamente.
¿El contenido reservado es indexable por Google?
Sí, si la opción de esquema SEO está activada: el contenido de pago se señala como tal mediante datos estructurados, lo que corresponde a las recomendaciones de Google sobre el muestreo flexible. Conservas la indexación sin ocultar la naturaleza de pago.
¿Puedo ofrecer una prueba gratuita?
Sí. Indica un número de días de prueba en el plan. En modo duración, se abre una ventana de prueba; en modo Stripe, la prueba se transmite a la suscripción de Stripe (trial_period_days).
¿Se admite PayPal?
La versión 1 implementa los modos duración y Stripe. PayPal recurrente puede añadirse gracias a la interfaz de facturación extensible, sin reescribir el módulo.
¿Es compatible con PrestaShop 9?
Sí. El módulo es compatible con PrestaShop 8 y 9, en multitienda y multilingüe (FR, EN, ES, DE, IT).