web-dev-qa-db-ja.com

ストライプ:「期末」でユーザーをダウングレードする

すぐにではなく、期末にユーザーをダウングレードすることは可能ですか? API Docs をくまなく調べましたが、これを実現する方法を理解できませんでした。

回避策として、現在、ユーザーのサブスクリプションをすぐにキャンセルしてから、より少ないサブスクリプションにサブスクライブし、月末まで試用しています。ただし、これは機能しません。期間が終了するまでダウングレードを遅らせる必要があります(ただし、ダウングレードが要求されたときにStripeを使用して「記録」します)。

明らかに、Webhookコールバックを使用して、ユーザーサブスクリプションをローカルで追跡することによってこれを実現する方法がありますが、可能であればそれを避けたいと思います。


[〜#〜]編集[〜#〜]

誰かが尋ねる前に-私はTembooのPHP SDKを使用しています。しかし、私は言語固有のアプローチを探しているのではなく、高レベルのハウツー(可能であれば)を探しています。

41
Madbreaks

@Safinnと@Martinが述べたように、at_period_end: trueを使用してサブスクリプションをキャンセルし、特定の日付にキャンセルを実行できます。

別のプランにダウングレードするため、それを回避する方法は、上記を実行してから、同じ日時に終了する新しいプランの無料トライアルを作成することです。このようにして、古いプランは新しいプランの試用期間が終了するのと同じ日にキャンセルされます(アクティブになるため)。

これにより、Stripeは、データベースでWebhookを設定したり日付を追跡したりするのではなく、ダウングレードを完全に処理できます(これはより簡単なIMHOである必要があります)。

12
SneakAttaack

はい、StripeAPIの最新バージョンを使用しています。

(TembooのSDKで使用しているStripeトークンは、Stripeの通常のPHPライブラリ)と互換性があります。

  • 複数の料金プランで製品を作成する
  • これらのプランIDのいずれかに顧客をサブスクライブします
  • 顧客を新しいプランに更新するときは、次のようにするだけです。

    $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に効果的に伝えます。

現在の請求が終了する日(期間終了時にキャンセル)までこのユーザーに請求しないでください。プランスイッチで返金せず(按分)、現在の請求サイクルの終了時に請求を再開してください(試用終了)。

これは、古いプランが終了したときに請求を新しいプランに変更する効果があります。

8
Garet Claborn

ユーザーがいつプランに参加するかを追跡する必要があります。データベースのcustomer_idの横に日付フィールドを保持します。この日付を使用して、参加した月の日、つまり請求サイクルを決定できます。請求日がその月の31日である場合、それより短い月では、Stripeはそれらの月の最終日に請求します( https://support.stripe.com/questions/subscription-date-at-end-of -月 )。

これで、ユーザーがダウングレードを希望する場合、ログイン時にWebサイトでアクションを完了します。このダウングレード要求をメモしてに保存し、データベースで「stripe_actionable_table」と呼びましょう。このテーブルに含める重要なフィールドは次のとおりです。

  • actionable_date(Stripeリクエストをアクションする日付-上記のように短い月を決定するためのロジックが必要になります)
  • stripe_customer_id
  • what_to_do(アップグレード/ダウングレード/キャンセル)
  • change_plan_to(プランID-キャンセル要求の場合はnullになる可能性があります)

次に、特定の時間に毎日実行され、このstripe_actionable_tableをチェックし、月の日がテーブルの行と一致する場合は、Stripeリクエストを実行するcronを作成します。完了したら、行を削除するか、削除済みとしてマークできます。

4
Martin

これは、Stripeの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 willアクティブなプランの独自の表現を更新することに注意してくださいすぐに(ユーザーの課金のみが延期されます)。したがって、独自のアプリケーション内からアクティブなプラン変更の遅延を手動で管理する必要があります。

3
Tom G

Stripeは最近、この問題を解決するサブスクリプションスケジュールを導入しました: https://stripe.com/docs/api/subscription_schedules

1
Reinhard Höll

Stripeで簡単にそれを行う方法はないようです。

計画を変更するのではなく、数量を更新していますが、このアイデアも適用できます。

考えられる解決策は次のとおりです。

  1. Stripeを使用して、按分せずにサブスクリプション数量を更新します。

  2. invoice.createdイベントまで前の数量を保持します。

  3. invoice.createdイベントを処理するときは、以前の数量をユーザーがサブスクライブしている数量と比較し、必要に応じて減らします。

0
Gyrocode.com

これが私のやり方です。

現在の請求期間に従って終了する既存のサブスクリプションをキャンセルしただけです。また、キャンセル時に、要求されたダウングレードされた顧客のプランIDをローカルユーザーテーブルに保存しました。

次に、ストライプ内でcustomer.subscription.deletedのWebhookを設定し、ローカルユーザーテーブルから保存されたダウングレードプランを選択し、それを使用してすぐに新しいサブスクリプションを作成するハンドラーを作成しました。

0
Rohan Sharma