🖥

#Stripe CLI で local 環境で Webhook のテストをしたいのだが

2019/12/04に公開

Ref

Using the Stripe CLI | Stripe

Securely test webhooks without relying on third-party tunneling software.
Trigger webhook events to easily test your integration.

サードパーティーのトンネリング用のソフトウェアを使わずにwebhookのテストができるようだ

トンネリング用のソフトウェア = ngrok とか?
ngrok - secure introspectable tunnels to localhost

Tail API request logs in real time.
Create, retrieve, update, and delete API objects.

あとAPI リクエストをめちゃくちゃ簡単に送れるみたいだ

シークレットキーノオ指定とか面倒だもんね

インストール

Stripe CLI をインストールしておく

Macなら

brew install stripe/stripe-cli/stripe

Listenする

ここでweb hook用のSecretが発行されるが、今回は特に使わない (どこでどうやって使うんだ)

stripe listen
> Ready! Your webhook signing secret is whsec_XXXXXXXXX (^C to quit)

イベント発行

別のコンソールのウィンドウでイベントを発行する

stripe payment_intents create --amount=100 --currency=usd

イベントをキャッチしたことを確認

listenしたコンソールのウィンドウを見ると、イベントがキャッチされているのが分かる

stripe listen
> Ready! Your webhook signing secret is whsec_XXXXXXXXX (^C to quit)
2019-12-03 08:36:17   --> payment_intent.created [evt_1FlORACmti5jpytUbQhFVqeN]
2019-12-03 08:36:32   --> payment_intent.created [evt_1FlOROCmti5jpytUzmQDC9LV]

一旦 Command+C で終了させておく

port を指定して listen して転送する

Stripe CLI が webhook を受け取ると 特定のURLにリクエストを forward してくれるみたいだ
たぶんそうだ

$ stripe listen --forward-to localhost:5000/hooks --latest

> Ready! Your webhook signing secret is whsec_XXXXXXXXXXXXX (^C to quit)

イベント発行

stripe payment_intents create --amount=100 --currency=usd

http://localhost:5000/hooks に接続しに行こうとするが、そこでエラーで落ちる
http://localhost:5000/hooks での処理を実装しておく必要があるよね

(Webhookってそういうこと)

ですよね forward ですもんね

$ stripe listen --forward-to localhost:5000/hooks --latest

> Ready! Your webhook signing secret is whsec_XXXXXXXXXXXXXXXXXXXX (^C to quit)
2019-12-03 08:44:04   --> payment_intent.created [evt_1FlOYhCmti5jpytUp2XiyRCe]
2019-12-03 08:44:04            [ERROR] Failed to POST: Post http://localhost:5000/hooks: dial tcp [::1]:5000: connect: connection refused

node

node で http サーバーを起動させて待ち受ければ良いかと思うけど、まだうまく動作させられてない

image

https://github.com/stripe/stripe-node/blob/master/examples/webhook-signing/express.js

const stripe = require('stripe')(process.env.STRIPE_API_KEY);
const express = require('express');
const bodyParser = require('body-parser');

/**
 * You'll need to make sure this is externally accessible.  ngrok (https://ngrok.com/)
 * makes this really easy.
 *
 * To run this file, just provide your Secret API Key and Webhook Secret, like so:
 * STRIPE_API_KEY=sk_test_XXX WEBHOOK_SECRET=whsec_XXX node express.js
 */

const webhookSecret = process.env.WEBHOOK_SECRET;
const app = express();

// Stripe requires the raw body to construct the event
app.post(
  '/webhooks',
  bodyParser.raw({type: 'application/json'}),
  (req, res) => {
    const sig = req.headers['stripe-signature'];

    let event;

    try {
      event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
    } catch (err) {
      // On error, return the error message
      return res.status(400).send(`Webhook Error: ${err.message}`);
    }

    // Do something with event
    console.log('Success:', event.id);

    // Return a response to acknowledge receipt of the event
    res.json({received: true});
  }
);

app.listen(3000, () => {
  console.log('Example app listening on port 3000!');
});


ここのportを変えて
listenの対象URLを合わせるなどして試してみたが

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-12-04

Discussion