Полоса - понижение в конце периода, используя графики - PullRequest
0 голосов
/ 29 марта 2020

Я хочу понизить рейтинг клиента в конце текущего периода. Когда это произойдет. Мне известен способ установки пробного окончания на конец текущего периода и установки proration_behavior на none, и, наконец, настройки веб-крюка для прослушивания subscription.deleted и создания новой подписки 1 * 1005. * 2 . Я пытаюсь найти способ не использовать webhooks, чтобы Stripe управлял переключателем на их стороне.

Я думаю, что это как-то достижимо при использовании расписаний подписки .

I имейте в виду следующее, но я еще не пробовал, и я хотел бы сначала получить мнения:

// create schedule if it doesn't exist
let schedule: Stripe.SubscriptionSchedule;
if (!stripeSubscription.schedule) {
  schedule = await this.stripe.subscriptionSchedules.create({
    from_subscription: stripeSubscription.id,
  });
} else {
  schedule = await this.stripe.subscriptionSchedules.retrieve(stripeSubscription.id);
}

await this.stripe.subscriptionSchedules.update(schedule.id, {
  end_behavior: 'release',
  phases: [
    {
      plans: [{plan: stripeSubscription.items.data[0].plan.id}],
      end_date: stripeSubscription.current_period_end,
    },
    {
      proration_behavior: 'none',
      collection_method: 'charge_automatically',
      plans: [{plan: replacementPlanId}],
      end_date: stripeSubscription.current_period_end
    },
  ],
});

Приведенное выше создаст график, если он не существует, а затем обновит этот график понизить план. Я не уверен, сработает ли окончание второго этапа, возможно, мне нужно добавить день, чтобы быть уверенным. Или просто ничего не устанавливайте, и пусть расписание будет выполнено, но мне интересно, если первая фаза будет удалена, когда она закончится, в противном случае, когда в следующий раз клиент переключит план снова, он может не включить новую план в массиве. Я мог бы go обойти это, сделав следующее:

phases: [
  ...schedule.phases.filter(phase => phase.end_date > Date.now() / 1000).map((phase, index, array) => {
    if (array && array.length -1 === index && !phase.end_date) {
      phase.end_date = stripeSubscription.current_period_end;
    }
    return {
      plans: phase.plans,
      end_date: phase.end_date,
    };
  }),
  {
    proration_behavior: 'none',
    collection_method: 'charge_automatically',
    plans: [{plan: replacementPlanId}],
    end_date: stripeSubscription.current_period_end,
  },
],```
...