跳至主要内容

網路鉤子 (Webhook)

Webhook 使用方法​

您可以註冊網路鉤子,讓應用程式即時接收 Gency 內部發生的事件。

網路鉤子註冊​

在 API 中心點擊 建立新網路鉤子 並輸入以下項目。

  • 名稱(必填,最多 100 字):可識別網路鉤子的名稱
  • URL(必填,僅允許 HTTPS,最多 500 字):事件發生時發送 POST 請求的端點
  • 訂閱事件:以核取方塊選擇要接收的事件類型

支援的事件類型​

事件說明
product.created商品已建立
product.deleted商品已刪除
product.pending_review已變更為待檢核狀態
product.in_review已變更為檢核進行中
product.review_completed檢核已完成
product.creation_failed商品建立失敗

事件酬載​

事件發生時會向已註冊的 URL 發送以下格式的 POST 請求。event 欄位為共通,data 內部結構會依事件類型而不同。

product.pending_review / product.in_review / product.review_completed​

商品的檢核狀態變更時發送。

{
"event": "product.review_completed",
"data": {
"products": [
{
"workspaceId": "01HABC...",
"productId": "01HXYZ...",
"projectId": "my-project-01",
"productName": "겨울 패딩 자켓",
"status": "REVIEW_COMPLETE",
"category": "OUTER",
"productType": "FASHION",
"createdId": "01HUSR...",
"createdAt": "2025-01-01T00:00:00+09:00"
}
]
}
}
欄位類型說明
productsArray狀態變更的商品清單
products[].workspaceIdString工作區 ID
products[].productIdString商品 ID
products[].projectIdString管理名稱
products[].productNameString商品名稱
products[].statusString變更後的狀態 (BEFORE_REVIEW: 檢核前, IN_REVIEW: 檢核中, REVIEW_COMPLETE: 檢核完成, CREATION_FAILED: 建立失敗)
products[].categoryString類別
products[].productTypeString商品類型 (FASHION, JEWELRY)
products[].createdIdString建立者 ID
products[].createdAtString建立日期時間 (ISO 8601)

product.created​

商品建立時發送。

{
"event": "product.created",
"data": {
"products": [
{
"workspaceId": "01HABC...",
"productId": "01HXYZ...",
"projectId": "my-project-01",
"productName": "겨울 패딩 자켓",
"status": "BEFORE_REVIEW",
"category": "OUTER",
"productType": "FASHION",
"createdId": "01HUSR...",
"createdAt": "2025-01-01T00:00:00+09:00"
}
]
}
}

product.creation_failed​

商品建立失敗時發送。

{
"event": "product.creation_failed",
"data": {
"products": [
{
"workspaceId": "01HABC...",
"productId": "01HXYZ...",
"projectId": "my-project-01",
"productName": "겨울 패딩 자켓",
"status": "CREATION_FAILED",
"category": "OUTER",
"productType": "FASHION",
"createdId": "01HUSR...",
"createdAt": "2025-01-01T00:00:00+09:00"
}
]
}
}

酬載結構與狀態變更事件相同。status 會設定為 PRODUCT_STATUS_05(建立失敗)。

product.deleted​

商品刪除時發送。

{
"event": "product.deleted",
"data": {
"products": [
{
"workspaceId": "01HABC...",
"productId": "01HXYZ...",
"productName": "겨울 패딩 자켓"
}
]
}
}
欄位類型說明
productsArray已刪除的商品清單
products[].workspaceIdString工作區 ID
products[].productIdString商品 ID
products[].productNameString商品名稱

重試策略​

網路鉤子發送失敗時,系統會自動重試。包含最初發送在內最多嘗試 5次(最初 1 次 + 重試 4 次),並以 指數退避 方式拉長間隔。

  • 成功基準:HTTP 回應代碼 200 ~ 299
  • 失敗處理:上述範圍外的回應代碼、逾時(30 秒)、網路錯誤等皆視為失敗。
  • 5 次重試全部失敗時,該次遞送即處理為 最終失敗。
  • 所有嘗試的遞送紀錄(HTTP 狀態代碼、回應時間、錯誤訊息)會保存 30 天。

網路鉤子註冊限制​

每個 master 最多可註冊 10 個 網路鉤子。已刪除的網路鉤子不計入數量,因此達到上限時,刪除未使用的網路鉤子即可重新註冊。

簽章驗證(選用)​

建立網路鉤子時會自動發行 Signing Secret(whsec_{32자 랜덤문자열} 格式)。簽章驗證並非必要,但為了防止偽造的請求,建議在正式環境中進行驗證。

每個網路鉤子請求皆包含以下標頭。

標頭說明
X-Webhook-Signaturesha256={HMAC-SHA256 서명값}
X-Webhook-Timestamp請求發送時間 (Unix timestamp)
Content-Typeapplication/json

驗證方法:

  1. 從 X-Webhook-Timestamp 標頭擷取時間戳記。
  2. 以 {타임스탬프}.{요청 body} 格式建立簽章對象訊息。
  3. 以 Signing Secret 作為金鑰計算 HMAC-SHA256 簽章。
  4. 比對計算出的簽章與 X-Webhook-Signature 標頭的值。
// 검증 예시 (Java)
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;

public boolean verifyWebhook(String payload, String timestamp, String signature, String secret) {
String message = timestamp + "." + payload;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(), "HmacSHA256"));
byte[] hash = mac.doFinal(message.getBytes());
StringBuilder hex = new StringBuilder();
for (byte b : hash) {
hex.append(String.format("%02x", b));
}
String expected = "sha256=" + hex.toString();
return MessageDigest.isEqual(expected.getBytes(), signature.getBytes());
}

Secret 重新發行​

點擊 Secret 重新發行 按鈕後會發行新的 Signing Secret。既有密鑰會立即失效,因此須在新密鑰套用至伺服器後再使用。

狀態管理​

網路鉤子可具有以下狀態。

狀態說明
ACTIVE事件發生時正常發送
INACTIVE暫停事件發送

若想暫時中斷網路鉤子的接收,可將其停用;若刪除則會完全移除。