メインコンテンツまでスキップ

Stripe

Stripe Docs
Stripe card Docs

Overview

Eコマースが活発になった今日、オンラインでの決済を処理するプラットフォームを構築、または導入するビジネスも多くなっている。
この中でもとくに国際的に広く使われているオンライン決済プラットフォームがStripeになる。
stripeのAPIを使うと、自身のサービスの決済処理を担ってくれる。

ユーザーにお金を請求してその支払を受け取りたい! 「買切り」や「定額プラン」を設定して請求したい!

といったことが可能となる。

私がstripeの特に良いと思ったところは、ユーザーがstripeのアカウントがなくても支払ができるということです。

Stripeを導入するにあたり検討する

タイミーの場合

PCI DSSについて

ここに書いてある内容は正確性に欠けている可能性があるので、実際に対応を進める場合は必ず専門家に相談しながら進めてください。 決済機能を提供する上で避けて通れないのがPCI DSSへの対応です。PCI DSSとは、クレジットカード情報を事業者がどのように扱うべきかを定めた情報セキュリティ基準です。クレジットカード情報を自社で保持する場合は300 件を超えるPCI DSSの各セキュリティ制御要件を満たさなければなりませんが、カード情報の処理をStripeなどの外部SaaSに任せる事で事業者に求められるセキュリティ制御要件は22件にまで減ります。そのためにカード情報の「非保持・非通過」を目指します。

Stripe拒否コード

Stripe拒否コード

Stripe Billing(サブスクリプション)

Stripe のサブスクリプション(すばらしいblog)
Stripe Subscription 開始パターンごとの作成方法まとめ

サブスクリプションに関連するリソース図 Image from Gyazo

今まで Stripe Subscriptions として出してきた製品が Stripe Billing としてパワーアップし、新しくなった。

リソース概要
顧客(Customer)Subscription の購入者。カード番号を保持するのに必須で、Subscription を作るのに必須。
製品(Products)販売するサブスクリプション。名称や料金など設定する。料金の保存場所的なリソース。
料金(Price)サブスクリプションの販売価格。Products に対して複数設定可能で請求金額と請求間隔を設定する。Subscription を作るのに必須。
サブスクリプション(Subscription)販売するサブスクリプション。状態を持ち支払いに関連して状態遷移する。
請求書(Invoice)サブスクリプションに対する請求。顧客にサブスクリプション料金を請求するタイミングで自動的に作られる。明細、税率、支払いの合計金額が記載される。
PaymentIntents顧客の支払い処理。請求に対する顧客側から見た記録を保持する。状態を持つ。
税率(TaxRate)請求に加算する税率。Subscription を作成するときに default_tax_rates で指定してやると適用される。
クーポン(Coupons)割引クーポン。Subscription を作成するとき coupon に指定すると適用され、割り引かれる。定額または割引率で設定する。割引期間も設定できる。税率を設定している場合、割引後の請求額で税金が計算される
Charge と TransactionInvoice に対して、支払いが発生すると、ワンショットの決済の様に Charge が作成される。Charge の balance_transaction を見ると、その決済手数料がわかる。

サブスクリプションの状態

Image from Gyazo

状態概要
trialingSubscription 試用期間。まだ請求してない。
activeSubscription が有効な状態。直近の請求に対する請求が成功している。
incompleteSubscription 作成時の請求が失敗した状態。
incomplete_expired作成時の請求に失敗し、その後 23 時間以内に支払われなかった状態。
past_due直近の請求が失敗している状態。リトライを試みている。
canceledSubscription がキャンセルされた状態。自動的な定期請求が止まる。
unpaid直近の請求が失敗し、リトライも成功しなかった状態。請求書は作成されるが、自動的には請求されない。

サブスクリプションの更新について

【Stripe】サブスクリプションの支払いタイミングが特定日時においてズレる問題について(月末版)
まず起点の時間を把握しておく必要がある。
Stripeでは毎月・四半期・毎年などのサイクルを指定でき、起点からそのサイクルに則って開始される。

  • billing_cycle_anchor

    billing_cycle_anchorとは支払い開始の起点となる日時のことです。たとえば、毎月1日に決済したい場合、サブスクリプション作成時にbilling_cycle_anchorに翌月の1日を指定することで、毎月1日払いを実現することが出来ます。特に指定をしなければ、サブスクリプション作成時刻 = billing_cycle_anchorとなります。

サブスクリプションの次回以降の支払い日時を変更する方法

次回以降の支払い日時を変更する方法としてtrial_endを使用します。
trial_endは本来であればトライアル期間を設定するために使用するパラメーターですが、支払い日時を変更する用途でも使用できます。

サブスクリプション継続決済

基本的にイベントは update が発行される。
しかし一度サブスクリプションをキャンセルした後に、再度入り直すとイベントはcreateになる。

Stripe Billing - 定期支払いにおける比例配分の考え方

Stripe document比例配分の仕組み
Stripe Billing - 定期支払いにおける比例配分の考え方
Stripe Billingで、サブスクリプションのプラン・料金変更後の請求金額を事前にプレビューする

Stripe Billingでサブスクリプションを提供している場合、契約期間中のプラン変更で「使った分だけ支払う」決済ができる。
stripeではこれを「比例配分」と呼んでいる

覚えた方がいい単語

  • 按分(あんぶん)

Stripeの按分計算

Stripeのデフォルトでは、日割り計算(按分計算)は秒単位で行われます。これにより、非常に正確な料金計算が可能です。

詳細説明

Stripeでは、サブスクリプションの変更やキャンセルが行われた際に、利用期間に基づいて正確に料金を計算するため、秒単位で按分計算を行います。これにより、料金計算の精度が高まり、利用者に対して公平な請求が可能となります。

たとえば、月額料金のサブスクリプションが月の途中で変更された場合、変更前後の料金を以下のように秒単位で按分します。

  1. 月額料金が1000円のサブスクリプション
  2. 月の半ばで料金を2000円に変更

計算方法

  • 月の前半(変更前)

    • 1か月を秒単位で計算(30日と仮定して 30 * 24 * 60 * 60 = 2,592,000秒
    • 前半の期間の秒数を計算(15 * 24 * 60 * 60 = 1,296,000秒
    • 前半の料金: (1000円 / 2,592,000秒) * 1,296,000秒 = 500円
  • 月の後半(変更後):

    • 後半の期間の秒数を計算(同じく 1,296,000秒
    • 後半の料金: (2000円 / 2,592,000秒) * 1,296,000秒 = 1000円
  • 合計料金: 500円 + 1000円 = 1500円

このように、非常に細かい時間単位(秒)での按分計算を行うことで、利用者に正確な料金を請求できます。

まとめ

Stripeのデフォルト設定では、按分計算は秒単位で行われます。これにより、自前で日割り計算の実装を行う必要がなくなり、StripeのAPIを利用することで高精度の料金計算が可能になります。自前で実装する場合、同様の精度を持つ計算を行うことは非常に難易度が高いため、Stripeのデフォルト機能を活用するのが望ましいです。

Stripe インボイス

Stripeにおけるインボイスは、顧客に対する請求や決済を管理するためのひとつの手段。
Stripeのインボイスは柔軟性が高く、異なる支払いシナリオやビジネスモデルに応じて設定することが可能。
具体的には、Stripeのインボイスは自動的な決済と手動決済の両方のケースに対応している。

Stripe インボイスの基本

  1. 自動的な決済 一般的にStripeを使用している多くのサービスでは、サブスクリプションや定期的な支払いがあり、これらは顧客が事前に支払い方法(例:クレジットカード)を登録しており インボイスが発行されると自動的にその登録された支払い方法で料金が決済される。
    この場合、インボイスは主に記録として機能し、顧客への支払い詳細の確認や、会計処理のために用いられます。

  2. 手動での支払い 一部のケースでは、インボイスが発行された後、顧客が指定された支払い期限までに自ら支払いを行う必要がある。
    この方式は、通常、B2B(ビジネス間取引)でよく見られる。
    ここで、顧客はインボイスに記載された支払い手順にしたがって、オンラインでの支払い、銀行振込、または他の方法で支払いを完了する。

インボイスの送付と決済プロセス

  • インボイスのメール送信

    • Stripeでは、インボイスが生成されると、顧客に自動的にメールで送信される。 このメールにはインボイスの詳細と、支払いを行うためのリンク(オンラインで支払いを完了するためのページへのリンク)が含まれている場合がある。
  • 自動決済の通知

    • 自動決済を行う設定の場合、顧客はメールでインボイスを受け取ると同時に、そのインボイスが登録されたカードで自動的に支払われたことを通知されることが一般的。

考慮すべき点

  • カード情報の更新:

    • 顧客のカード情報が有効期限切れになっている場合や、その他の理由で決済が拒否された場合、多くのサービスではカード情報の更新を求める通知が行われます。これは、サービスの中断を避けるために重要です。
  • セキュリティ:

    • 支払い情報の取り扱いには、常に高いセキュリティ基準を遵守することが重要です。StripeはPCI DSS準拠を実施しており、セキュリティの観点から信頼性が高いです。

Stripeのインボイス機能は非常に柔軟で、自動的な決済だけでなく、手動での支払いを求める場合にも対応できるため、さまざまなビジネスモデル

拒否コードの見方

Stripe Docs:拒否コード

まず大元として支払いが失敗する理由は3つある

  • カード発行会社による支払い拒否
  • ブロックされた支払い
  • 無効なAPIコール

クーポン

Stripeにはクーポンとプロモーションコードの機能があります。これらを使うことで、顧客に対して割引や特典を提供できる。

クーポン (Coupon)

  • 顧客にクーポンを適用する
    • 顧客にクーポンを追加すると、クーポンは、顧客のすべてのサブスクリプション(後から追加するサブスクリプションを含む)に適用されます。顧客のすべての継続支払いを割引しないようにするには、顧客ではなくサブスクリプションにクーポンを追加します。
  • クーポンを削除する
    • クーポンを削除すると、その後のサブスクリプションや顧客に適用できなくなりますが、そのクーポンをすでに持っているサブスクリプションや顧客から割引が削除されることはありません。

概要

  • クーポンは、特定の顧客に対して割引を適用するためのものです。
  • クーポンは、サブスクリプションの請求時や、ワンタイムの支払い時に適用できます。
  • クーポンは、固定金額の割引や割合の割引を提供できます。

主なフィールド

  • id: クーポンの一意識別子
  • amount_off: 固定金額の割引額
  • percent_off: 割引率
  • currency: 金額割引が適用される通貨
  • duration: 割引が適用される期間(例:once, repeating, forever)
  • duration_in_months: 割引が適用される月数(期間がrepeatingの場合に使用)
  • max_redemptions: クーポンの最大利用回数
  • times_redeemed: 現在までのクーポン利用回数
  • redeem_by: クーポンの有効期限

利用例

Stripe::Coupon.create({
percent_off: 25,
duration: 'repeating',
duration_in_months: 3,
})

プロモーションコード (Promotion Code)

クーポンに作成される顧客表示用のコード
クーポンだけでも割引することは可能ですが、システム側で商品や顧客に対してクーポンを適用する必要があります。物理的なクーポン券のように顧客が任意のタイミングで利用していただくためにはプロモーションコードを作成する。

概要

  • プロモーションコードは、クーポンを基にして顧客が特定のコードを入力することで割引を適用できるようにするものです。
  • プロモーションコードを使うことで、クーポンをより広範に、簡単に利用できるようにできます。
  • プロモーションコードは、クーポンに追加の制約を設定できます(例:特定の顧客のみ利用可能、特定の使用期限など)
  • 特定のサブスクリプションや顧客に、プロモーションコードとクーポンの両方を同時に適用することはできません。
  • 2つ以上のプロモーションコードを適用することはできません

主なフィールド

  • id: プロモーションコードの一意識別子
  • code: 顧客が入力するコード
  • coupon: 関連付けられたクーポンのID
  • active: プロモーションコードが有効かどうか
  • restrictions: プロモーションコードに適用される制約(例:特定のカスタマーグループのみ利用可能など)
  • expires_at: プロモーションコードの有効期限
  • max_redemptions: プロモーションコードの最大利用回数
  • times_redeemed: 現在までのプロモーションコード利用回数

利用例

Stripe::PromotionCode.create({
coupon: '25OFF', # 事前に作成されたクーポンのID
code: 'SUMMER2024',
max_redemptions: 100,
expires_at: Time.now.to_i + 86400 * 30 # 30日間有効
})

クーポンとプロモーションコードの違い

  • 適用方法:

    • クーポン: 直接適用される割引。クーポンIDを特定の支払いに関連付けることで割引が適用される。
    • プロモーションコード: 顧客が入力するコードによって割引が適用される。クーポンを基にして作成される。
  • 利用シーン:

    • クーポン: 特定の顧客や特定のシナリオ(例:リテンションオファー)で使用。
    • プロモーションコード: より広範なマーケティングキャンペーンやプロモーションで使用。

結論

Stripeのクーポンとプロモーションコードは、顧客に割引を提供するための柔軟なツールです。クーポンは直接割引を適用するためのものであり、プロモーションコードはそのクーポンを基にした顧客入力型の割引コードです。これらを効果的に利用することで、さまざまなマーケティングキャンペーンや顧客ロイヤルティプログラムを運用できます。


実装関連

Webhookの実装

基本は冪等で実装するべき(Stripeは何度も送信してくる可能性があるため)
エラーレスポンスを返してしまうと、Stripeが何度も試行してしまうのでそこも考慮すべき

RailsでのStripeの実装

参考URL

顧客情報をstripeに登録し、その際に作られた顧客IDを中心にその他の課金等の処理を実行する というのが実装の方針となる。

それはなぜかと言うと、この顧客ID(cus_xxxxxxxxxxxxxx)を取得してしまえば、その顧客に対して定期課金や登録しているクレジットカードの削除などの処理を行えば良いからです!

Stripe APIを利用するための準備

クーポンについて 顧客にクーポンを適用する 顧客にクーポンを追加すると、クーポンは、顧客のすべてのサブスクリプション (後から追加するサブスクリプションを含む) に適用されます。顧客のすべての継続支払いを割引しないようにするには、顧客ではなくサブスクリプションにクーポンを追加します。 クーポンを削除する クーポンを削除すると、その後のサブスクリプションや顧客に適用できなくなりますが、そのクーポンをすでに持っているサブスクリプションや顧客から割引が削除されることはありません。

プロモーションコードについて クーポンに作成される顧客表示用のコード クーポンだけでも割引することは可能ですが、システム側で商品や顧客に対してクーポンを適用する必要があります。物理的なクーポン券のように顧客が任意のタイミングで利用して頂くためにはプロモーションコードを作成します。

クーポンの割引種類について 固定額割引: 購入金額から一定額を割り引く。 最小金額:1円 最大金額:999,999,999,999円(約9,999億円 ※日本円の場合) 固定額割引の場合、通貨毎に割引額を変えられます。 円では2,000円引き、ドルでは10ドル引き、のような指定が可能(現在は1ドル147円なので、日本円で購入した方がお得になるように見せる事ができます。)

パーセンテージ割引: 購入金額の特定のパーセンテージを割り引く。 最小割引:0.01% 最大割引:100%