Webサービスに決済や定期課金を実装するためにはオンライン決済サービスを利用する必要がありますが、その代表的なものとしてStripeがあります。 StripeはAPIやクライアントライブラリ、ドキュメントなどが充実しており、開発者にとってうれしい決済サービスとなっています。

今回から4回に渡って、Stripeによる定期課金の実装方法についてまとめていきます。

目次

事前準備

実装に入る前に、Stripeでアカウントを開設し、APIキーを取得しておく必要があります。 無料でできますので、まだの場合は登録を済ませておきましょう。

開発フロー

それではまず、定期課金を実装する流れについて次に示します。 ここでは大まかな流れのみを示し、具体的な実装方法については次回以降に書いていきます。

1. プランの作成処理を実装する

プランとはいわゆる料金プランのことで、一般的にBasicやPremiumといったものがあります。 アプリケーション側の管理画面などからプランを作成し、そのタイミングでStripe側に反映させます。

2. 購読処理を実装する

購読の実装は、細かく分けると次のような流れになります。

  1. ユーザにカード情報を入力してもらう
  2. 入力情報をもとにトークンを取得する
  3. トークンをもとに顧客を作成する
  4. 顧客にプランを購読させる
  5. ユーザの有効期限を設定する

まず、ユーザにクレジットカードを入力してもらいます。 この情報はStripe側のサーバに送信され、結果としてトークンを取得できます。

このトークンを元に、Stripe側に顧客として登録します。 こうすることで、以降は顧客IDを指定するだけで決済を行なえるようになります。

この顧客IDを用いてプランを購読させると、その顧客の有効期限を取得できます。 これをアプリケーション側に保存し、この有効期限の間だけアプリケーションを利用できるようにします。

3. 有効期限の更新を実装する

たとえばプランが月次で更新するものの場合、毎月決済が完了したタイミングでWebHookによる通知が飛んできます。 これには新しい有効期限が含まれているので、これをもとにユーザの有効期限を更新します。

4. 購読のキャンセルを実装する

決済を行なうだけでなく、ユーザのアカウント削除などに備えて購読の解除にも対応しておく必要があります。

以上が開発フローとなります。 他にも請求書などつくった方がいい機能もありますが、最低限実装すべき機能はこんな感じになると思います。

Stripeの重要なオブジェクト

Stripeにはたくさんのオブジェクトが存在しますが、定期課金を実装する際に重要となるオブジェクトは次の6つです。

  • Stripe::Token
  • Stripe::Customer
  • Stripe::Plan
  • Stripe::Subscription
  • Stripe::Invoice
  • Stripe::Event

これらを理解しておくと実装が捗るので、簡単にまとめておきます。

Stripe::Token

クレジットカードへ請求する際、カード情報をサーバで保持するのは好ましくありません。 カード情報を持たずに決済を行なう方法として、Stripeがカード情報から生成したトークンを用います。

このトークンを担うのがStripe::Tokenオブジェクトです。

このトークンは、1度の決済にしか利用することができません。 もし同じユーザに何度も請求したい場合は、Stripe::Customerにより顧客を作成する必要があります。

トークンの生成には、Stripeが用意したCheckoutという埋め込み側のウィジェットを利用すると簡単に行なえます。

Stripe::Customer

同じユーザに繰り返し請求したり、その処理をトラッキングしたい場合は、Stripe::Customerオブジェクトをつくります。 このオブジェクトにプランを登録することで、定期課金を実現できます。

Stripe::Plan

料金や有効期限といったプランを定義するオブジェクトです。

Stripe::Subscription

顧客のカードに繰り返し請求を行なうためのオブジェクトです。 顧客とプランを紐づけ、プランの有効期限ごとに顧客に対して請求を行ないます。

Stripe::Invoice

顧客に対する請求情報をまとめたオブジェクトです。 料金などが含まれます。

Stripe::Invoiceオブジェクトがつくられると、自動的に決済処理が行なわれます。 つまり、Stripe::Subscriptionの役割とは、定期的にこのStripe::Invoiceオブジェクトをつくることにあります。

Stripe::Event

開発者にStripe側の処理を知らせるオブジェクトです。

定期課金では、たとえば次の期間分の決済が完了するとcustomer.subscription.updatedイベントが発生します。

このイベントはWebHookによりアプリケーションに通知され、これをとおしてユーザの有効期限を伸ばすことができます。

おわりに

Stripeによる決済機能の実装を行なう上で知っておくべきことはこれくらいだと思います。 それでは、次回の記事でCheckoutによるトークンの取得などについて書いていきます。