Подтвердить что ты не робот

Stripe: переключение пользователя на "конец периода"

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

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

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


ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Да, используется более свежая версия Stripe API.

(токены Stripe, которые вы можете использовать в Temboo SDK, совместимы с обычной библиотекой PHP Stripe)

  • Создать продукт с несколькими тарифными планами
  • Подписаться клиента на один из этих плановых идентификаторов
  • При обновлении клиента до нового плана просто сделайте следующее:

    $sub = $myUser->data['stripe_subscription_id'];
    $subscription = \Stripe\Subscription::retrieve($sub);
    \Stripe\Subscription::update($sub, [    
        'cancel_at_period_end' => false,
        'items' => [
            [
                'id' => $subscription->items->data[0]->id,
                'plan' => $plan,
            ],
        ],
        'prorate' => false,
        'trial_end' => $subscription->current_period_end
    ]);
    $subscription->save();
    

Установив prorate на false, trial_end на $subscription->current_period_end и cancel_at_period_end на false, вы фактически скажете Stripe:

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

Который имеет эффект изменения их выставления счета на новый план, когда их старый план заканчивается.

Ответ 3

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

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

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

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

Ответ 4

Теперь это возможно с помощью prorate флага.

Например

$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 значение false, вы фактически говорите Stripe не применять изменение плана до конца текущего периода.

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

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

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

Ответ 5

Кажется, что нет способа сделать это легко с помощью Stripe.

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

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

  • Обновить количество подписки без рекламы с помощью Stripe.

  • Сохраняйте предыдущее количество до события invoice.created.

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

Ответ 7

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

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

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