Webhookのセットアップ
OmiseダッシュボードでWebhookエンドポイントを構成し、リアルタイム支払いイベント通知を受け取るようにサーバーをセットアップする方法を学習します。
概要
Webhookにより、Omiseはアカウント内のイベントが発生するときにリアルタイム通知をサーバーにプッシュできます。このガイドでは以下をカバーしています:
- ダッシュボードでWebhookエンドポイントを作成および構成
- セキュアなHTTPSエンドポイントをセットアップ
- ngrokを使用したローカルテスト
- 複数エンドポイントを管理
- Webhook構成を検証
ダッシュボード構成
Webhookエンドポイントを作成
OmiseダッシュボードでWebhookエンドポイントを作成するには、次の手順に従います:
-
Webhook設定に移動
- Omiseダッシュボードにログイン
- 設定 > Webhookに移動
- Webhookを作成ボタンをクリック
-
エンドポイントURLを構成
- HTTPSエンドポイントURLを入力 (例:
https://api.example.com/webhooks/omise) - エンドポイントがインターネットからアクセス可能であることを確認
- エンドポイントはPOSTリクエストを受け入れる必要があります
- HTTPSエンドポイントURLを入力 (例:
-
購読するイベントを選択
- すべてのイベントを選択してすべてのWebhook通知を受け取る
- または特定のイベントを選択 (charge.create、charge.complete、refund.create など)
- イベント購読はいつでも変更できます
-
保存およびWebhookキーを取得
- 作成をクリックしてWebhookエンドポイントを生成
- Webhook署名キーをコピーして安全に保存
- このキーはWebhookシグネチ ャを検証するために使用されます (1回だけ表示されます)
ダッシュボードインターフェース要素
Webhook構成ページには以下が表示されます:
- エンドポイントURL: Webhookイベントの送信先
- ステータス: アクティブ/非アクティブトグル
- イベント: 購読済みイベントタイプのリスト
- 最近の配信: 最近のWebhook試行ログとレスポンスコード
- 署名キー: HMAC-SHA256シグネチャ検証に使用
複数エンドポイントを管理
異なる目的で複数のWebhookエンドポイントを構成できます:
本番環境エンドポイント:
URL: https://api.example.com/webhooks/omise
イベント: すべてのイベント
ステータス: アクティブ
バックアップエンドポイント:
URL: https://backup.example.com/webhooks/omise
イベント: 重要なイベントのみ (charge.complete、refund.create)
ステータス: アクティブ
分析エンドポイント:
URL: https://analytics.example.com/webhooks/omise
イベント: すべてのイベント
ステータス: アクティブ
複数エンドポイント用のベストプラクティス:
- 本番環境、ステージング、開発用に別々のエンドポイントを使用
- 異なるサービス (会計、分析、通知) 用に専用エンドポイントを作成
- 各エンドポイントの配信成功率を監視
- 未使用のエンドポイントを無効化してノイズを減らす
エンドポイント要件
HTTPSとSSL/TLS
すべてのWebhookエンドポイントはこれらのセキュリティ要件を満たす必要があります:
必須:
- HTTPSプロトコル (HTTPはサポートされていません)
- 信頼されたCAからの有効なSSL/TLS証明書
- TLS 1.2以上
- 強力な暗号スイート
推奨:
- Let's Encrypt、DigiCertなどの信頼されたCAからの証明書
- 自動証明書更新
- HSTS (HTTP Strict Transport Security)ヘッダー
# Nginx SSL構成例
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /webhooks/omise {
proxy_pass http://localhost:3000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
レスポンス要件
エンドポイントはWebhook配信に正しくレスポンスする必要があります:
成功レスポンス:
- HTTPステータスコード: 200-299 (200 OKを推奨)
- 10秒以内にレスポンス
- 処理を待たずに迅速にレスポンス
失敗レスポンス:
- HTTPステータスコード: 400-599は自動再試行をトリガー
- 200-299以外のステータスコードは失敗と見なされます
// Node.js/Express例
app.post('/webhooks/omise', async (req, res) => {
try {
// まずシグネチャを検証
const isValid = verifySignature(req);
if (!isValid) {
return res.status(401).json({ error: 'Invalid signature' });
}
// 迅速にレスポンス (処理を待たない)
res.status(200).json({ received: true });
// Webhookを非同期で処理
processWebhookAsync(req.body);
} catch (error) {
console.error('Webhook error:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
# Python/Flask例
@app.route('/webhooks/omise', methods=['POST'])
def handle_webhook():
try:
# まずシグネチャを検証
if not verify_signature(request):
return jsonify({'error': 'Invalid signature'}), 401
# 迅速にレスポンス
response = jsonify({'received': True})
# Webhookを非同期で処理
process_webhook_async(request.json)
return response, 200
except Exception as e:
logging.error(f'Webhook error: {e}')
return jsonify({'error': 'Internal server error'}), 500