2

У меня есть веб-сервис, который публикует и размещает определенную информацию для моих пользователей. Интерфейс редактирования каждого пользователя отделен от информации, которую они опубликовали. Я рассчитываю на это с помощью подписки на Stripe, но у меня возникают проблемы с возможностью работы с неоплачиваемыми подписками. Вот логика, которую я хочу реализовать:Возобновление подписки с помощью Stripe (и взимание платы за ранее неоплаченный сервис)

  1. После первой неудачной попытки выставления счета мое приложение должно заблокировать интерфейс редактирования пользователя; вместо этого он должен предоставить им страницу с вариантами решения проблемы с платежами. Тем не менее, информация, которую они опубликовали, все равно будет опубликована, поэтому просроченная оплата не прерывает работу своих посетителей.
  2. После последней неудачной попытки оплаты, через 15 дней, мое приложение также должно удалить информацию, которую они опубликовали. На этом этапе интерфейс редактирования пользователя заменяется на тот, который позволяет им либо повторно активировать свою учетную запись с помощью новой кредитной карты, либо полностью удалить учетную запись.
  3. Если пользователь решает активировать учетную запись, они не должны получать пробный период
  4. Если пользователь повторно активируется, им также необходимо заплатить за 15 дней, которые они ранее пропустили, либо имея их первый период выставления счетов сократился на 15 дней или с использованием заряда, равного 15-дневной службе, добавленной к их первому счету.

# 1 и # 2 очень легко осуществить, если я наблюдаю за право webhooks-просто перенаправить запросы на провинившегося клиента, или клиент с удаленной или неоплачиваемый подписки на «решить эту проблему» страницы , # 3 тоже довольно просто - просто создайте подписку с trial_end, установленной на now.

Это # 4, это сложно. Как точно определить, сколько времени последний счет пользователя остался неоплаченным до отмены подписки? Как сократить первый период оплаты новой подписки? В качестве альтернативы, как мне оценить процентную ставку последнего счета-фактуры клиента, чтобы представить часть, которую я им фактически предоставил, поэтому я могу добавить эту сумму к новому счету? (Я знаю, что могу создать элемент счета, чтобы взимать плату до начала новой подписки, поэтому, по крайней мере, это возможно.)

Наконец, опция Strip «Отметить подписку Неоплачиваемый» поможет с этим? Похоже, что он продолжает создавать счета-фактуры, но не пытается их взимать; Я не думаю, что это то, чего я хочу здесь.

ответ

3

Вы можете определенно сделать все это с подписками Stripe. Как вы упомянули, первые два вопроса должны быть решены с помощью webhooks. Вы будете слушать invoice.payment_failed на своем конце, чтобы обнаружить, когда платеж не удался, и немедленно заблокировать пользовательский интерфейс, чтобы ваш клиент обновил данные своей карты.

Чтобы обновить данные своей карты, вы можете использовать Stripe Checkout и просто не устанавливать параметр data-amount, чтобы он не отображал цену для вашего клиента. Вот пример для этого:

<form action="/charge" method="POST"> 
    <script 
    src="https://checkout.stripe.com/checkout.js" class="stripe-button" 
    data-key="pk_test_XXXX" 
    data-image="/square-image.png" 
    data-name="Demo Site" 
    data-description="Update Card Details" 
    data-panel-label="Update Card Details" 
    data-label="Update Card Details"> 
    </script> 
</form> 

Каждый раз, когда клиент пытается обновить свою карту, вы должны использовать Update Customer API и передать новый маркер карты в параметре card. Это удалит карточку по умолчанию для клиента и заменит ее на новую. Он также попытается заплатить последний счет за каждую подписку в состоянии «Прошлое». В вашем случае это означает, что последний счет-фактура, все еще находящийся в режиме повтора, будет предпринят для оплаты. Это не считается повторением и может рассматриваться как независимое. Если это удастся, вы просто заново активируете пользовательский интерфейс, иначе вы продолжаете просить клиента обновить данные своей карты.

Когда вы достигнете четвертого неудачного платежа, вы получите customer.subscription.canceled, если это то, что вы настроили в настройках повтора в dashboard. Вы можете обнаружить, что это автоматическое отмена, проверив ключ request на мероприятии и убедившись, что это null. В этом случае вы полностью блокируете пользовательский интерфейс/учетную запись для своего клиента.

В течение последних 15 дней, если я правильно понял ваш поток, клиент не смог использовать ваше приложение, так как частично заблокировал пользовательский интерфейс. Но если вы все еще хотите, чтобы он заплатил за эту сумму, вы должны сохранить в своей базе данных, что клиент должен вам $ X за 15 дней, которые он не мог использовать для подписки.

Позже ваш клиент, наконец, вернется и захочет повторно использовать его учетную запись. В этот момент вы сообщите ему, что платежный поток начнет с сегодняшнего дня и, что вы будете взимать с него плату за дополнительные 15 дней, которые он пропустил раньше. Для этого я бы использовал Invoice Items, который позволит вам добавить дополнительную сумму к первому счету автоматически. Вы бы выполнили следующие этапы:

  1. Create пункт счета за $ X для вашего клиента.
  2. Create новая подписка на ваш план настройки trial_end до "now" в случае, если у вас есть пробный период, установленный по умолчанию в вашем плане.
  3. Это автоматически создаст первый счет-фактуру для суммы плана и добавит элемент счета, созданный ранее.

Другим решением здесь будет повторное открытие их последнего закрытого счета-фактуры, который не был оплачен, и использовать Pay Invoice API. Когда это произойдет, вы знаете, что ваш клиент заплатил вам целый месяц, а не только за 15 дней, которые он вам должен. В этом случае вы создадите новую подписку и установите пробный период в 15 дней, чтобы он снова начал платить после этого судебного разбирательства.

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

Сумма, которую ваш клиент действительно должен вам в этом случае, зависит от количества повторных попыток и дней между каждой попыткой. Здесь вы можете использовать значение created в счете-фактуре и сравнить его с текущим временем, когда вы получите customer.subscription.canceled, чтобы определить, сколько времени прошло и рассчитать оценку того, насколько ваш клиент должен вам в этот момент.