Webhook を使うときの前提
Webhook は「変化があったときに向こうから通知が来る」仕組みで、定期的に問い合わせる(ポーリング)より効率的だ。ただし受け取る側の実装責任が大きい点が API と決定的に違う。
実装で必ず要る3点
署名検証: 受信エンドポイントは公開されるため、検証しないと第三者が通知を偽装できます。決済系では致命的です。
冪等性: 配信は再試行されるため同じ通知が複数回届きます。イベント ID で処理済みを判定しないと、二重に処理します。
即時応答: 重い処理をしてから応答すると、タイムアウトして再送を招きます。まず受領を返し、処理は非同期に回してください。
取りこぼしを前提にする
受信サーバーが停止していた時間帯の通知は、再送で届く場合もあれば失われる場合もある。Webhook だけに依存せず、定期的に API で状態を突き合わせる仕組みを併用すると、欠損に気づける。重要な処理ほどこの二重化が要る。
順序は保証されない
通知が発生順に届くとは限らない。「更新」が「作成」より先に届くこともある。イベントに含まれるタイムスタンプや状態を見て判断し、到着順を前提にした処理は書かないほうがよい。
開発時の受け取り方
Webhook はローカル環境に外部から届かないため、検証にはトンネリングツールや、提供元が用意する CLI を使う。異常系(失敗、返金、期限切れ)を手動で発火できる仕組みがあるサービスなら、本番前にひととおり確認しておきたい。