ngrok で stripe の webhook integration のテストを行う

# 概要

**本記事で扱うこと**

- Stripe の webhook をトリガーに Rails アプリ内で処理を実装する方法 (= webhook integration)
- ローカル開発環境で実装した処理をテストする方法

**本記事で扱わないこと**

- Stripe 決済機能自体を Rails アプリに組み込む方法


# Stripe について

[Stripe](https://stripe.com/japan) はリッチな API や webhooks が用意されている開発者フレンドリーな決済サービスです。
また、購読、トライアル、クーポンなど機能は豊富な一方、マニュアルは十分に整備されており非常に扱いやすいのも特徴です。


# ngrok について

[ngrok](https://ngrok.com/) はpublic な URL と localhost とをトンネリングすることができるツールです。

これを使うことで例えば、開発中のアプリをデプロイすることなく、遠隔のメンバーに public な URL を通して触ってもらい、フィードバックをもらう、なんてことが可能です。

今回は ngrok を利用して作成した public な URL を、Stripe Webhook のエンドポイントとして設定し、localhost 内で動作している開発環境にリクエストを再送してもらうことで webhook integration のテストを行います。


# アプリの設定

[integrallis/stripe_event](https://github.com/integrallis/stripe_event) gem を利用します。
この gem を利用すると stripe から実行される webhook のハンドリングを簡単に記述することができます。

以下ほぼ README の内容のまま。

```ruby:Gemfile
gem 'stripe_event'
```

```ruby:config/routes.rb
mount StripeEvent::Engine, at: '/webhooks/stripe'
```


```ruby:config/initializers/stripe.rb
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](https://ngrok.com/) より適当にダウンロードし、解答した `ngrok` スクリプトを PATH の通ったディレクトリに配置します。

**起動**

```bash
$ ngrok http 3000
```

起動するとフォワード用の URL が自動で生成されます。

```bash
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 を指定しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/9e1d407d-3aac-391f-10a6-56b764245684.png)

`http://YOUR-UNIQUE-UID.ngrok.io/webhooks/stripe`


# テストの実施

あとは stripe 上から customer 情報を修正するなりして webhook を実行しましょう！

`Stripe -> ngrok -> localhost`

という順番でリクエストがフォワードされていきます。


## 注意

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/b83a8fa2-3eaf-f5c5-dde2-416b3996865f.png)

`stripe_event` gem は受け取ったイベントの id を元に様々な情報を取得します。
stripe 上から実行できる send test webhook によるテストでは固定で `evt_00000000000000` を送出し、イベントが見つからず `401 Unauthorized` となってしまいます。

テストを行う際には、実際のデータの編集を行うなどしてイベントを発生させるのが楽でしょう。