コンテンツにスキップ

検索はプロダクションビルドでのみ利用可能です。 ローカルでテストするには、サイトをビルドしてプレビューしてください。

Webhook 受信

Speakeasy は purelovers.com からの Webhook を Tap Gateway で受信し、データ同期やイベント処理を行います。


POST /api/v1/webhooks/purelovers
Content-Type: application/json
X-Webhook-Signature: {HMAC-SHA256 署名}

Webhook ペイロードの改ざんを防止するため、HMAC-SHA256 署名を検証します。

const computedSignature = await crypto.subtle.sign(
'HMAC',
await crypto.subtle.importKey(
'raw',
new TextEncoder().encode(env.WEBHOOK_SECRET),
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
),
new TextEncoder().encode(rawBody)
);
// タイミングセーフ比較(タイミング攻撃防止)
const isValid = timingSafeEqual(computedSignature, receivedSignature);

イベント説明処理内容
shop.updated店舗情報の更新店舗キャッシュの無効化
girl.schedule_changedスタッフスケジュール変更チャットルーム通知
girl.createdスタッフ追加キャスト同期
girl.deletedスタッフ削除キャスト同期
review.postedレビュー投稿レビュー通知
user.updatedユーザー情報更新contact_purelovers 更新


{
readonly event: string; // イベント種別
readonly data: unknown; // イベントデータ
readonly timestamp: string; // ISO 8601
readonly webhookId: string; // Webhook ID
}
{
"event": "shop.updated",
"data": {
"shop_id": "shop123",
"name": "店舗名",
"updated_fields": ["name", "address"]
},
"timestamp": "2024-01-15T10:00:00Z"
}
{
"event": "user.updated",
"data": {
"user_id": "user123",
"shop_id": "shop456",
"display_name": "田中太郎",
"profile_image_url": "https://..."
},
"timestamp": "2024-01-15T10:00:00Z"
}

項目実装
認証HMAC-SHA256 署名検証
タイミング攻撃防止定数時間比較(timingSafeEqual)
共有シークレットWEBHOOK_SECRET 環境変数
HTTPSCloudflare Workers で強制

HTTP ステータス状況対応
200処理成功-
401署名検証失敗purelovers 側でリトライ
500サーバーエラーpurelovers 側でリトライ