概要
本記事で扱うこと
- Stripe の webhook をトリガーに Rails アプリ内で処理を実装する方法 (= webhook integration)
- ローカル開発環境で実装した処理をテストする方法
本記事で扱わないこと
- Stripe 決済機能自体を Rails アプリに組み込む方法
Stripe について
Stripe はリッチな API や webhooks が用意されている開発者フレンドリーな決済サービスです。
また、購読、トライアル、クーポンなど機能は豊富な一方、マニュアルは十分に整備されており非常に扱いやすいのも特徴です。
ngrok について
ngrok はpublic な URL と localhost とをトンネリングすることができるツールです。
これを使うことで例えば、開発中のアプリをデプロイすることなく、遠隔のメンバーに public な URL を通して触ってもらい、フィードバックをもらう、なんてことが可能です。
今回は ngrok を利用して作成した public な URL を、Stripe Webhook のエンドポイントとして設定し、localhost 内で動作している開発環境にリクエストを再送してもらうことで webhook integration のテストを行います。
アプリの設定
integrallis/stripe_event gem を利用します。
この gem を利用すると stripe から実行される webhook のハンドリングを簡単に記述することができます。
以下ほぼ README の内容のまま。
gem 'stripe_event'
mount StripeEvent::Engine, at: '/webhooks/stripe'
Stripe.api_key = ENV['STRIPE_SECRET_KEY']
StripeEvent.configure do |events|
events.subscribe 'charge.failed' do |event|
# Define subscriber behavior based on the event object
event.class #=> Stripe::Event
event.type #=> "charge.failed"
event.data.object #=> #<Stripe::Charge:0x3fcb34c115f8>
end
events.all do |event|
# Handle all event types - logging, etc.
end
end
ngrok のダウンロード & 起動
ngrok より適当にダウンロードし、解答した ngrok
スクリプトを PATH の通ったディレクトリに配置します。
起動
$ ngrok http 3000
起動するとフォワード用の URL が自動で生成されます。
ngrok by @inconshreveable (Ctrl+C to quit)
Tunnel Status online
Version 2.0.19/2.0.19
Web Interface http://127.0.0.1:4040
Forwarding http://YOUR-UNIQUE-UID.ngrok.io -> localhost:3000
Forwarding https://YOUR-UNIQUE-UID.ngrok.io -> localhost:3000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
Stripe の設定
Account Settings -> Webhooks より、ngrok で生成した URL を指定しましょう。
http://YOUR-UNIQUE-UID.ngrok.io/webhooks/stripe
テストの実施
あとは stripe 上から customer 情報を修正するなりして webhook を実行しましょう!
Stripe -> ngrok -> localhost
という順番でリクエストがフォワードされていきます。
注意
stripe_event
gem は受け取ったイベントの id を元に様々な情報を取得します。
stripe 上から実行できる send test webhook によるテストでは固定で evt_00000000000000
を送出し、イベントが見つからず 401 Unauthorized
となってしまいます。
テストを行う際には、実際のデータの編集を行うなどしてイベントを発生させるのが楽でしょう。