ブログ · · 約 8 分で
Webhook をローカルで受けて試す方法:トンネル・各社の CLI・記録からの再送
手元の
要点
- トンネル
(ngrok・cloudflared) は、 実際の 送信元から 手元の サーバーまで 本物の Webhook を 通して 試したい ときに 使います。 - 各社の
CLI (stripe listen など) は、 その サービスの Webhook だけを、 公開の URL なしで 手元に 転送したい ときに 使います。 - 記録した
本文を curl や 小さな スクリプトで 送り直す方法は、 同じ 入力で 何度も 試したい ときと、 自動テストに 向きます。
Webhook を
3 つの方法の比較
| 方法 | 例 | 向く |
URL | 署名 |
|---|---|---|---|---|
| トンネル | ngrok、 |
本物の |
公開の |
送信元の |
| 各社の |
stripe listen |
その |
公開の |
CLI 用の |
| 記録からの |
curl、 |
同じ |
不要 | 手元で |
手元の
方法 1: トンネル
トンネルは、
ngrok
2026-09-27 に
| 項目 | 無料の |
|---|---|
| 同時に |
3 つまで |
| ドメイン | 開発用の…ngrok-free.app) |
| 転送量 | 月 1GB |
| HTTP の |
月 20,000 回 |
| 警告の |
ブラウザからの |
割り当てられた
ngrok http 3000cloudflared の Quick Tunnel
Cloudflare の
cloudflared tunnel --url http://localhost:3000起動するtrycloudflare.com の
方法 2: 各社の CLI
Stripe のstripe listen を
stripe listen --forward-to localhost:3000/webhooks/stripe
# 別のターミナルで
stripe trigger payment_intent.succeededstripe listen はwhsec_…)
CLI は
方法 3: 記録した本文の送り直し
同じ
Standard Webhooks のwebhookadmin のWebhook.sign で
import { readFileSync } from 'node:fs';
import { Webhook } from 'webhookadmin';
const secret = process.env.WEBHOOK_SECRET!; // 手元で試すための whsec_…
const body = readFileSync('saved-body.json', 'utf8'); // 受けたときの本文をそのまま
const id = 'msg_local_test_1';
const ts = Math.floor(Date.now() / 1000);
const signature = await new Webhook(secret).sign(id, ts, body);
const res = await fetch('http://localhost:3000/webhooks', {
method: 'POST',
headers: {
'content-type': 'application/json',
'webhook-id': id,
'webhook-timestamp': String(ts),
'webhook-signature': signature,
},
body,
});
console.log(res.status);同じwebhook-id で
署名付きで試すときの注意
- トンネルを
通しても 。本文は 変わりません 署名が 合わないなら、 原因は 受け側の コードの 本文の 扱いか、 鍵の 取り違えです。 切り分けは署名検証が 失敗する に原因の 記事 まとめました。 - URL を
署名に 。含める 方式は、 トンネルの URL で 署名されます Twilio は、 Twilio に 設定した URL と パラメータで 署名します。 受け側が 自分の 見ている URL ( http://localhost:3000/…)で 検証すると 合いません。 登録した トンネルの URL で 検証します。 - 鍵を
分けます 。手元・テスト環境・本番で 別の 鍵を 使い、 環境変数の 名前も 分けて おくと 取り 違えが 減ります。
手元を外に開く危険と閉じ方
トンネルを
- 手元でも
署名の 検証を 外さない。 検証を 外した 状態で トンネルを 開かない。 - Webhook の
経路だけを 受ける サーバーを 立て、 管理画面や デバッグ用の 経路を 同じ ポートに 置かない。 - 試験が
終わったら トンネルの プロセスを 止める。 - 送る
側に 登録した トンネルの URL を 消すか、 送信先を 止める。 止めないと、 送る 側は 失敗と して 再送を 続けます。
Webhook Admin から手元への試し送信
Webhook Admin には
- テスト環境の
API キー ( sk_test_…)で、 トンネルの URL を 送信先と して 登録する。 - 送信先の
試し送信 ( POST /v1/endpoints/{id}/test)で、 その 送信先だけに webhook.testを送る。 試し送信は 使用量に 数えません。 - 手元の
サーバーで webhookadminのverifyを通す。 - 失敗したら、
管理画面の 配信記録で 応答の コードと 応答の 先頭 1,024 バイトを 見て 直し、 記録から 送り直す ( POST /v1/deliveries/{id}/retry)。
Quick Tunnel のようにwebhook-id は
送る
よくある質問
ngrok を使わずに Webhook を試せますか。
試せます。
無料の ngrok で URL が変わるのが困ります。
2026-09-27 時点の
受けた Webhook をもう一度送るにはどうすればよいですか。
送る