決済
決済Webhook処理
Stripe Webhookの署名検証と受信イベントの反映
この機能には環境変数の設定が必要です
.env.local に以下を設定すると動作します。未設定でも画面は開けますが、実行時にエラーが返ります。
- STRIPE_SECRET_KEY
- STRIPE_WEBHOOK_SECRET
エンドポイント
POST /api/payment-webhookローカルでの受信手順
stripe listen --forward-to localhost:3000/api/payment-webhook # 表示された whsec_... を STRIPE_WEBHOOK_SECRET に設定する stripe trigger checkout.session.completed
受信したイベント(0件)
まだイベントを受信していません。
実装のポイント
- 署名検証には生のリクエストボディを使う(JSONに変換してからでは不一致になる)
- タイムスタンプの許容範囲を設けてリプレイ攻撃を防ぐ
- 署名比較は定数時間で行う(timingSafeEqual)
- 同じイベントIDの再送を無視して二重処理を防ぐ
- 重い処理はキューに逃がし、Stripeへは素早く200を返す