Улучшения плагина Subscriptions

Здравствуйте! Я внес следующие изменения в этот плагин и хотел бы узнать, готова ли команда Discourse принять pull request.

Также буду рад, если другие участники проведут тщательное тестирование. В данный момент я тестирую сценарии, которые являются критически важными для меня.


Оригинальный плагин является отличной основой, но в основном ориентирован на повторяющиеся подписки через Stripe. Я внес следующие изменения:

Краткое описание новых функций и улучшений

1. Система оплаты с поддержкой нескольких провайдеров (с Razorpay) Плагин больше не привязан жестко к Stripe. Теперь используется архитектура на основе провайдеров, позволяющая подключать несколько платежных шлюзов.

  • Интеграция с Razorpay: Razorpay полностью интегрирован в качестве второго провайдера платежей. Это критически важно для сообществ на рынках, таких как Индия, где Razorpay является предпочтительным шлюзом.
  • Безопасные вебхуки: Интеграция с Razorpay надежна и включает безопасный обработчик вебхуков для подтверждения платежей между серверами, что гарантирует, что ни одна подписка не будет упущена, если пользователь закроет браузер после оплаты.

2. Разовые подписки с ограниченным сроком действия Вводится новый гибкий тип продукта, выходящий за рамки стандартных повторяющихся подписок.

  • Истечение срока доступа: Администраторы теперь могут создавать разовые тарифные планы, предоставляющие доступ к группе на фиксированный срок (например, пропуск на мероприятие на 7 дней, пробный период на 30 дней или пакет на 90 дней).
  • Автоматическое истечение срока: Ежедневная фоновая задача автоматически проверяет истекшие подписки и удаляет пользователей из соответствующих групп, обеспечивая полное автоматизированное управление доступом.

3. Полная переработка страницы цен Страница подписки, отображаемая пользователю по умолчанию, полностью перестроена для повышения конверсии и улучшения пользовательского опыта.

  • Современный интерфейс на основе карточек: Старый список продуктов заменен чистым, адаптивным макетом на основе карточек, который легче читать и сравнивать.
  • Адаптация к теме: Новый дизайн использует переменные тем Discourse и полностью совместим как со светлой, так и с темной темой.
  • Оформление заказа на одной странице: Весь процесс оформления заказа теперь происходит на странице цен. При нажатии кнопки «Подписаться» форма оплаты отображается прямо на странице, устраняя лишний шаг и снижая трение для пользователя.

4. Продвинутые техники апсейлинга и отображения ценности Новые карточки цен разработаны как мощные инструменты для апсейлинга.

  • Эффективная ежемесячная стоимость: Интерфейс автоматически рассчитывает и отображает эффективную «стоимость в месяц» для всех типов планов (включая разовые планы на 3 месяца или год), позволяя пользователям легко сравнивать выгоду различных вариантов.
  • Явная экономия: На планах с более длительным сроком действия автоматически отображается значок «Экономия ₹X», четко сообщая о преимуществе выбора плана с большей ценностью по сравнению с базовым.

5. Единые панели управления для администраторов и пользователей Страницы выставления счетов как для администраторов, так и для пользователей были рефакторированы, чтобы стать проще и мощнее.

  • Единый обзор: Вместо отдельных списков для разных типов платежей теперь есть одна таблица, отображающая все подписки от всех провайдеров (Stripe, Razorpay, Ручной).
  • Понятная информация: Эти представления четко показывают провайдера, статус, дату истечения/продления и сумму для каждой транзакции, предоставляя как администраторам, так и пользователям полную историю их прав доступа.

6. Ручное управление подписками для администраторов Добавлен новый набор инструментов, дающий администраторам больше контроля.

  • Предоставление подписки: Администраторы теперь могут вручную предоставить любой тарифный план любому пользователю на определенный срок. Это идеально подходит для обработки офлайн-платежей, предоставления бесплатного доступа или внесения исправлений.
  • Отзыв доступа: Доступ для нереприродящихся планов может быть немедленно отозван из панели администратора.

7. Критическое исправление ошибки в управлении группами

  • Исправлена серьезная ошибка в логике удаления из группы в оригинальном плагине. При отмене или отзыве подписки система теперь выполняет «проверку безопасности», чтобы узнать, есть ли у пользователя какие-либо другие активные подписки на ту же группу. Пользователь будет удален из группы только в том случае, если у него нет другого законного способа доступа к ней, что предотвращает ошибочное удаление пользователей.

https://github.com/rahul-rakesh/discourse-subscriptions

Можете добавить ссылку на ваш репозиторий на GitHub?

Да, конечно. Дайте мне один день. Устраняю несколько ошибок, связанных с обработкой устаревших данных Stripe при переходе на эту версию плагина с новыми полями.

Обновил первый пост с репозиторием.

Руководство по настройке и конфигурации

Это руководство поможет вам настроить необходимых поставщиков платежей и создать ваши первые продукты и тарифные планы.

1. Настройка поставщика

Сначала перейдите в Администрирование > Настройки > Плагины и выберите основного поставщика платежей в настройке discourse_subscriptions_payment_provider. Затем следуйте инструкциям для выбранного вами поставщика ниже.

A) Настройка Stripe

Если вы выбрали Stripe в качестве поставщика:

  1. Заполните ключи API: В настройках Discourse укажите ключи API Stripe:
  • discourse_subscriptions_public_key (Ваш ключ Publishable от Stripe)
  • discourse_subscriptions_secret_key (Ваш Secret ключ от Stripe)
  1. Настройте Webhook: Этот шаг критически важен для отслеживания повторяющихся платежей, отмен и других событий подписки.
  • В вашей Панели управления Stripe перейдите в Разработчики > Webhooks.
  • Нажмите “Добавить конечную точку”.
  • В поле URL конечной точки введите: https://your-discourse-url.com/s/hooks
  • Нажмите “Выбрать события” и добавьте следующие три события:
    • checkout.session.completed
    • customer.subscription.deleted
    • customer.subscription.updated
  • Нажмите “Добавить конечную точку”.
  • На следующей странице найдите Секрет подписи (он начинается с whsec_...).
  • Скопируйте этот секрет и вставьте его в настройку discourse_subscriptions_webhook_secret в Discourse.
B) Настройка Razorpay

Если вы выбрали Razorpay в качестве поставщика:

  1. Заполните ключи API:
  • В вашей Панели управления Razorpay перейдите в Настройки > Ключи API, чтобы сгенерировать новую пару ключей.
  • Скопируйте ваши ключи и вставьте их в соответствующие настройки Discourse:
    • discourse_subscriptions_razorpay_key_id
    • discourse_subscriptions_razorpay_key_secret
  1. Настройте Webhook: Этот шаг критически важен для подтверждения успешного списания платежа.
  • В вашей Панели управления Razorpay перейдите в Настройки > Webhooks.
  • Нажмите “+ Добавить новый Webhook”.
  • В поле URL Webhook введите: https://your-discourse-url.com/s/hooks/razorpay
  • Создайте Секрет и сохраните его для следующего шага.
  • В разделе Активные события выберите только payment.captured.
  • Нажмите “Создать Webhook”.
  • Скопируйте созданный вами секрет и вставьте его в настройку discourse_subscriptions_razorpay_webhook_secret в Discourse.

2. Создание продуктов и тарифных планов

Перейдите в Администрирование > Плагины > Подписки, чтобы управлять своими продуктами и тарифными планами.

Создание продукта
  1. Перейдите на вкладку Продукты.
  2. Нажмите “Создать новый продукт”.
  3. Заполните данные. Поле “Описание” поддерживает разметку Markdown и будет отображаться пользователям на новой странице с ценами.
Создание тарифных планов для продукта
  1. После создания продукта нажмите значок редактирования (✎) рядом с ним.
  2. В разделе “Тарифные планы” нажмите “Добавить новый план”.
  3. Вы можете создать два типа планов:
  • Для создания повторяющегося плана (например, ежемесячный/ежегодный):
    • Установите флажок “Повторяющийся план?”.
    • Укажите Сумму и Интервал выставления счетов (месяц, год и т. д.).
    • Назначьте его Группе пользователей.
  • Для создания разового плана с ограниченным сроком действия (например, пропуск на 30 дней):
    • Оставьте флажок “Повторяющийся план?” снятым.
    • Укажите Сумму.
    • Появится новое поле “Длительность (в днях)”. Введите количество дней, в течение которых пользователь должен иметь доступ (например, 30).
    • Назначьте его Группе пользователей.

3. Новые административные инструменты

Эта версия включает новые инструменты для ручного управления подписками.

  • Предоставление подписки:
    • На главной странице Администрирование > Плагины > Подписки нажмите кнопку “Предоставить подписку”.
    • В появившемся модальном окне выберите имя пользователя и тарифный план.
    • Если выбранный план является разовым, вы можете указать длительность в днях. Если оставить это поле пустым, пользователю будет предоставлен постоянный доступ к связанной группе.
  • Отзыв подписки:
    • Перейдите на вкладку Подписки в разделе администрирования.
    • У любой неповторяющейся подписки (то есть ручной или Razorpay) будет кнопка “Отозвать доступ”.
    • Нажатие на неё немедленно удалит пользователя из связанной группы, прекратив его доступ.

Репозиторий обновлён со следующими изменениями и исправлениями. Теперь я готов установить и использовать его на своём продакшн-сайте.

Сводка улучшений стабильности и безопасности

1. Интеграция с современным Stripe Checkout Плагин обновлён для использования современного процесса оплаты через перенаправление Stripe Checkout.

  • Что это значит: Вместо формы ввода данных карты на странице пользователя теперь перенаправляются на безопасную страницу, размещённую Stripe, для завершения оплаты.
  • Почему это лучше: Это рекомендуемый Stripe подход. Он повышает безопасность, снижает нагрузку по соответствию требованиям PCI для вашего сайта и улучшает пользовательский опыт за счёт поддержки таких методов, как Apple Pay и Google Pay.

2. Надёжная логика повторной покупки Логика, предотвращающая повторную покупку продукта, на который у пользователя уже есть активная подписка, полностью переработана.

  • Исправление: Мы добавили product_id в каждую локальную запись подписки. Проверка теперь представляет собой простой и быстрый запрос к вашей локальной базе данных с нулевыми вызовами внешних API, что делает её на 100% надёжной.
  • Результат: Пользователь с активной подпиской (рекуррентной или с ограниченным сроком действия) теперь будет корректно заблокирован от повторной покупки того же продукта до момента её истечения.

3. Целостность данных во всех панелях управления Страница биллинга пользователя и панель администратора подписок исправлены для обеспечения отображения точных данных в реальном времени.

  • Исправление: Обе страницы теперь получают актуальный статус и даты продления/истечения для каждой подписки напрямую от провайдера платежей (Stripe).
  • Результат: То, что вы видите в панели администратора, всегда будет точно соответствовать тому, что видит пользователь, и оба отображения будут отражать реальное состояние подписки в Stripe. Исправлены ошибки, при которых в деталях тарифа отображалось «N/A» или неверный статус «активен».

4. Надёжная обработка вебхуков и фоновых задач

  • Больше никаких дубликатов подписок: Обработчик вебхуков исправлен для корректной обработки последовательности событий от Stripe, гарантируя, что одна транзакция создаёт ровно одну запись подписки.
  • Надёжная задача истечения: Ежедневная фоновая задача, истекающая разовые тарифы, доработана. Она теперь корректно устанавливает необходимый API-ключ и истекает подписку даже в случае удаления исходного тарифа из Stripe, гарантируя, что права доступа вашей группы всегда будут точными.

Вау, спасибо за внесение всех этих изменений!

Однако в текущем виде мы не можем просто объединить все эти масштабные изменения сразу. Если вы хотите, чтобы они были включены в плагин discourse-subscriptions, вам нужно разбить каждое изменение отдельно и создать отдельные PR с тестами. Также убедитесь, что не будет нарушена работа для существующих пользователей, которые уже используют плагин подписок и имеют много подписчиков.

Конечно, спасибо. Выделю время и создам несколько PR после согласования спецификаций.