DOCS

Webhook を使用してイベントをリッスンする

Zonos 統合に関するリアルタイムのイベント通知を取得します。

Webhook は、特定のイベントが発生するたびに、Zonos が外部システムに事前に通知する方法を提供します。サブスクライブされたイベントが発生すると、Zonos は指定した Webhook URL に HTTP POST リクエストを送信します。リクエスト本文にはイベントの詳細が含まれるため、システムはイベントをプログラムで処理できるようになります。

Webhook は、Zonos を他のプラットフォームと統合し、自動化されたワークフローをトリガーし、システム間でリアルタイムでデータの同期を維持するのに役立ちます。たとえば、Webhook を使用して次のことができます。

  • Zonos で注文が作成されたときに、注文管理システムを更新します。
  • 出荷がキャンセルされた場合はフルフィルメントプロバイダーに通知します
  • 監査目的で国際注文のステータス変更をログに記録します

Webhook タイプ 

使用可能なすべての Webhook タイプは、WebhookType 列挙型に含まれています。それぞれのペイロードの例は、イベントタイプ ガイドにあります。

Webhook の作成 

API 経由で Webhook を作成するには:

1mutation WebhookCreate($input: WebhookCreateInput!) {
2 webhookCreate(input: $input) {
3 id
4 url
5 type
6 status
7 secret
8 headers {
9 key
10 }
11 }
12}

Important: Webhookを作成する際は secret の値を必ず保存してください。この値はここでのみ返され、Webhookの署名を検証する際に必要になります。詳しくは、下記のWebhookの署名を検証するを参照してください。

Webhook の詳細を編集する 

API 経由で既存の Webhook を編集するには:

1mutation WebhookUpdate($input: WebhookUpdateInput!) {
2 webhookUpdate(input: $input) {
3 id
4 url
5 type
6 status
7 }
8}

Webhook の署名を検証する 

Zonos が送信するすべての Webhook リクエストには zonos-signature ヘッダーが含まれており、リクエストが実際に Zonos から送信されたこと、および転送中にペイロードが改ざんされていないことを確認できます。

ヘッダーの値は次の形式です。

timestamp=<unix-timestamp-ms>,hmac=<base64-encoded-signature>
  • timestamp — リクエストが署名された時刻(Unix エポックミリ秒)。
  • hmac — Webhook のシークレットをキーとして計算された、生の JSON リクエスト本文の HMAC-SHA256 署名(Base64 エンコード済み)。

リクエストを検証するには:

  1. zonos-signature ヘッダーから timestamphmac の値を解析します。
  2. Webhook を作成したときに受け取ったシークレットを使用して、解析前の生のリクエスト本文に対して独自の HMAC-SHA256 署名を計算します。
  3. 計算した署名を hmac の値と一定時間比較で照合し、一致しない場合はリクエストを拒否します。
  4. 任意で、timestamp が数分以上前のリクエストを拒否し、キャプチャされたリクエストのリプレイを防ぐこともできます。Zonos 自体は配信のタイムウィンドウを強制しないため、このチェックを行うかどうかはお客様次第です。
1const crypto = require('crypto');
2 
3function verifyZonosWebhook(rawBody, signatureHeader, secret) {
4 const [timestampPart, hmacPart] = signatureHeader.split(',');
5 const receivedHmac = hmacPart.split('=')[1];
6 
7 const expectedHmac = crypto
8 .createHmac('sha256', secret)
9 .update(rawBody)
10 .digest('base64');
11 
12 const receivedBuffer = Buffer.from(receivedHmac);
13 const expectedBuffer = Buffer.from(expectedHmac);
14 
15 if (receivedBuffer.length !== expectedBuffer.length) {
16 return false;
17 }
18 
19 return crypto.timingSafeEqual(receivedBuffer, expectedBuffer);
20}

Note: Webhook にカスタムヘッダーを設定している場合、それらのヘッダーは zonos-signature と共にすべてのリクエストにそのまま含まれます。

Webhook ログを表示する 

API 経由で Webhook ログを表示するには:

1query WebhookLogs(
2$first: Int
3$after: String
4$filter: WebhookLogsFilterInput
5) {
6 webhookLogs(first: $first, after: $after, filter: $filter) {
7 edges {
8 node {
9 id
10 type
11 url
12 createdAt
13 responseStatus
14 }
15 }
16 }
17}
GraphQL API ReferenceTypes, inputs, and operations used in this guide

このページは役に立ちましたか?