Вы правильно настроили вебхуки? Помню, что их настройка была довольно запутанной, а инструкции могли бы быть немного понятнее.
Да, вебхуки настроены отлично, именно так ответ и возвращался.
Я выяснил проблему. В инструкциях отсутствует пункт о необходимости настроить пользовательские теги с именем группы, которую нужно продвигать, на странице конфигурации цены в Stripe.
У меня теперь всё работает отлично. Плагин отличный, но документация недостаточно подробная.
Можете немного подробнее объяснить это, чтобы мы могли попросить кого-то обновить документацию? Какой пользовательский тег вы добавили и куда именно его добавили?
[Гайд] Настройка подписок 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.completedcustomer.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) можно оставить по умолчанию, так как они будут игнорироваться.
- Plan Nickname (Название плана):
- Сохраните план. Повторите это для всех ваших различных продуктов.
Сводка по устранению неполадок
- Проблема: Вебхуки завершаются ошибкой
404 Not Found.- Решение: URL вашей конечной точки в Stripe указан неверно. Он должен быть
https://your-discourse-site.com/s/hooks.
- Решение: URL вашей конечной точки в Stripe указан неверно. Он должен быть
- Проблема: Вебхук успешен (
200 OK), и оплата отображается в профиле биллинга пользователя, но он не добавлен в группу.- Решение: Ваши метаданные указаны неверно. Проверьте три вещи:
- Метаданные должны быть на объекте Stripe Price (Цена), а не на объекте Product (Продукт).
- КЛЮЧ метаданных должен быть точно
group_name. - ЗНАЧЕНИЕ метаданных должно быть уникальным слагом/обработчиком (slug/handle) группы (например,
EnclavePlus), а не её полным именем с пробелами.
- Решение: Ваши метаданные указаны неверно. Проверьте три вещи:
Надеюсь, это руководство сэкономит время и нервы другим пользователям при настройке этого сложного, но очень мощного решения.}
Я только что протестировал это, и всё прошло отлично! Мы обновим исходную документацию, чтобы включить эту информацию!
В документации отсутствует именно этот ключевой момент. Указываю на это, так как вы процитировали другую часть.
Есть ли способ автоматически установить дату привязки с помощью этого? Если кто-то совершает оплату, мне приходится вручную корректировать период подписки, чтобы для каждого пользователя в Stripe он сбрасывался на 1-е число месяца.
В документации Stripe указано, что это можно сделать через API при оформлении заказа, но у нас в плагине сейчас нет возможности внести такие изменения.
Переношу это в новую тему, так как обсуждение может стать длинным по мере моих обновлений.
Этот плагин теперь включен в ядро Discourse как часть Bundling more popular plugins with Discourse core. Если вы размещаете Discourse самостоятельно и используете этот плагин, вам нужно удалить его из файла app.yml перед следующим обновлением.
Как мне удалить его из ядра перед обновлением? Ведь я буду использовать форк плагина, который я доработал.
Что-то вроде
rm -rf discourse-subscriptions
Перед git clone.
Извините, я не понял. Во время пересборки будет извлечён код этого встроенного плагина и он будет собран — всё в один шаг, верно?
Я не тестировал это, но я почти уверен, что это сработает:
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 (для этого или любого другого плагина, который вы не хотите включать или который хотите заменить) должно сделать то, что нужно, и заменить плагин ядра на ваш форк.
Хорошо, когда говорят, что плагин X теперь является частью ядра, это означает лишь то, что плагин будет включён по умолчанию в репозиторий ядра в каталоге плагинов, и нам не нужно будет подгружать этот код отдельно. Понятно. Структурно ничего не меняется.
Если сейчас это упаковано заранее, потеряю ли я все данные в версии плагина? Мне придется настраивать всё заново, или они сохранятся?
Данные не будут потеряны. Просто удалите строку из app.yml, и плагин продолжит работать как прежде.
Ожидается ли такое поведение, что после ввода кода купона общая сумма подписки не обновляется сразу?
Протестировано на Discourse 3.5.0.beta8-dev
Я заметил, что если пользователь пытается зарегистрироваться, но оплата не проходит, запись в таблице discourse_subscriptions_customer, связывающая его с идентификатором клиента в Stripe, удаляется. Не уверен, что это поведение намеренное, но в любом случае оно нежелательно, так как приводит к появлению в Stripe «сиротских» клиентов, которые приходится удалять вручную. Кроме того, при повторной попытке создаются дубликаты клиентов, что может негативно сказаться на нашей отчётности.
Есть ли способ сбросить кампанию? Я надеялся на ежемесячную цель по сбору пожертвований, но начался новый месяц, и я не вижу возможности сбросить её до нуля для новой ежемесячной цели.
Мне бы очень хотелось увидеть этот плагин в действии на сайте. Не найдётся ли кого-нибудь, кто поделится ссылкой на свой форум, использующий плагин «Подписки»? Спасибо!
