Тихие сбои подписок в плагине Subscriptions

Плагин: discourse-subscriptions Версия: Последняя (подтверждено, что актуальна) Версия Discourse: 3.5.4

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

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

  1. У клиента в профиле Stripe сохранена просроченная карта.

  2. Клиент пытается оформить подписку или обновить способ оплаты.

  3. Плагин создает PaymentIntent, но не передает данные новой карты в Stripe.

  4. Транзакция завершается с ошибкой resource_missing или payment_intent_incompatible_payment_method.

Логи ошибок Stripe:

resource_missing: У данного клиента нет прикрепленных источников оплаты или способа оплаты по умолчанию.

payment_intent_incompatible_payment_method: Ожидается наличие способа оплаты типа card, но у этого PaymentIntent нет способа оплаты, и он не был предоставлен.

Что подтвердил Stripe:

  • Аккаунт Stripe находится в хорошем состоянии, проблем с их стороны нет.

  • PaymentIntents создавались без привязанного способа оплаты.

  • Плагин в некоторых случаях передает объект card_, а не объект способа оплаты pm_ — в текущем API Stripe эти объекты не взаимозаменяемы.

Дополнительный контекст:

  • Это происходит примерно 2 раза в месяц в сообществе с ~18 000 активных участников.

  • Плагин является встроенным и не может быть изменен на уровне хостинга (подтверждено в Communiteq).

  • Обычная оплата проходит корректно; сбой возникает именно тогда, когда у клиента на файле есть устаревшая/просроченная карта и он пытается совершить новую оплату.

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

Запрос: Исправление передачи способа оплаты, когда существующая карта клиента просрочена или недействительна, чтобы ввод новой карты корректно генерировал объект способа оплаты pm_, который правильно прикреплялся к PaymentIntent перед отправкой.

1 лайк

Спасибо за отчет об ошибке, Тодд!

Я перенес его сюда в Contribute > Bug, где он, надеюсь, получит должное внимание.

2 лайка