blog2020-09-25【Stripe】サブスクリプションの支払いタイミングが特定日時においてズレる問題について(月末版)スタメンでエンジニアをしている田中です。今回は決済プラットフォームであるStripeのサブスクリプションを扱う際に遭遇した問題について、発生した事象とその原因、および対策方法についてご紹介します。本記事ではStripeのサブスクリプションについての詳細は説明いたしません。対策方法についてはRubyのコードで記載します。RubyでStripeのサブスクリプションを扱う場合については、以下の記事にて紹介しているのでよろしければご参照ください。以下の画像のように同じ日付でサブスクリプションを開始しましたが、2回目の支払いのタイミングがズレてしまうということがありました。そのため、ともに5月31日開始のサブスクリプションですが、前者については現在の期間の開始日が1日ズレてしまっています。2回目の支払いが7/1になっているケース2回目の支払いが6/30になっているケースそのため、例えば支払い成功時のWebhookにて何かしらの処理をする場合に、このズレによって影響が発生する可能性が大いに考えられます。発生原因Stripeのサポートに問い合わせたところ、「billing_cycle_anchorとタイムゾーンの関係による可能性が高い」とのことでした。ここで、billing_cycle_anchorについて説明します。billing_cycle_anchorとは支払い開始の起点となる日時のことです。毎月1日に決済したい場合、サブスクリプション作成時にbilling_cycle_anchorに翌月の1日を指定することで、毎月1日払いを実現することが出来ます。billing_cycle_anchorとなります。https://stripe.com/docs/billing/subscriptions/billing-cycle発生原因についての詳細は下記の通りです。Stripeのシステムは、UTC基準で動作する日本時間(JST)でサブスクリプションを作成する場合に、UTCの時刻から9時間の差があるそのため、UTC基準では月末だが、日本時間だと翌月と判定されてしまうため今回の問題が発生するこれだけだとよく分からないので、具体例を挙げて説明します。01:00:00どちらに関してもUTC基準だと翌月の支払いは6/30となっていますが、JSTに変換されると支払日に1日のズレが生じていることが分かります。これが今回発生した問題でした。上記のことから、日本時間において以下の日時にサブスクリプションが作成されると今回の問題が発生すると考えられます。午前0時から午前9時の間たとえば、以下のようなケースです。問題を解消するための方針として、以下の2つがあります。31日の0時から9時の間)でサブスクリプションを作成できないようにする特定日時でサブスクリプションを作成した場合、次回以降の支払い日時をずらす前者に関しては、特定日時ではサブスクリプション契約させないという方法なので、あまり現実的な方法ではありません。そこで、後者に関して説明します。(Stripeのサポートの方にオススメいただいた方法です)なお、設定にてUTC基準からJST基準に変更出来ないかと問い合わせをしましたが、そのような方法は存在しないため、現状は下記の方法で対応するしかなさそうです。次回以降の支払い日時を変更する方法としてtrial_endを使用します。trial_endは本来であればトライアル期間を設定するために使用するパラメータですが、支払い日時を変更する用途でも使用できます。https://stripe.com/docs/api/subscriptions/update今回は即時で初回決済する場合とトライアル期間を経て決済する場合の2種類について説明します。})注意点(即時決済のみ)trial_endは本来トライアルを設定するために使用されるので、Stripeのダッシュボードのサブスクリプションのステータスが「トライアル」になります。trial_endによるアップデートで、以下のイベントが発生します。ステータスがトライアルに変わり、そのタイミングで0円の請求書が作成されるためです。invoice.finalizedinvoice.paidinvoice.payment_succeededトライアルトライアルオプション付きでサブスクリプションを作成する(Stripe::Subscription.create)トライアルオプションで指定した日付が特定日時に該当する場合、即時決済と同様の方法で、サブスクリプションをアップデートするおわりに今回はStripeのサブスクリプションを扱う際に遭遇した問題についてご紹介しました。この問題を発見できたのは偶然で、発生条件もかなり限られており、最初は何が原因か分かりませんでしたが、Stripeのサポートの方に助けられつつ原因の特定と対応することが出来ました。Stripeをシステムに組み込む際の参考になればと思います。本記事では月末について取り扱いましたが、月初にも類似した問題が発生したため別記事にまとめました。tech.stmn.co.jp最後に、株式会社スタメンでは一緒に働くエンジニアを募集しています。ご興味のある方はぜひエンジニア採用サイトをご覧ください。...2021-01-28【Stripe】サブスクリプションの支払いタイミングが特定日時においてズレる問題について(月初版)スタメンでエンジニアをしている田中です。Rails】Stripeのサブスクリプションで試したことをまとめてみたスタメンでエンジニアをしている田中です。株式会社スタメンでは、エンジニア採用を強化しています。ご興味のある方はぜひエンジニア採用情報をご覧ください。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。