Подписки: Данные удалены в Stripe, теперь ошибки плагина

Привет,

Я сейчас тестирую этот плагин для будущего использования на своём экземпляре и столкнулся с проблемой.

Мой аккаунт Stripe новый и не верифицирован, поэтому он использует тестовые данные, которые я могу удалить в панели Stripe > Разработчики.
Проблема в том, что удаление данных в Stripe не удаляет те же данные на экземпляре форума. Это может привести к сбою страницы «Счёт > Оплата» пользователя.

Шаги для воспроизведения

  1. Создайте план подписки.
  2. Подпишитесь на план пользователя. Stripe выдаст ему customer_id, например cus_abcd1234567890.
  3. Очистите данные в панели Stripe.
  4. Повторная попытка открыть страницу оплаты пользователя приведёт к сбою при загрузке /s/user/payment. В консоли веб-браузера появится следующий текст ответа:
    {\"errors\":[\"No such customer: 'cus_abcd1234567890'\"]}

Изучив базу данных моего экземпляра, я обнаружил старые данные от нескольких очисток в следующих таблицах:

  • discourse_subscriptions_customers: вызывает сбой на странице оплаты пользователя.
  • discourse_subscriptions_products
  • discourse_subscriptions_subscriptions

Последние две таблицы, похоже, не вызывают сбоев. Однако они всё ещё содержат устаревшие данные.

Ручное удаление проблемной строки (строк) в discourse_subscriptions_customers исправляет сбой у пользователя. Но выполнять это через SQL-запрос сложно и опасно, особенно для неопытных пользователей.

Также стоит отметить, что эта проблема не возникает при ручном удалении информации о пользователе из панели Stripe. Stripe всё ещё хранит архивные данные о нём и помечает его как «навсегда удалённого».

Предлагаемые решения

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

Или

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

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

rails c
DiscourseSubscriptions::Customer.destroy_all
DiscourseSubscriptions::Products.destroy_all
DiscourseSubscriptions::Subscriptions.destroy_all

Это сбросит все локальные модели, которые используются для сравнения со Stripe.

Моя рекомендация на будущее: удаляйте данные в Discourse, а не в Stripe. Если записей моделей не существует в Discourse, данные из Stripe не будут подтягиваться.

Спасибо за предложение. Я протестировал, и всё работает, кроме небольшой опечатки: в конце ::Product и ::Subscription нет буквы s. Иначе они не находятся.

Исправленные команды:

rails c
DiscourseSubscriptions::Customer.destroy_all
DiscourseSubscriptions::Product.destroy_all
DiscourseSubscriptions::Subscription.destroy_all

Вы правы — моя ошибка!