PS PrestaShop Średnio zaawansowany

Strefa Członkowska i Treści Płatne (dfmembership): kompletny przewodnik

Instalacja, konfiguracja i prowadzenie strefy członkowskiej z płatnymi treściami: plany mapowane na grupy klientów, dostęp czasowy (cron) lub subskrypcja cykliczna (Stripe), biblioteka z paywallem i schemat SEO dla PrestaShop 8 i 9.

Zaktualizowano Wersja modułu 1.0.0

Wprowadzenie

Moduł Strefa Członkowska i Treści Płatne (dfmembership) zamienia Twój sklep w platformę członkowską: sprzedajesz abonamenty, które otwierają dostęp do strefy członkowskiej i treści zastrzeżonych (artykuły, wideo, pliki, linki), do cen grupowych lub do prywatnych stron CMS. Każdy plan jest powiązany z natywną grupą klientów PrestaShop, dzięki czemu sklep natywnie zarządza widocznością katalogu i cenami grupowymi; moduł dokłada do tego fakturowanie, paywall, bibliotekę, automatyczne wygasanie i synchronizację grup.

Dwa modele biznesowe są dostępne już w pierwszej wersji i wybiera się je osobno dla każdego planu: dostęp na czas określony (klient płaci raz za N dni, dostęp wygasa automatycznie) oraz prawdziwa subskrypcja cykliczna przez Stripe Billing (odnowienie i rezygnacja sterowane webhookami).

Kompatybilność

  • PrestaShop 8.0 do 9.x
  • PHP 7.4 do 8.3
  • Jeden sklep i multisklep
  • 5 języków: FR, EN, ES, DE, IT
  • Motyw Classic i motywy niestandardowe
  • Zero zależności: bez Composera, bez wbudowanego SDK Stripe (wywołania API przez natywny cURL)

Kluczowe pojęcia

Plan = grupa klientów

Plan reprezentuje formułę członkostwa (na przykład „Premium” albo „Pro roczny”). Każdy plan jest mapowany na grupę klientów PrestaShop: gdy klient zostaje członkiem, trafia do tej grupy; gdy jego abonament wygasa lub zostaje anulowany, jest z niej usuwany. Zyskujesz w ten sposób całą natywną mechanikę PrestaShop: ceny specyficzne dla grupy, ograniczenia przewoźników, widoczność kategorii i inne, bez dodatkowej konfiguracji w module.

Najpierw utwórz grupy klientów w Klienci > Grupy, a następnie powiąż je z planami. Ta sama grupa może służyć jako podstawa zarówno cen grupowych, jak i rezerwacji treści.

Dwa tryby fakturowania

  • Czas określony: klient płaci raz i otrzymuje dostęp na czas trwania planu (w dniach). Zadanie cron wygasza dostępy, które dobiegły końca. Idealne dla jednorazowej przepustki, dostępu sezonowego lub treści o ograniczonym czasie. Przy wcześniejszym odnowieniu pozostały czas się kumuluje.
  • Subskrypcja Stripe: prawdziwy cykliczny abonament zarządzany przez Stripe Billing. Odnowienie, nieudana płatność i rezygnacja przychodzą webhookami i są automatycznie odzwierciedlane na dostępie klienta. Idealne dla przychodu cyklicznego (MRR).

Instalacja

  1. W panelu administracyjnym otwórz Moduły > Menedżer modułów.
  2. Kliknij Zainstaluj moduł i wybierz plik dfmembership.zip.
  3. Po instalacji kliknij Konfiguruj.

Podczas instalacji moduł tworzy swoje tabele (plany, abonamenty, treści), rejestruje hooki, generuje losowy token cron i dodaje menu Membership w sekcji Sprzedaż, z trzema podzakładkami: Plany, Abonamenty i Treści. W koncie klienta pojawia się link Moje członkostwo.

Konfiguracja ogólna

Strona konfiguracji modułu zbiera ustawienia globalne oraz dwa adresy URL integracji (webhook Stripe i cron), które należy przenieść do narzędzi zewnętrznych.

Ustawienia Stripe

  • Klucz tajny Stripe: Twój klucz sk_live_… (lub sk_test_… w trybie testowym). Wymagany do fakturowania cyklicznego.
  • Klucz publikowalny Stripe: Twój klucz pk_….
  • Sekret podpisu webhooków: wartość whsec_… dostarczona przez Stripe dla punktu końcowego. Służy do weryfikacji podpisu każdego przychodzącego webhooka.

Treści i paywall

  • Chronione strony CMS: lista identyfikatorów stron CMS zastrzeżonych dla członków, rozdzielonych przecinkami (na przykład 4,7,9). Osoby bez członkostwa próbujące je otworzyć są przekierowywane do biblioteki.
  • Schemat SEO paywalla: wstrzykuje dane strukturalne isAccessibleForFree ustawione na false na treściach zastrzeżonych, dzięki czemu pozostają indeksowalne przez Google i nie są traktowane jako cloaking.
  • Długość zajawki (słowa): liczba słów wyświetlanych przed paywallem, gdy na treści nie wpisano jawnej zajawki.
  • Wygeneruj nowy token cron: podmienia token w adresie cron (przydatne, jeśli wyciekł).

Klucz tajny i sekret webhooka to dane wrażliwe. Używaj kluczy testowych na czas walidacji procesu, a następnie przełącz się na klucze live w produkcji. Nigdy nie udostępniaj publicznie adresu cron z tokenem.

Tworzenie planu

W Membership > Plany dodaj formułę i uzupełnij:

  • Nazwa, hasło, opis (wielojęzyczne): wyświetlane na stronie abonamentu i w bloku powitalnym.
  • Tryb fakturowania: „Dostęp na czas określony (cron)” lub „Subskrypcja cykliczna (Stripe)”.
  • Cena: kwota widoczna dla klienta.
  • Czas trwania (dni): długość dostępu w trybie czasowym.
  • Okres próbny (dni): ewentualny trial (0 = brak). W trybie Stripe okres próbny jest przekazywany do subskrypcji Stripe.
  • Stripe Price ID: identyfikator price_… taryfy cyklicznej utworzonej w Stripe (tylko tryb Stripe).
  • Powiązana grupa klientów: grupa, do której członek należy, dopóki jego dostęp jest aktywny.
  • Pozycja i Aktywny: kolejność wyświetlania i dostępność planu.

Tryb czasowy i cron

W trybie czasowym abonament jest tworzony, a następnie aktywowany na czas trwania planu; data końcowa jest liczona od daty aktywacji. Plany darmowe (cena zerowa) aktywują się natychmiast, a plan z okresem próbnym najpierw otwiera okno triala.

Aby automatycznie zamykać dostępy, które dobiegły końca, zaplanuj wywołanie adresu cron widocznego w konfiguracji (chronionego tokenem). Wystarczy raz dziennie:

curl "https://twoj-sklep/index.php?fc=module&module=dfmembership&controller=cron&token=TWOJ_TOKEN"

Cron przełącza w status „wygasły” każdy abonament czasowy z przekroczoną datą końcową, a następnie resynchronizuje grupy danego klienta. Bez crona dostępy nie wygasają samoczynnie: pamiętaj o jego zaplanowaniu.

Tryb subskrypcji Stripe

W trybie Stripe klient jest przekierowywany na stronę płatności Stripe Checkout w trybie subskrypcji. Po zakończeniu płatności Stripe powiadamia Twój sklep webhookiem i dostęp zostaje aktywowany. Cały cykl życia jest dalej sterowany przez Stripe.

Wdrożenie

  1. W Stripe utwórz produkt i taryfę cykliczną (miesięczną, roczną…), po czym skopiuj jej price_… do odpowiedniego planu.
  2. Wpisz klucze Stripe i sekret webhooka w konfiguracji modułu.
  3. W Stripe dodaj punkt końcowy webhook wskazujący na adres widoczny w konfiguracji i zasubskrybuj zdarzenia: checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.updated oraz customer.subscription.deleted.

Co robią webhooki?

  • checkout.session.completed: aktywuje abonament i zapisuje identyfikator subskrypcji Stripe.
  • invoice.paid: odnawia dostęp i przesuwa datę końca okresu.
  • invoice.payment_failed: utrzymuje dostęp na czas okresu ponagleń (dunning) zarządzanego przez Stripe.
  • customer.subscription.updated: odzwierciedla rezygnację zaplanowaną na koniec okresu lub zmianę daty.
  • customer.subscription.deleted: ostatecznie zamyka dostęp i usuwa klienta z jego grupy.

Każdy webhook jest weryfikowany podpisem przy użyciu sekretu whsec_…. Jeśli podpis jest nieprawidłowy albo sekret nie został wpisany, żądanie jest odrzucane. To ustawienie sprawdź w pierwszej kolejności, gdy abonamenty się nie aktywują.

Biblioteka treści i paywall

W Membership > Treści tworzysz elementy zastrzeżone. Każda treść posiada:

  • Typ: artykuł, wideo, plik lub link.
  • Tytuł, zajawkę, treść (wielojęzyczne). Zajawka to publiczny podgląd wyświetlany przed paywallem; pozostawiona pusta, jest generowana automatycznie z pierwszych słów treści (długość regulowana).
  • URL mediów: osadzenie wideo, plik do pobrania lub link zewnętrzny.
  • Wymagany plan: plan dający dostęp do treści. Wartość „Każdy aktywny członek” otwiera treść dla dowolnego trwającego abonamentu.
  • Opóźnienie drip (dni): liczba dni od startu abonamentu, po której treść się odblokowuje, aby stopniowo udostępniać bibliotekę (drip content).

Po stronie sklepu biblioteka wyświetla treści z ich zajawkami. Członek widzi pełną treść; odwiedzający lub osoba bez członkostwa widzi zajawkę, a następnie paywall zachęcający do subskrypcji. Kontrola dostępu łączy wymagany plan i opóźnienie drip.

Indeksowanie treści zastrzeżonych

Gdy opcja schematu SEO jest włączona, moduł dodaje na odblokowanej treści dane strukturalne wskazujące, że jest to treść płatna (flexible sampling Google). Blok zastrzeżony jest oznaczony dedykowaną klasą CSS, co pozwala Google indeksować stronę bez karania różnicy między tym, co widzi robot, a tym, co widzi członek.

Zastrzeżone strony CMS

Aby zarezerwować istniejące strony CMS (strona z materiałami, strefa prywatna…), wpisz ich identyfikatory w polu Chronione strony CMS. Osoba bez członkostwa otwierająca jedną z tych stron jest automatycznie przekierowywana do biblioteki, gdzie może poznać formuły. Członkowie mają do nich normalny dostęp.

Strefa członkowska

W Moje konto > Moje członkostwo klient znajduje swoje trwające abonamenty: plan, status, tryb fakturowania, datę odnowienia lub zakończenia. Może otworzyć bibliotekę oraz, w razie potrzeby, zrezygnować z abonamentu. Rezygnacja następuje na koniec okresu: dostęp pozostaje otwarty do końca już opłaconego terminu, po czym się zamyka. W trybie Stripe żądanie jest przekazywane do Stripe; w trybie czasowym dostęp po prostu nie jest przedłużany.

Zarządzanie abonamentami (panel administracyjny)

W Membership > Abonamenty widzisz wszystkie abonamenty (klient, e-mail, plan, status, tryb, daty) z wyszukiwarką i eksportem. Widok szczegółowy pozwala wymusić status (aktywny, wygasły, anulowany) w razie potrzeby: gest handlowy, regulacja, spór. Każda zmiana statusu natychmiast resynchronizuje grupę klienta.

Grupy są resynchronizowane także przy logowaniu klienta i przy walidacji zamówienia, aby dostęp zawsze odzwierciedlał faktycznie aktywne abonamenty.

Dalsza rozbudowa

Architektura fakturowania jest rozszerzalna: nowego dostawcę (na przykład cykliczny PayPal) dodaje się, implementując interfejs BillingManagerInterface z katalogu src/Billing/ i rejestrując go w fabryce BillingManagerFactory, bez dotykania reszty modułu. Wśród możliwych rozszerzeń: zajawki generowane przez AI, e-maile przypominające, abonamenty prezentowe, zmiana formuły z proratą albo panel MRR i wskaźnika rezygnacji.

FAQ i rozwiązywanie problemów

Klient zapłacił, ale nie ma dostępu

W trybie Stripe sprawdź najpierw sekret webhooka oraz czy punkt końcowy faktycznie odbiera zdarzenia w panelu Stripe (zakładka Webhooks). Aktywacja zależy od zdarzenia checkout.session.completed. W trybie czasowym sprawdź, czy abonament przeszedł w status aktywny; możesz go wymusić z widoku szczegółowego.

Dostępy nigdy nie wygasają

Tryb czasowy opiera się na cronie. Upewnij się, że zaplanowałeś adres cron (codziennie) z prawidłowym tokenem. Możesz wywołać go ręcznie w ramach testu: odpowiedź JSON podaje liczbę wygaszonych abonamentów.

Jak powiązać plan z obniżonymi cenami?

Powiąż plan z grupą klientów, a następnie zdefiniuj ceny specyficzne dla tej grupy na kartach produktów (lub przez katalogową regułę cenową). Dopóki członek jest aktywny, należy do grupy i automatycznie korzysta z tych cen.

Czy treści zastrzeżone są indeksowalne przez Google?

Tak, jeśli opcja schematu SEO jest włączona: treść płatna jest oznaczana jako taka przez dane strukturalne, zgodnie z zaleceniami Google dotyczącymi flexible sampling. Zachowujesz indeksowanie bez ukrywania płatnego charakteru treści.

Czy mogę zaoferować darmowy okres próbny?

Tak. Wpisz liczbę dni triala na planie. W trybie czasowym otwierane jest okno próbne; w trybie Stripe okres próbny jest przekazywany do subskrypcji Stripe (trial_period_days).

Czy PayPal jest obsługiwany?

Wersja 1 implementuje tryb czasowy i Stripe. Cykliczny PayPal można dodać dzięki rozszerzalnemu interfejsowi fakturowania, bez przebudowy modułu.

Czy moduł jest zgodny z PrestaShop 9?

Tak. Moduł jest zgodny z PrestaShop 8 i 9, w multisklepie i w wersji wielojęzycznej (FR, EN, ES, DE, IT).

Czy ta strona była pomocna?

Nadal utknąłeś? Napisz do wsparcia