Мы выполнили возврат средств на своём собственном аккаунте, чтобы проверить, правильно ли обращается книга. Так и было. Затем кто-то прочитал остальное состояние аккаунта, и там была настоящая находка: план по-прежнему был активен и оставался бы таким до середины следующего месяца.
Деньги обратно, доступ сохранён. Повторяемо каждый месяц кем угодно, готовым нажать «Вернуть деньги». Это нашёл не тест, потому что ни один тест не задавал этого вопроса.
Завершение периода, купленного платежом
При полном возврате период, открытый этим платежом, теперь завершается немедленно, и событие жизненного цикла фиксирует почему.
Немедленно — но не в никуда. Если вы были на плане, апгрейднулись на более дорогой, и платёж за апгрейд возвращается, вы возвращаетесь к плану, на котором были, а не к бесплатному уровню. Тот месяц вы оплатили отдельно, и он не был возвращён. Забрать и его — значило бы, что платформа берёт себе то, чем клиент всё ещё владеет. Только тот, у кого нет ещё активного прежнего плана, падает на бесплатный.
У права доступа две половины
Первая версия этого исправления завершала строку подписки и на этом останавливалась. Но то, на что вы имеете право, зависит от двух вещей: строки, которую читает бюджет, и роли, выданной при успешном платеже. Любой другой путь, завершающий подписку, явно снимает эту роль. Этот не снимал, так что возвращённый аккаунт был бы отменён на бумаге, сохраняя разрешения платного уровня.
Теперь роль тоже снимается, и приземляется на уровень восстановленного плана, а не на общий «бесплатный» — то же рассуждение, что и само восстановление.
Уведомление провайдера
Страница аккаунта гласила «Бесплатный уровень». Панель провайдера платежей гласила «Активен, следующее списание в следующем месяце». Возврат завершил дела с нашей стороны и никогда не уведомил другую сторону, так что клиент стоял в очереди на повторное списание за план, за который был возвращён и который больше не мог использовать — и не имел способа остановить это с наших экранов, потому что отмена требует активной подписки, а мы только что отменили его.
Возврат теперь останавливает автопродление у провайдера, выпустившего платёж. Не немедленное прекращение: автопродление останавливается, так что деньги больше не двигаются, а собственная запись провайдера истекает по своему графику, а не выдёргивается из-под возврата, который он только что обработал.
С одним исключением, которое владелец заметил до выпуска. Если план, к которому вы восстановлены, работает на той же подписке провайдера, отмена оставила бы вас с планом, который никогда не продлевается и никогда не списывает — точное зеркальное отражение бага, для исправления которого это существует, и такое же тихое. Этот случай теперь явно назван и оставлен нетронутым.
Только платёж, открывший период, может его завершить
Апгрейд в середине месяца у этого провайдера списывает небольшую пропорциональную разницу поверх существующей строки. Возврат этого небольшого списания нашёл бы подписку, отменил бы всё, поискал бы предыдущий план, не нашёл бы его и уронил бы клиента на бесплатный — из-за корректировки в середине месяца. Теперь только платёж, открывший текущий период, может его завершить. Всё позже — вопрос денег, и книга на него уже ответила.
Все четыре канала, а не только активный
У трёх из четырёх процессоров платежей, которые мы поддерживаем, сегодня никого нет. Отзыв можно было бы исправить только на активном, и это чуть не произошло. Возражение, изменившее это: в день, когда один из остальных снова активируют, дыра вернётся, а к тому времени никто не вспомнит, что она вообще была.
Этот репозиторий уже поставлял один и тот же класс забытой ловушки шесть раз. Отзыв теперь живёт за единым контрактом, который все четыре процессора вызывают одной строкой — так что будущий сопровождающий, снова активируя один из них, получает это, не читая ничего из вышесказанного.