Rubyを使用してStripe Webookを設定する方法

こんにちは。イノベーションLABのみなみです。
私はQubeの開発に携わっています。

当社が開発・運営をしているBtoBのWebサービス:Qubeについてはこちら ▼

www.css-net.co.jp


以前、Qubeで導入した「Stripe」というクレジット決済機能の決済処理について、ブログで書かせていただいたのですが、その後Qubeでは、Stripe決済における支払い状況や入金状況の自動更新機能を新たに追加しました。
その際に、Stripeの「Webhook」という機能を利用しましたので、今回はその設定方法についてご紹介します。

以前のブログについてはこちら▼
blog.css-net.co.jp


1. WebhookとはStripe からイベントを受信する HTTP エンドポイント

Webhook とは、Stripe からイベントを受信する HTTP エンドポイントです。
顧客による支払いの成功など、Stripe上で発生したイベントの結果を、Stripeからプラットフォームに通知します。

Webhookを利用すれば、支払い成功時以外に、支払いへの不審請求の申請や、Stripeアカウントの利用可能な残高についての通知を取得することも可能です。
通知できるイベントの詳細については、こちらのURLをご参照ください。
https://stripe.com/docs/api/events/types

Webhookについてわかりやすくまとめた記事はこちらです▼
blog.css-net.co.jp
ここからは、支払い成功時に通知を受け取ることを想定した場合の設定手順をご紹介します。

2. 設定手順(支払い成功時の通知受信を想定した場合)

2.1 前提条件

  • Ubuntu 18.04.6 LTS on WSL2
  • VSCode 1.85.1
  • Ruby 2.6.3
  • Rails 5.2.5

2.2 ローカル環境設定

まずはローカルでWebhookの通知を取得できるようにします。

routes.rbに通知を取得するためのパスを設定します。
ここではwebhooks_controllerのcreateアクションで、通知を取得したいと思います。

# 支払い成功通知取得
resources :webhooks, only: [:create]


Stripeダッシュボードを開き、「開発者>Webhook>エンドポイントを追加」をクリックします。


「ローカル環境でテスト」をクリックします。


こちらのドキュメントを参考に、CLIをインストールしておいてください。
https://stripe.com/docs/stripe-cli

CLIがインストールされた環境にて、以下コマンドでstripeアカウントにログインします。

$ stripe login


routes.rbで設定したアクション(Webhooks_controller.rbのcreate)に、Stripeダッシュボードに表示されているサンプルコードを貼ります。

def create
  payload = request.body.read
  sig_header = request.env["HTTP_STRIPE_SIGNATURE"]
  endpoint_secret = "whsec_×××"
  event = nil

  begin
    event = Stripe::Webhook.construct_event(
      payload, sig_header, endpoint_secret
    )
  rescue JSON::ParserError => e
    # Invalid payload
    output_error_log(e, request.fullpath)
    status 400
    return
  rescue Stripe::SignatureVerificationError => e
    # Invalid signature
    output_error_log(e, request.fullpath)
    status 400
    return
  end

  case event.type
  when 'payment_intent.succeeded'
    payment_intent = event.data.object
    # ... handle other event types
  else
    puts "Unhandled event type: #{event.type}"
  end
  status 200
end

api_keyの設定方法についてはこちらをご参照ください。

以下のコマンドを実行し、StripeからWebhookを受信できるようにします。

$ stripe login$ stripe listen --forward-to localhost:3000/webhooks


別のターミナルを開いて以下のコマンドを実行し、支払い成功時のイベントを発生させます。

$ stripe trigger payment_intent.succeeded


通知を取得することができたら、Stripeダッシュボードで「完了」をクリックします。

2.3 エンドポイント設定手順

StripeダッシュボードのWebhook画面を開き「エンドポイントを追加」をクリックします。

エンドポイントURLを入力して「イベントを選択」をクリックします。
※Stripe Connectを利用しており、子アカウントの情報を取得したい場合は、「リッスンする」で「連結アカウントでのイベント」を選択してください。


通知を取得したいイベントを選択し、「イベントを追加」をクリックします。
ここでは支払い成功時の通知を取得するため、「payment_intent.succeeded」を選択します。


対象のイベントが選択されていることを確認し、「イベントを追加」をクリックします。
このとき、画面右側のサンプルコードの「case.event」以下をコピーしておくと良いです。


サンプルコードを参考に、createアクションの「endpoint_secret」と「case event.type」以下を書き換えます。

endpoint_secretの設定方法

1)StripeダッシュボードのWebhook画面を開き、対象のエンドポイントをクリックします。

2)署名シークレットの「表示」をクリックすると「whsec_××」というシークレットキーが表示されるので、「endpoint_secret」を書き換えます。
※ローカル環境でテストする場合は、サンプルコードに載っている値をそのまま使用してください。


「case event.type」以下の設定

def create
       ・
       ・
       ・
  case event.type
  when 'payment_intent.succeeded'
    payment_intent = event.data.object
    #### ここに通知取得時の処理を書く ####
  else
    puts "Unhandled event type: #{event.type}"
  end
  status 200
end


エンドポイントの設定手順は以上です。
この状態で実際に支払いを行うと、Stripeから通知を取得することができます。

3.【最後に】動作確認の操作は事前調査しておく方が良い

今回は支払い成功時の通知取得方法を例にご紹介しましたが、Qubeではこの他に入金時や入金失敗時の通知も取得しています。
動作確認を行う際に、支払い成功時の通知は問題なく確認できたのですが、入金時の通知は、入金の設定が自動入金でなければならないため、週に一度しか確認することができませんでした。
また入金失敗時の通知については、そもそも動作確認ができない仕様になっていました。
このように、動作確認に時間がかかったり、確認できないものもあるようなので、支払方法や入金方法等の動作確認の操作についても事前に調査しておくと良いと思います。

本記事でご紹介した内容は、Webhookの基本的な設定手順となりますが、少しでもお役に立てば幸いです。
お読みいただきありがとうございました。

この記事を書いた人

ニックネーム:みなみ
得意な言語:Ruby
趣味:ドラマ、映画、アニメなどを家にこもってひたすら見ること
一言:ちゃんと外に出ることが永遠の目標です!

4. 参考