Плагин подписок Discourse

Вы правильно настроили вебхуки? Помню, что их настройка была довольно запутанной, а инструкции могли бы быть немного понятнее.

Да, вебхуки настроены отлично, именно так ответ и возвращался.

Я выяснил проблему. В инструкциях отсутствует пункт о необходимости настроить пользовательские теги с именем группы, которую нужно продвигать, на странице конфигурации цены в Stripe.

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

1 лайк

Можете немного подробнее объяснить это, чтобы мы могли попросить кого-то обновить документацию? Какой пользовательский тег вы добавили и куда именно его добавили?

[Гайд] Настройка подписок Discourse с помощью таблиц цен Stripe (и типичные ошибки)

Всем привет,

После долгого процесса устранения неполадок я хочу поделиться исчерпывающим руководством по настройке официального плагина discourse-subscriptions с использованием современного метода таблиц цен Stripe. Этот подход очень мощный, но в нем есть несколько критических шагов, которые не очевидны с первого взгляда и могут привести к ошибкам, таким как сбои вебхуков (404 Not Found) или отсутствие добавления пользователей в группы после успешной оплаты.

Ниже представлен пошаговый процесс, который подтвержден как рабочий.


Часть 1: Настройка Stripe

Этот процесс использует Stripe в качестве «источника истины» для всех продуктов и цен.

1. Создание продуктов и цен

  • В панели управления Stripe убедитесь, что вы находитесь в режиме Live (Live Mode).
  • Перейдите в раздел Products (Продукты) > Product catalog (Каталог продуктов).
  • Сначала создайте основные продукты (например, «Premium Membership», «VIP Access»).
  • Для каждого продукта создайте все связанные цены (например, XX / месяц, XXX / год).

2. КРИТИЧЕСКИЙ ШАГ: Метаданные
Чтобы плагин автоматически добавлял пользователей в группы, вы должны добавить специальные метаданные в каждый объект Price (Цена), который вы создаете. Интерфейс панели управления Stripe может затруднить поиск этой опции.

  • При создании новой цены (или если вы нашли опцию «Edit price» / Изменить цену) вы должны добавить метаданные. Возможно, вам потребуется нажать на «Additional options» (Дополнительные опции) во время создания цены, чтобы открыть поля метаданных.
  • Нажмите + Add metadata (Добавить метаданные) и введите следующее:
    • КЛЮЧ: group_name
    • ЗНАЧЕНИЕ: Уникальный, безопасный для URL слаг/обработчик (slug/handle) группы из Discourse, не её полное имя.

Пример:

  • Если полное имя вашей группы в Discourse — «Enclave Plus», её слаг, скорее всего, EnclavePlus.
  • В качестве значения вы должны использовать EnclavePlus. Использование "Enclave Plus" с пробелом приведет к ошибке.
  • Вы должны повторить это для каждого тарифного плана, который вы хотите связать с группой.

3. Создание таблицы цен Stripe

  • Перейдите в раздел Products (Продукты) > Pricing tables (Таблицы цен).
  • Создайте новую таблицу и добавьте настроенные вами цены.
  • После публикации таблицы нажмите кнопку «Copy code» (Копировать код), чтобы получить ID таблицы цен (он начинается с prctbl_...).

4. Настройка конечной точки вебхука (Исправление ошибки 404)
Это самая частая точка отказа.

  • Перейдите в раздел Developers (Разработчики) > Webhooks и нажмите + Add endpoint (Добавить конечную точку).
  • URL конечной точки должен быть в следующем формате: https://your-discourse-site.com/s/hooks
  • Примечание: Правильный путь — /s/hooks, а не /s/stripe/webhook.
  • В разделе Events to send (События для отправки) добавьте как минимум:
    • checkout.session.completed
    • customer.subscription.deleted
  • Создайте конечную точку и скопируйте Signing secret (Секрет подписи) (он начинается с whsec_...).

Часть 2: Настройка Discourse

Теперь настроим плагин для использования всего, что вы создали в Stripe.

1. Ввод API-ключей и ID таблицы цен

  • Перейдите в Admin (Админ) > Settings (Настройки) и найдите discourse subscriptions.
  • Заполните ваши ключи Stripe в режиме Live:
    • discourse subscriptions public key (pk_live_...)
    • discourse subscriptions secret key (sk_live_...)
    • discourse subscriptions webhook secret (whsec_...)
  • Включите режим таблицы цен:
    • Установите флажок для discourse subscriptions pricing table enabled.
    • Вставьте ваш ID prctbl_... в поле discourse subscriptions pricing table id.

2. Связывание продуктов Stripe с группами Discourse
Даже при использовании таблицы цен вам нужно сообщить Discourse, какая группа относится к какому продукту.

  • Перейдите в Admin (Админ) > Plugins (Плагины) > Subscriptions (Подписки) и откройте вкладку Products (Продукты).
  • Нажмите Create New Product (Создать новый продукт).
  • Введите Название продукта, которое точно совпадает с названием продукта в Stripe (например, Enclave Plus).
  • Сохраните продукт. На странице продукта прокрутите вниз и нажмите Add New Plan (Добавить новый план).
  • Этот план является лишь «мостом». Единственное критическое поле — User Group (Группа пользователей).
    • Plan Nickname (Название плана): Enclave Plus Group Link (или любое другое для вашей справки).
    • User Group (Группа пользователей): Выберите нужную группу Discourse из выпадающего списка.
    • Остальные поля (Amount, Interval) можно оставить по умолчанию, так как они будут игнорироваться.
  • Сохраните план. Повторите это для всех ваших различных продуктов.

Сводка по устранению неполадок

  • Проблема: Вебхуки завершаются ошибкой 404 Not Found.
    • Решение: URL вашей конечной точки в Stripe указан неверно. Он должен быть https://your-discourse-site.com/s/hooks.
  • Проблема: Вебхук успешен (200 OK), и оплата отображается в профиле биллинга пользователя, но он не добавлен в группу.
    • Решение: Ваши метаданные указаны неверно. Проверьте три вещи:
      1. Метаданные должны быть на объекте Stripe Price (Цена), а не на объекте Product (Продукт).
      2. КЛЮЧ метаданных должен быть точно group_name.
      3. ЗНАЧЕНИЕ метаданных должно быть уникальным слагом/обработчиком (slug/handle) группы (например, EnclavePlus), а не её полным именем с пробелами.

Надеюсь, это руководство сэкономит время и нервы другим пользователям при настройке этого сложного, но очень мощного решения.}

5 лайков

Я только что протестировал это, и всё прошло отлично! Мы обновим исходную документацию, чтобы включить эту информацию!

4 лайка

В документации отсутствует именно этот ключевой момент. Указываю на это, так как вы процитировали другую часть.

2 лайка

Есть ли способ автоматически установить дату привязки с помощью этого? Если кто-то совершает оплату, мне приходится вручную корректировать период подписки, чтобы для каждого пользователя в Stripe он сбрасывался на 1-е число месяца.

В документации Stripe указано, что это можно сделать через API при оформлении заказа, но у нас в плагине сейчас нет возможности внести такие изменения.

Переношу это в новую тему, так как обсуждение может стать длинным по мере моих обновлений.

3 лайка

:partying_face: Этот плагин теперь включен в ядро Discourse как часть Bundling more popular plugins with Discourse core. Если вы размещаете Discourse самостоятельно и используете этот плагин, вам нужно удалить его из файла app.yml перед следующим обновлением.

2 лайка

Как мне удалить его из ядра перед обновлением? Ведь я буду использовать форк плагина, который я доработал.

3 лайка

Что-то вроде

rm -rf discourse-subscriptions

Перед git clone.

3 лайка

Извините, я не понял. Во время пересборки будет извлечён код этого встроенного плагина и он будет собран — всё в один шаг, верно?

Я не тестировал это, но я почти уверен, что это сработает:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - rm -rf discourse-subscriptions
          - git clone https://github.com/yourForkUser/discourse-subscriptions

Поскольку это выполняется из директории плагинов, команда удалит discourse-subscriptions, который теперь включён в ядро, и заменит его на тот, который вы всегда использовали. Таким образом, добавление просто rm -rf в ваш app.yml перед git clone (для этого или любого другого плагина, который вы не хотите включать или который хотите заменить) должно сделать то, что нужно, и заменить плагин ядра на ваш форк.

6 лайков

Хорошо, когда говорят, что плагин X теперь является частью ядра, это означает лишь то, что плагин будет включён по умолчанию в репозиторий ядра в каталоге плагинов, и нам не нужно будет подгружать этот код отдельно. Понятно. Структурно ничего не меняется.

1 лайк

Если сейчас это упаковано заранее, потеряю ли я все данные в версии плагина? Мне придется настраивать всё заново, или они сохранятся?

Данные не будут потеряны. Просто удалите строку из app.yml, и плагин продолжит работать как прежде.

1 лайк

Ожидается ли такое поведение, что после ввода кода купона общая сумма подписки не обновляется сразу?

Протестировано на Discourse 3.5.0.beta8-dev

Я заметил, что если пользователь пытается зарегистрироваться, но оплата не проходит, запись в таблице discourse_subscriptions_customer, связывающая его с идентификатором клиента в Stripe, удаляется. Не уверен, что это поведение намеренное, но в любом случае оно нежелательно, так как приводит к появлению в Stripe «сиротских» клиентов, которые приходится удалять вручную. Кроме того, при повторной попытке создаются дубликаты клиентов, что может негативно сказаться на нашей отчётности.

3 лайка

Есть ли способ сбросить кампанию? Я надеялся на ежемесячную цель по сбору пожертвований, но начался новый месяц, и я не вижу возможности сбросить её до нуля для новой ежемесячной цели.

1 лайк

Мне бы очень хотелось увидеть этот плагин в действии на сайте. Не найдётся ли кого-нибудь, кто поделится ссылкой на свой форум, использующий плагин «Подписки»? Спасибо!