前回の記事では、Stripeを用いた定期課金の実装フローについて書きました。 今回は、このフローにおけるトークンの取得と、これを用いた顧客の作成についてまとめます。

目次

トークンの作成方法

決済の際はユーザにクレジットカードを入力してもらいますが、カード情報をサーバ側に経由させることは、セキュリティ上好ましくありません。

Stripeでは、CheckoutStripe.jsという2つの方法でこれをトークン化し、このトークンを用いて決済を行なうことで、安全に処理を完了することができます。

Checkout

Stripeが提供する、埋め込み型のHTMLフォームです。 ユーザが入力した情報を元にトークンを取得し、そのトークンをサーバに送信する役割を持ちます。

Stripeが返し得るエラーコードに対するメッセージ表示機能も内包しているため、特にこだわらなければCheckoutによるトークン取得をおすすめします。

Checkoutによる処理の流れは次のようになっており、コードを埋め込むだけでこれらを行なってくれます。

  1. Checkoutを埋め込んだページ(https化)を訪れる
  2. フォームに入力し決済ボタンを押す
  3. 入力内容は直接Stripeのサーバに送られる
  4. StripeのサーバからCheckoutにトークンが送られる
  5. Checkoutにトークンがtype=hiddenとして埋め込まれる
  6. actionで設定した送信先にPOSTされる
  7. 受け取ったトークンを元に請求処理を行なう

Checkoutのコード例を次に示します。

<form action="/your-server-side-code" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="pk_test_xxxxxxxxxxxxxxxxxxxxxxxx"
    data-amount="2000"
    data-name="Demo Site"
    data-description="2 widgets"
    data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
    data-locale="auto"
    data-currency="jpy">
  </script>
</form>

Stripe.js

Checkoutは簡単にトークンの取得を行なえる一方、フォームのデザインの表現などに限界があります。 オリジナルの見た目や処理を実装したい場合は、Stripe.jsを用いてカスタマイズする必要があります。

以降の記事ではCheckoutを用いてトークンの取得を行なうので、Stripe.jsについては言及しません。 詳しくは公式ドキュメントをご覧ください。

顧客を作成する

Checkoutで取得したトークンは1度の決済にしか使えませんが、このトークンを用いてStripe::Customerにより顧客オブジェクトを作成することで、何度も行なえるようになります。

定期課金の際も顧客を作成しておく必要があります。 以下に、Rubyによる顧客の作成について示します。

customer = Stripe::Customer.create(
  source: params[:stripeToken],
  description: 'Example customer'
)

メールアドレスなどもあわせて指定できます。 指定可能なパラメータはAPIリファレンスをご覧ください。

customer.idに顧客IDが格納されるので、これをアプリケーション側で保存しておきます。 以降このIDを指定することで、自由に請求処理を行なえるようになります。

おわりに

今回までで顧客の作成が終わり、請求を行なう準備が整いました。 次回の記事では、プランの作成と、今回作成した顧客にこれを購読させる処理についてまとめます。