2013-05-29 1 views
25

Возможно ли понизить пользователя на конец периода, а не сразу? Я прочесал через API Docs, но не смог понять, как это сделать.Stripe: понизить пользователя в конце периода

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

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


EDIT

Перед кем спрашивает - я использую Temboo в PHP SDK. Тем не менее, я не ищу подход, ориентированный на язык, просто на высоком уровне (если это возможно).

+1

Я знаю, что вопрос старый, но я думаю, что любой, кто хочет это сделать, должен будет использовать веб-хосты и/или отслеживать вещи локально. Поскольку эта функция не существует автоматически в Stripe, у вас на самом деле нет способа ожидать, чтобы они запускали определенное поведение в определенный момент времени, не отслеживая что-то на своем конце и не обновляясь через API. –

+3

@CharlieS На самом деле, я думаю, что вполне разумно ожидать, что Stripe откроет эту функциональность. Значительный объем накладных расходов, необходимых для управления им с нашего конца. Я хотел бы сделать вызов API, который просит, чтобы пользователь был понижен до указанного плана в конце периода, и для Stripe для ping webhook, когда это произойдет. У них уже много времени, но почему? Это очень распространенный случай использования, я бы хотел, чтобы он поддерживался. – Madbreaks

ответ

4

Вы должны следить за тем, когда ваш пользователь присоединяется к плану - сохранить поле даты в своей базе данных рядом с customer_id. Вы можете использовать эту дату, чтобы определить день месяца, в который они присоединились, и, следовательно, цикл выставления счетов. Если платежный день - 31-е число месяца, то в более короткие месяцы полоса будет выставлена ​​на счет в последний день этих месяцев (https://support.stripe.com/questions/subscription-date-at-end-of-month).

Теперь, когда пользователь хочет понизить рейтинг, они завершают действие на вашем веб-сайте при входе в систему. Вы принимаете к сведению этот запрос на понижение и сохраняете его в a, давайте назовем его «stripe_actionable_table» в вашей базе данных. Важные поля, чтобы иметь в этой таблице будет:

  • actionable_date (дата для действия запроса полосы - вам потребуется какая-то логика, чтобы определить более короткие месяцы, как упоминалось выше)
  • stripe_customer_id
  • what_to_do (обновление/даунгрейд/отмена)
  • change_plan_to (план идентификатор - может быть пустым, если отменить REQ)

У вас тогда будет cron, который работает каждый день в определенное время и проверяет эту stripe_actionable_table, и если день месяца совпадает со строкой в ​​таблице, тогда выполните запрос Stripe. После завершения вы можете удалить или пометить строку как удаленную.

+7

Спасибо. Да, есть всевозможные способы, которыми это можно сделать, управляя делами на нашем конце - мой вопрос был, есть ли способ, которым я мог бы запросить, чтобы Stripe автоматически обрабатывала понижение в конце периода.Это такой распространенный сценарий, и в совокупности w/webhooks * может * быть настолько легким. Но так как ваш ответ (и наше решение) демонстрирует, что это большая проблема. – Madbreaks

+9

Как насчет отмены подписки с использованием параметра «at_period_end», установленного в TRUE. Затем настройте webhook, который может прослушивать события Stripe, чтобы вы могли обнаружить событие: «customer.subscription.deleted». Когда вы выбираете это, просто настройте клиента по более низкому тарифному плану. – Martin

+0

Другой способ - отслеживать в столбце «actionable event». Затем используйте webhook, когда пользователь оплачивает свой счет. Затем, когда они это сделают, посмотрите в таблицу, чтобы увидеть, нужны ли какие-либо изменения, а затем обработать их в это время ... –

0

Невозможно сделать это с помощью Stripe.

Я обновляю количество, а не изменяю планы, но идея может быть применена также.

Возможное решения:

  1. Обновления количество подписки без пропорционального распределения с полоской.

  2. Хранить предыдущее количество до invoice.created.

  3. При обработке invoice.created event, сравнить предыдущий размер, количество, на которое пользователь подписался и сократить при необходимости.

-1

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

https://stripe.com/docs/subscriptions/canceling-pausing

Я думаю, что вы можете обновить подписку и добавить at_period_end: true и что следует отменить в конце периода.

+1

Отмена! = Понижение. – Madbreaks

4

Как упомянули @Safinn и @Martin, вы можете отменить подписку, используя at_period_end: true, для отмены аннулирования в определенную дату.

Чтобы перейти к другому плану, то, как я обойдусь, это сделать выше, а затем создать бесплатную пробную версию нового плана, заканчивающегося на ту же дату/время. Таким образом, старый план будет отменен в тот же день, когда пробная версия нового плана закончится (в результате чего он будет активным).

Это позволяет Stripe обрабатывать понижение до конца своего конца (что должно быть более простым IMHO), вместо того, чтобы настраивать веб-камеры или даты отслеживания в вашей базе данных.

+0

Неплохая идея. Если я правильно понимаю вашу стратегию, подписка будет иметь два плана, пока первоначальный план не отменяется на конец периода? Когда это произойдет, подписка останется активной с планом, для которого пробный сеанс закончился одновременно? – dperjar

+0

Исправить. Мы используем его более 9 месяцев, и он отлично работает – SneakAttaack

+0

@SneakAttaack звучит неплохо. От разработчика полосы я получил это: «Я думаю, что будет сложнее обрабатывать, чем это звучит. Произвольные временные испытания - это общая боль, и вы никогда не получите абсолютно правильный цикл (это означает, что вы в конечном итоге с странным состоянием между двумя подписками). Моя честная рекомендация - ускорить обновление ». Моя главная забота - это состояние между двумя подписками. У вас были какие-то проблемы? – Montenegrodr

0

Это возможно с помощью флага Stripe's prorate.

E.g.

$subscription = \Stripe\Subscription::retrieve("sub_44ty4267H50z6c"); 
$itemID = $subscription->items->data[0]->id; 

\Stripe\Subscription::update("sub_44ty4267H50z6c", array(
    "items" => array(
    array(
     "id" => $itemID, 
     "plan" => "basic-plan", 
    ), 
), 
    "prorate" => false, 
)); 

Устанавливая prorate ложь, вы фактически говорить Stripe не применять изменения плана до окончания текущего периода.

Официальные документы здесь:

https://stripe.com/docs/subscriptions/upgrading-downgrading#disable-prorations

РАЗЪЯСНЕНИЕ (как на пользователя комментарий ниже): Обратите внимание, что Stripe будет обновлять свое собственное представление активного плана сразу (только зарядка пользователь откладывается), поэтому вам все равно придется вручную управлять задержкой активного изменения плана из вашего собственного приложения.

+1

4,5 года спустя, eesh. Спасибо – Madbreaks

+0

Вы только что протестировали это и установили prorate на false, это НЕ имеет эффекта, который вы указали относительно задержки изменения плана. Он по-прежнему меняет план и расходы немедленно. Единственное отличие заключается в том, что он не кредитует пользователя за неиспользованное время. Документация согласна с этим. – Paludis

+0

@Paludis задает вопрос «задержать понижение до конца периода (но« записать »его с полосой в момент запроса на понижение)». Флаг пропорциональности «записывает его с помощью полосы» немедленно, но обвиняет их в том, что понижение рейтинга было отложено. Как вы записываете * изменение плана * в своем собственном приложении, то до вас. Но я вижу, как формулировка в моем ответе может быть неверно истолкована. Сейчас обновится (дайте мне знать, если вы все еще считаете его неверным) –