Stripe を使うとサブスクリプションの決済が楽にできます。
サービスにおいてサブスクリプションを開始する際、トライアルをつける場合や、決済日を月初に固定したい場合などがあります。
サブスクリプションの開始パターンの取り方としては下記の方法があると思います。
- トライアル期間の有無
- 固定決済日の有無
- 日割り決済の有無
上記の選択肢で6パターンのSubscription作成パターンが存在することになります。
が、トライアル終了後に日割りなしでその月の金額を請求するということは、その月の決済タイミングまででトライアルが実質終了していることになるので省かれます。
そのため、 5パターンについてRuby での例でコードを記述します。
API ドキュメントは上記をご参照ください
固定決済日なし、トライアルあり
よくあるサブスクリプションサービスのパターンだと思います。
トライアルが一月(30日)あって、その後、登録日を基準に毎月決済されるパターンです。
これは、trial_end
オプションを指定するだけです。
Stripe::Subscription.create({
customer: STRIPE_CUSTOMER_ID,
items: [
{ price: STRIPE_PRICE_ID },
],
trial_end: TRIAL_END_DATETIME,
})
固定決済日なし、トライアルなし
フリーミアムモデルで、途中から有料プランに切り替える場合はトライアル無く、サブスクリプション開始時から決済が発生する形になると思います。
これは trial_end
を指定しません。
明示的にオプション指定する場合は trial_end: 'now'
とします
Stripe::Subscription.create({
customer: STRIPE_CUSTOMER_ID,
items: [
{ price: STRIPE_PRICE_ID },
],
})
固定決済日あり、日割り決済あり、トライアルあり
決済を固定したいケースもあると思います。
決済タイミングが固定されていないと、ユーザーはいつ決済が行われるかわかりにくくなってしまいますが、月初に揃えるなどするとわかりやすくなります。
決済日を指定する場合は billing_cycle_anchor
オプションを使用して決済日を指定します。
また、トライアルを含む場合、トライアル終了後に次の決済日(billing_cycle_anchor
)までの残り日数を元に日割りの決済が行われます。
billing_cycle_anchor
は trial_end
より先の時間を指定する必要があります。
Stripe::Subscription.create({
customer: STRIPE_CUSTOMER_ID,
items: [
{ price: STRIPE_PRICE_ID },
],
trial_end: TRIAL_END_DATETIME,
billing_cycle_anchor: FIRST_BILLING_DATETIME,
})
固定決済日あり、日割り決済あり、トライアルなし
これは trial_end
を指定しません。
Stripe::Subscription.create({
customer: STRIPE_CUSTOMER_ID,
items: [
{ price: STRIPE_PRICE_ID },
],
billing_cycle_anchor: FIRST_BILLING_DATETIME,
})
固定決済日あり、日割り決済なし、トライアルなし
日割り決済をしない場合はオプションで prorate: false
を指定します。
このとき、最初の決済は billing_cycle_anchor
で指定した日時が初回の決済タイミングになります。
Stripe::Subscription.create({
customer: STRIPE_CUSTOMER_ID,
items: [
{ price: STRIPE_PRICE_ID },
],
billing_cycle_anchor: FIRST_BILLING_DATETIME,
prorate: false,
})
もし、サブスクリプション開始時に決済し、次回の決済タイミングを固定したい場合は無理矢理実現する必要があります。
billing_cycle_anchor
を最初は指定せず、Subscription を作成し、後から billing_cycle_anchor
を変更します。
ただ、 billing_cycle_anchor
を変更する場合、'now'
しか指定できません。
そのため、代替方法として、終了日が次回決済日になるトライアルを後から追加します。
stripe_subscription = Stripe::Subscription.create({
customer: STRIPE_CUSTOMER_ID,
items: [
{ price: STRIPE_PRICE_ID },
],
prorate: false,
})
Stripe::Subscription.update(stripe_subscription.id, trial_end: FIRST_BILLING_DATETIME, proration_behavior: 'none')