Área de Membro e Conteúdo Pago (dfmembership): guia completo
Instalar, configurar e explorar uma área de membro e conteúdo reservado pago: planos mapeados aos grupos de clientes, acesso de duração limitada (cron) ou subscrição recorrente (Stripe), biblioteca com paywall e schema SEO para PrestaShop 8 e 9.
Apresentação
O módulo Área de Membro e Conteúdo Pago (dfmembership) transforma a sua loja numa plataforma de adesão: vende subscrições que dão acesso a uma área de membro e a conteúdo reservado (artigos, vídeos, ficheiros, ligações), a preços de grupo, ou a páginas CMS privadas. Cada plano está ligado a um grupo de clientes nativo do PrestaShop, o que deixa a loja gerir nativamente a visibilidade do catálogo e os preços por grupo; o módulo acrescenta por cima a faturação, o paywall, a biblioteca, a expiração automática e a sincronização dos grupos.
Dois modelos económicos estão disponíveis desde a primeira versão, e escolhem-se plano a plano: um acesso de duração limitada (o cliente paga uma vez por N dias, o acesso expira automaticamente) e uma subscrição recorrente real via Stripe Billing (renovação e cancelamento controlados por webhooks).
Para uma loja portuguesa: o Decreto-Lei n.º 24/2014 dá ao consumidor 14 dias de livre resolução também nos contratos de subscrição e de conteúdos digitais, salvo se este consentir expressamente o início imediato da prestação e reconhecer a perda desse direito. Preveja essa caixa de consentimento no seu checkout e mencione as condições de cancelamento nos seus termos, o módulo não a adiciona sozinho.
Compatibilidade
- PrestaShop 8.0 a 9.x
- PHP 7.4 a 8.3
- Monoloja e multiloja
- 5 idiomas: FR, EN, ES, DE, IT (o português traduz-se em Internacional > Traduções)
- Tema Classic e temas personalizados
- Nenhuma dependência: sem Composer, sem SDK Stripe incorporado (chamadas API em cURL nativo)
Conceitos-chave
Plano = grupo de clientes
Um plano representa uma fórmula de adesão (por exemplo « Premium » ou « Pro anual »). Cada plano está mapeado a um grupo de clientes PrestaShop: quando um cliente se torna membro, é adicionado a esse grupo; quando a sua subscrição expira ou é cancelada, é retirado dele. Beneficia assim de toda a mecânica nativa do PrestaShop: preços específicos por grupo, restrições de transportadoras, visibilidade de categorias, etc., sem configuração adicional no módulo.
Crie primeiro os seus grupos de clientes em Clientes > Grupos e associe-os depois aos seus planos. Um mesmo grupo pode servir de base aos seus preços de grupo e à reserva de conteúdo.
Os dois modos de faturação
- Duração limitada: o cliente paga uma vez e obtém o acesso durante a duração do plano (em dias). Uma tarefa cron expira os acessos que chegaram ao fim. Ideal para um passe pontual, um acesso sazonal ou um conteúdo de duração determinada. Em caso de renovação antecipada, o tempo restante acumula-se.
- Subscrição Stripe: uma verdadeira subscrição recorrente gerida pelo Stripe Billing. A renovação, a falha de pagamento e o cancelamento são recebidos por webhooks e refletidos automaticamente no acesso do cliente. Ideal para uma receita recorrente (MRR).
Instalação
- No back-office, abra Módulos > Gestor de módulos.
- Clique em Instalar um módulo e selecione o ficheiro
dfmembership.zip. - Depois de instalado, clique em Configurar.
Na instalação, o módulo cria as suas tabelas (planos, subscrições, conteúdos), regista os seus hooks, gera um token de cron aleatório e acrescenta um menu Membership em Vender, com três subseparadores: Planos, Subscrições e Conteúdo. Uma ligação A minha adesão aparece na área de cliente.
Configuração geral
A página de configuração do módulo reúne as definições globais e os dois URLs de integração (webhook Stripe e cron) a reportar nas suas ferramentas externas.
Definições Stripe
- Chave secreta Stripe: a sua chave
sk_live_…(ousk_test_…em teste). Necessária para a faturação recorrente. - Chave publicável Stripe: a sua chave
pk_…. - Segredo de assinatura dos webhooks: o valor
whsec_…fornecido pelo Stripe para o endpoint. Serve para verificar a assinatura de cada webhook recebido.
Conteúdo e paywall
- Páginas CMS protegidas: a lista dos identificadores de páginas CMS reservadas aos membros, separados por vírgulas (por exemplo
4,7,9). Os não membros que tentem aceder-lhes são redirecionados para a biblioteca. - Schema SEO do paywall: injeta dados estruturados
isAccessibleForFreea false no conteúdo reservado, para que continue indexável pelo Google sem ser considerado cloaking. - Comprimento do teaser (palavras): número de palavras apresentadas antes do paywall quando nenhum teaser explícito é introduzido num conteúdo.
- Regenerar o token de cron: substitui o token do URL de cron (útil se tiver sido divulgado).
A chave secreta e o segredo de webhook são sensíveis. Use as chaves de teste enquanto valida o percurso, e passe depois às chaves live em produção. Nunca partilhe publicamente o URL de cron com o seu token.
Criar um plano
Em Membership > Planos, adicione uma fórmula e preencha:
- Nome, frase de destaque, descrição (multilingues): apresentados na página de subscrição e no bloco de boas-vindas.
- Modo de faturação: « Acesso de duração limitada (cron) » ou « Subscrição recorrente (Stripe) ».
- Preço: o montante apresentado ao cliente.
- Duração (dias): duração do acesso em modo de duração limitada.
- Período experimental (dias): eventual período de experiência (0 = nenhum). Em modo Stripe, o período experimental é transmitido à subscrição Stripe.
- Stripe Price ID: o identificador
price_…da tarifa recorrente criada no Stripe (apenas em modo Stripe). - Grupo de clientes associado: o grupo em que o membro é colocado enquanto o seu acesso está ativo.
- Posição e Ativo: ordem de apresentação e disponibilidade do plano.
Modo de duração limitada e cron
Em modo de duração, a subscrição é criada e depois ativada durante a duração do plano; a sua data de fim é calculada a partir da data de ativação. Os planos gratuitos (preço nulo) são ativados imediatamente, e um plano com período experimental abre primeiro uma janela de experiência.
Para fechar automaticamente os acessos que chegaram ao fim, agende o URL de cron apresentado na configuração (protegido por um token). Uma execução diária é suficiente:
curl "https://a-sua-loja/index.php?fc=module&module=dfmembership&controller=cron&token=O_SEU_TOKEN"
O cron passa ao estado « expirado » qualquer subscrição de duração cuja data de fim tenha sido ultrapassada, e depois ressincroniza os grupos do cliente em causa. Sem cron, os acessos não expiram sozinhos: lembre-se de o agendar.
Modo de subscrição Stripe
Em modo Stripe, o cliente é redirecionado para uma página de pagamento Stripe Checkout em modo de subscrição. No fim do pagamento, o Stripe notifica a sua loja por webhook e o acesso é ativado. O ciclo de vida completo é depois controlado pelo Stripe.
Configuração
- No Stripe, crie um produto e uma tarifa recorrente (mensal, anual…) e copie o seu
price_…no plano correspondente. - Preencha as suas chaves Stripe e o segredo de webhook na configuração do módulo.
- No Stripe, adicione um endpoint de webhook que aponte para o URL apresentado na configuração, e subscreva-o aos eventos:
checkout.session.completed,invoice.paid,invoice.payment_failed,customer.subscription.updatedecustomer.subscription.deleted.
O que fazem os webhooks?
- checkout.session.completed: ativa a subscrição e regista o identificador de subscrição Stripe.
- invoice.paid: renova o acesso e adia a data de fim de período.
- invoice.payment_failed: mantém o acesso durante o período de cobrança (dunning) gerido pelo Stripe.
- customer.subscription.updated: reflete um cancelamento programado para o fim do período ou uma mudança de data.
- customer.subscription.deleted: encerra definitivamente o acesso e retira o cliente do seu grupo.
Cada webhook é verificado por assinatura com o segredo whsec_…. Se a assinatura for inválida ou se o segredo não estiver preenchido, o pedido é rejeitado. Verifique esta definição em primeiro lugar se as subscrições não se ativarem.
Biblioteca de conteúdo e paywall
Em Membership > Conteúdo, crie os elementos reservados. Cada conteúdo tem:
- Tipo: artigo, vídeo, ficheiro ou ligação.
- Título, teaser, conteúdo (multilingues). O teaser é a pré-visualização pública apresentada antes do paywall; deixado vazio, é gerado automaticamente a partir das primeiras palavras do conteúdo (comprimento ajustável).
- URL do média: a incorporação de vídeo, o ficheiro a descarregar ou a ligação externa.
- Plano exigido: o plano que dá acesso ao conteúdo. O valor « Qualquer membro ativo » abre o conteúdo a qualquer subscrição em curso.
- Atraso de drip (dias): número de dias depois do início da subscrição antes de o conteúdo se desbloquear, para difundir progressivamente uma biblioteca (drip content).
Do lado da loja, a biblioteca lista os conteúdos com o seu teaser. Um membro vê o conteúdo completo; um visitante ou um não membro vê o teaser e depois um paywall que o convida a subscrever. O controlo de acesso combina o plano exigido e o atraso de drip.
Posicionamento do conteúdo reservado
Quando a opção de schema SEO está ativada, o módulo acrescenta ao conteúdo desbloqueado dados estruturados que indicam tratar-se de conteúdo pago (amostragem flexível do Google). O bloco reservado é marcado por uma classe CSS dedicada, o que permite ao Google indexar a página sem penalizar a diferença entre o que o robô e o membro veem.
Páginas CMS reservadas
Para reservar páginas CMS existentes (página de recursos, área privada…), indique os seus identificadores em Páginas CMS protegidas. Um não membro que abra uma dessas páginas é automaticamente redirecionado para a biblioteca, onde pode descobrir as fórmulas. Os membros acedem-lhes normalmente.
Área de membro
A partir de A minha conta > A minha adesão, o cliente reencontra as suas subscrições em curso: plano, estado, modo de faturação, data de renovação ou de fim. Pode abrir a biblioteca e, se for o caso, cancelar uma subscrição. O cancelamento é feito no fim do período: o acesso mantém-se aberto até ao termo já pago, e fecha-se depois. Em modo Stripe, o pedido é transmitido ao Stripe; em modo de duração, o acesso simplesmente não é renovado.
Gerir as subscrições (back-office)
Em Membership > Subscrições, visualiza todas as subscrições (cliente, e-mail, plano, estado, modo, datas) com pesquisa e exportação. A vista detalhada permite forçar um estado (ativa, expirada, cancelada) em caso de necessidade: um gesto comercial, uma regularização, um litígio. Qualquer mudança de estado ressincroniza imediatamente o grupo do cliente.
Os grupos são igualmente ressincronizados no início de sessão do cliente e na validação de uma encomenda, para garantir que o acesso reflete sempre as subscrições realmente ativas.
Ir mais longe
A arquitetura de faturação é extensível: um novo fornecedor (por exemplo PayPal recorrente) acrescenta-se implementando a interface BillingManagerInterface da pasta src/Billing/ e registando-a na fábrica BillingManagerFactory, sem tocar no resto do módulo. Entre as evoluções possíveis: teasers gerados por IA, e-mails de lembrete, subscrições de oferta, mudança de fórmula com prorata, ou painel de MRR / taxa de cancelamento.
FAQ e resolução de problemas
Um cliente pagou mas não tem acesso
Em modo Stripe, verifique primeiro o segredo de webhook e que o endpoint recebe os eventos no painel Stripe (separador Webhooks). A ativação depende do evento checkout.session.completed. Em modo de duração, verifique que a subscrição passou ao estado ativo; pode forçá-lo a partir da vista detalhada.
Os acessos nunca expiram
O modo de duração assenta no cron. Certifique-se de que agendou o URL de cron (diário) com o token correto. Pode chamá-lo manualmente para testar: a resposta JSON indica o número de subscrições expiradas.
Como ligar o plano a preços reduzidos?
Associe o plano a um grupo de clientes e defina depois preços específicos para esse grupo nas suas fichas de produto (ou através de uma regra de preço de catálogo). Enquanto o membro estiver ativo, pertence ao grupo e beneficia automaticamente desses preços.
O conteúdo reservado é indexável pelo Google?
Sim, se a opção de schema SEO estiver ativada: o conteúdo pago é assinalado como tal através de dados estruturados, o que corresponde às recomendações do Google sobre a amostragem flexível. Mantém a indexação sem esconder a natureza paga.
Posso propor um período experimental gratuito?
Sim. Preencha um número de dias de experiência no plano. Em modo de duração, é aberta uma janela de experiência; em modo Stripe, o período experimental é transmitido à subscrição Stripe (trial_period_days).
O PayPal é suportado?
A versão 1 implementa os modos de duração e Stripe. O PayPal recorrente pode ser acrescentado graças à interface de faturação extensível, sem reformulação do módulo.
É compatível com o PrestaShop 9?
Sim. O módulo é compatível com PrestaShop 8 e 9, em multiloja e multilingue (FR, EN, ES, DE, IT).