Здравствуйте! Я внес следующие изменения в этот плагин и хотел бы узнать, готова ли команда 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. Критическое исправление ошибки в управлении группами
Исправлена серьезная ошибка в логике удаления из группы в оригинальном плагине. При отмене или отзыве подписки система теперь выполняет «проверку безопасности», чтобы узнать, есть ли у пользователя какие-либо другие активные подписки на ту же группу. Пользователь будет удален из группы только в том случае, если у него нет другого законного способа доступа к ней, что предотвращает ошибочное удаление пользователей.
Да, конечно. Дайте мне один день. Устраняю несколько ошибок, связанных с обработкой устаревших данных Stripe при переходе на эту версию плагина с новыми полями.
Это руководство поможет вам настроить необходимых поставщиков платежей и создать ваши первые продукты и тарифные планы.
1. Настройка поставщика
Сначала перейдите в Администрирование > Настройки > Плагины и выберите основного поставщика платежей в настройке discourse_subscriptions_payment_provider. Затем следуйте инструкциям для выбранного вами поставщика ниже.
A) Настройка Stripe
Если вы выбрали Stripe в качестве поставщика:
Заполните ключи API: В настройках Discourse укажите ключи API Stripe:
discourse_subscriptions_public_key (Ваш ключ Publishable от Stripe)
discourse_subscriptions_secret_key (Ваш Secret ключ от Stripe)
Настройте 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 в качестве поставщика:
Заполните ключи API:
В вашей Панели управления Razorpay перейдите в Настройки > Ключи API, чтобы сгенерировать новую пару ключей.
Скопируйте ваши ключи и вставьте их в соответствующие настройки Discourse:
discourse_subscriptions_razorpay_key_id
discourse_subscriptions_razorpay_key_secret
Настройте Webhook: Этот шаг критически важен для подтверждения успешного списания платежа.
В вашей Панели управления Razorpay перейдите в Настройки > Webhooks.
Нажмите “+ Добавить новый Webhook”.
В поле URL Webhook введите: https://your-discourse-url.com/s/hooks/razorpay
Создайте Секрет и сохраните его для следующего шага.
В разделе Активные события выберите только payment.captured.
Нажмите “Создать Webhook”.
Скопируйте созданный вами секрет и вставьте его в настройку discourse_subscriptions_razorpay_webhook_secret в Discourse.
2. Создание продуктов и тарифных планов
Перейдите в Администрирование > Плагины > Подписки, чтобы управлять своими продуктами и тарифными планами.
Создание продукта
Перейдите на вкладку Продукты.
Нажмите “Создать новый продукт”.
Заполните данные. Поле “Описание” поддерживает разметку Markdown и будет отображаться пользователям на новой странице с ценами.
Создание тарифных планов для продукта
После создания продукта нажмите значок редактирования (✎) рядом с ним.
В разделе “Тарифные планы” нажмите “Добавить новый план”.
Вы можете создать два типа планов:
Для создания повторяющегося плана (например, ежемесячный/ежегодный):
Установите флажок “Повторяющийся план?”.
Укажите Сумму и Интервал выставления счетов (месяц, год и т. д.).
Назначьте его Группе пользователей.
Для создания разового плана с ограниченным сроком действия (например, пропуск на 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 с тестами. Также убедитесь, что не будет нарушена работа для существующих пользователей, которые уже используют плагин подписок и имеют много подписчиков.