Webhook Events
BaZaaRDan webhook sistemi, sipariş, stok, kargo, iade ve benzeri olayları partner uygulamalara otomatik olarak gönderir. Böylece ERP veya muhasebe sistemleri sürekli sipariş sorgulamak zorunda kalmaz.
Webhook gönderimleri imzalıdır. Partner sistemler gelen istekteki imzayı doğrulamalıdır.
Webhook Flow
- BaZaaRDan içinde bir olay oluşur. Örnek:
order.created - Event
seller_webhook_eventskuyruğuna yazılır. - Aktif webhook endpointler için delivery kayıtları oluşur.
- Cron worker pending delivery kayıtlarını işler.
- Partner webhook URL’sine imzalı POST gönderilir.
- 2xx cevap alınırsa delivery
successolur. - Tüm delivery’ler başarılıysa event
sentolur.
Supported Events
| Event | Resource | Açıklama |
|---|---|---|
order.created |
order_item | Yeni sipariş kalemi oluştuğunda gönderilir. |
order.updated |
order_item | Sipariş durumu veya temel bilgileri değiştiğinde gönderilir. |
stock.updated |
product | Ürün stoğu güncellendiğinde gönderilir. |
shipment.updated |
shipment | Kargo durumu değiştiğinde gönderilir. |
return.requested |
return_request | Müşteri iade talebi oluşturduğunda gönderilir. |
Webhook Headers
| Header | Açıklama |
|---|---|
Content-Type |
application/json |
X-BZ-WEBHOOK-ID |
Delivery ID değeridir. |
X-BZ-WEBHOOK-TIMESTAMP |
Unix timestamp değeridir. |
X-BZ-WEBHOOK-SIGNATURE |
HMAC SHA256 webhook imzasıdır. |
X-BZ-WEBHOOK-EVENT |
Event adıdır. Örnek: order.created |
Payload Format
Webhook Payload
{
"id": "evt_4",
"type": "order.created",
"resource_type": "order_item",
"resource_id": 124,
"seller_id": 5,
"created_at": "2026-05-08 21:50:29",
"data": {
"order_item_id": 124,
"message": "Test order.created event"
}
}Signature Verification
Webhook imzası aşağıdaki veri üzerinden oluşturulur:
Signing String
TIMESTAMP
WEBHOOK_ID
RAW_BODY_SHA256Partner sistem, gelen request body’sini değiştirmeden ham haliyle okumalı ve aynı imzayı üretmelidir.
PHP Verification Example
<?php
$timestamp = $_SERVER["HTTP_X_BZ_WEBHOOK_TIMESTAMP"] ?? "";
$signature = $_SERVER["HTTP_X_BZ_WEBHOOK_SIGNATURE"] ?? "";
$rawBody = file_get_contents("php://input");
$expected = hash_hmac(
"sha256",
$timestamp . "." . $rawBody,
$webhookSecret
);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
echo "Invalid signature";
exit;
}
http_response_code(200);
echo "OK";Node.js Verification Example
Node.js Verification
const crypto = require("crypto");
function verifyWebhook(req, rawBody, webhookSecret) {
const timestamp = req.headers["x-bzr-webhook-timestamp"];
const signature = req.headers["x-bzr-webhook-signature"];
const expected = crypto
.createHmac("sha256", webhookSecret)
.update(timestamp + "." + rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}Retry Policy
Partner endpoint 2xx dışında cevap verirse veya timeout olursa delivery tekrar denenir.
| Deneme | Bekleme Süresi |
|---|---|
| 1. başarısızlık | 5 dakika |
| 2. başarısızlık | 15 dakika |
| 3. başarısızlık | 60 dakika |
| Sonraki denemeler | 180 dakika |
Varsayılan maksimum deneme sayısı 5’tir. Maksimum deneme sonrası delivery
failed durumunda kalır.
Status Lifecycle
Webhook Endpoint Requirements
| Kural | Açıklama |
|---|---|
| HTTPS zorunlu | Production webhook URL mutlaka HTTPS olmalıdır. |
| 2xx cevap | Başarılı kabul edilmesi için 200-299 arası HTTP kodu dönmelidir. |
| Hızlı cevap | Endpoint mümkünse 5 saniye içinde cevap vermelidir. |
| Idempotent işlem | Aynı webhook tekrar gelebilir. Partner sistem duplicate kontrolü yapmalıdır. |
| Signature doğrulama | Güvenlik için gelen imza kontrol edilmelidir. |
Webhook.site ile Test
Test için webhook.site kullanılabilir.
Test Steps
1. https://webhook.site adresine girin.
2. Size özel URL oluşur.
3. Bu URL’yi Developer Portal webhook endpoint alanına girin.
4. Test event gönderin.
5. Gelen request içindeki headers ve body alanlarını kontrol edin.Example Delivery Headers
Headers
Content-Type: application/json
X-BZ-WEBHOOK-ID: 12
X-BZ-WEBHOOK-TIMESTAMP: 1778267401
X-BZ-WEBHOOK-SIGNATURE: 4f6a...
X-BZ-WEBHOOK-EVENT: order.createdSecurity Notes
Webhook secret güvenli saklanmalıdır. Secret public frontend kodlarında, mobil uygulamalarda veya loglarda tutulmamalıdır.
Replay attack riskini azaltmak için timestamp çok eskiyse request reddedilmelidir. Önerilen tolerans: 5 dakika.