Stripeでサブスクリプション決済のAPIを試してみた Part2

前回の記事でクイックスタートでStripeのサブスクリプション機能を試してみました。 決済は完了後、カスタマーポータル画面を表示させるところまでは確認できましたが、 サンプルコードにはWebhookをハンドリングする処理があり、こちらの動作をまだ確認できていません。 今回はこのWebhook機能の動作を確認していきたいと思います。

StripeのWebhook機能について

着信する Webhook を使用してリアルタイムで更新を取得する | Stripe のドキュメント

Webhook を使用すると、Stripe 決済処理の結果などを通知してくれるようになります。 サンプルコードでも通知をハンドリングする処理が実装されていますが、ローカル環境下で動作を確認するためにはStripe CLIを使用してイベントを転送させる必要があります。

ローカル環境でWebhookを確認する

まずはダッシュボード画面右上から「開発者」をクリックして「Webhook」タブを開き「ローカル環境でテスト」をクリックします。 その後、手順に沿ってStripe CLIをダウンロード後に通知の転送コマンドを実行します。

Stripe CLIのダウンロード

Stripe CLIを環境に合わせてダウンロードします。Windowsの場合は以下の通りです。

Scoop なしで Stripe CLIWindows にインストールする方法は、以下のとおりです。

GitHub から、最新の windows zip ファイルをダウンロードします。 stripe_X.X.X_windows_x86_64.zip ファイルを解凍します。 解凍した .exe ファイルを実行します。 こちらから引用

Stripe CLIでログイン

解凍後「stripe_X.X.X_windows_x86_64」を作業フォルダとして、Stripeにログインします。

ログインを実行すると、アクセスを許可するか求められます。 出力されたURL「https://dashboard.stripe.com/stripecli/confirm_auth?t=yyyyyyyyyyyyyyyyyyyy」へアクセスしてログインを許可します。

stripe_X.X.X_windows_x86_64 > stripe login
Your pairing code is: xxxxxxxxxxxxxxxxxxxxxxxx
This pairing code verifies your authentication with Stripe.
Press Enter to open the browser or visit https://dashboard.stripe.com/stripecli/confirm_auth?t=yyyyyyyyyyyyyyyyyyyy (^C to quit)
テスト環境用に通知の転送

Stripeからローカル環境へ直接通知を送信できないので、以下のコマンドで「localhost:4242/webhook」宛に通知を転送します。 これで前回の記事で使用したサンプルコードのサーバ宛に通知が届くようになりました。

stripe_X.X.X_windows_x86_64 > stripe listen --forward-to localhost:4242/webhook

念の為サンプルコードを再確認すると「/webhook」宛のPOSTを受け取る処理があることがわかります。

post '/webhook' do
  # Replace this endpoint secret with your endpoint's unique secret
  # If you are testing with the CLI, find the secret by running 'stripe listen'
  # If you are using an endpoint defined with the API or dashboard, look in your webhook settings
  # at https://dashboard.stripe.com/webhooks
.
.
.
end

Webhookの動作確認する

前回同様、決済成功用のカード番号を使ってサンプルコードで決済を行ってみました。

成功時

Stripeから「charge.succeeded」や「payment_intent.succeeded」の通知を受信して、ローカル環境で起動しているサーバにPOSTされていることがわかります。

stripe_X.X.X_windows_x86_64 > stripe listen --forward-to localhost:4242/webhook
> Ready! You are using Stripe API Version [2022-11-15]. Your webhook signing secret is whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (^C to quit)
2023-04-19 16:32:48   --> charge.succeeded [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48   --> checkout.session.completed [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48   --> payment_method.attached [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48   --> customer.created [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48   --> customer.updated [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
.
.
.
2023-04-19 16:32:48   --> payment_intent.succeeded [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:32:48  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]

失敗時

その他、決済失敗のカード番号(4000 0000 0000 9995)を使用した場合は以下のようになりました。

決済失敗

2023-04-19 16:49:50   --> charge.failed [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:49:50  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:49:50   --> customer.created [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:49:50  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]
.
.
.
2023-04-19 16:49:51   --> payment_intent.payment_failed [evt_xxxxxxxxxxxxxxxxxxxxxxx]
2023-04-19 16:49:51  <--  [200] POST http://localhost:4242/webhook [evt_xxxxxxxxxxxxxxxxxxxxxxx]

これらの通知を利用してサーバ側で行う必要のある処理を実行できそうです。

まとめ

今回、決済APIを色々と調査していましたが思ったより簡単に使えそうに思いましたが、やはり考慮すべきことは多そうだなという感想を持ちました。使用するサービスによっても仕様が色々と異なってきそうなので、オンライン決済サービスを選ぶ際には料金以外にも実装コストや運用面でのコストを考慮する必要があるなと思いました。