Gelen webhook
Gelen webhook, siteniz “bu sipariş değişti” dediğinde sipariş kaydının anında tazelenmesini sağlar; asistan müşteriye en güncel durumu söyler. Ayar Ayarlar → Gelen webhook sayfasındadır.
Kurulum
Bölüm başlığı “Kurulum”- Gizli anahtar oluştur. Anahtar (
whsec_…) bir kez gösterilir. Yenilerseniz eskisi hemen geçersiz olur. Firma başına tek bir gizli anahtar vardır; her iki kaynak da onu kullanır. - Sayfadaki adreslerden birini kullanın:
- WooCommerce:
https://<konsol-adresiniz>/hooks/<firma>/woocommerce - Kendi sisteminiz:
https://<konsol-adresiniz>/hooks/<firma>/generic
- WooCommerce:
WordPress yönetiminde WooCommerce → Ayarlar → Gelişmiş → Webhook’lar → Webhook ekle:
| Alan | Değer |
|---|---|
| Konu | Sipariş güncellendi (ayrıca bir webhook daha: Sipariş oluşturuldu). Anında fiyat için isteğe bağlı: Ürün güncellendi, Ürün oluşturuldu, Ürün silindi |
| Teslimat URL’si | …/hooks/<firma>/woocommerce |
| Gizli | Zitena’daki gizli anahtar |
| API sürümü | WP REST API v3 |
- İmza
X-WC-Webhook-Signature(gövdenin HMAC-SHA256’sı, base64) ile doğrulanır. order.created,order.updated,order.restoredve ürün konuları (product.created,product.updated,product.deleted,product.restored,product.published) işlenir; diğer konular{"ok": true, "ignored": "<konu>"}ile yok sayılır.- Ürün konusunda gövdeye güvenilmez: ürün mağazadan yeniden okunur ve katalogda hemen güncellenir. Mağazada bulunamayan ürün pasif olur.
- Sipariş gövdesi doğrudan kayda yazılır; ayrıştırılamazsa sipariş mağazadan tek istekle yeniden okunur.
- WooCommerce’in webhook kaydederken gönderdiği imzasız ping etkisizdir.
Gövde, Veri API ile aynı sipariş biçimindedir (ApiOrder):
{"id": "evt-0001", "event": "order.updated", "order": {"external_id": "98765", "status": "shipped", "created_at": "2026-09-24T10:15:00+03:00", "modified_at": "2026-09-24T15:00:00+03:00", "carrier": "Örnek Kargo", "tracking_number": "123456789012"}}Birden fazla sipariş için "orders": [ … ] (en çok 1000). id teslimat kimliğidir (yoksa X-Zitena-Delivery başlığı kullanılır).
İmza, giden webhook’larla aynı şemadır:
X-Zitena-Signature: t=<unix saniye>,v1=<hex(HMAC-SHA256(gizli, "<t>.<ham gövde>"))>SECRET=whsec_xxxBODY='{"id": "evt-0001", "event": "order.updated", "order": {"external_id": "98765", "status": "shipped", "created_at": "2026-09-24T10:15:00+03:00", "modified_at": "2026-09-24T15:00:00+03:00"}}'TS=$(date +%s)SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | sed 's/^.* //')curl -s -X POST "$RZ_API/hooks/firma/generic" -H "Content-Type: application/json" \ -H "X-Zitena-Signature: t=$TS,v1=$SIG" -d "$BODY"# {"ok": true, "orders": 1, "inserted": 0, "updated": 1, "unchanged": 0}import crypto from 'node:crypto';const body = JSON.stringify({ id: `evt-${orderId}-${modifiedAt}`, event: 'order.updated', order });const t = Math.floor(Date.now() / 1000);const v1 = crypto.createHmac('sha256', process.env.RZ_INBOUND_SECRET).update(`${t}.${body}`).digest('hex');await fetch(`${process.env.RZ_API}/hooks/firma/generic`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Zitena-Signature': `t=${t},v1=${v1}` }, body,});Yanıtlar
Bölüm başlığı “Yanıtlar”| Durum | Gövde | Anlamı |
|---|---|---|
| 200 | {"ok": true, "orders": 1, "inserted": 0, "updated": 1, "unchanged": 0} | İşlendi |
| 200 | {"ok": true, "duplicate": true} | Aynı teslimat kimliği 24 saat içinde zaten işlendi |
| 401 | invalid_signature | İmza yanlış ya da zaman damgası ±300 sn dışında |
| 404 | not_found | Firma, kaynak ya da gizli anahtar tanımlı değil (firmanın varlığı sızdırılmaz) |
| 413 | payload_too_large | Gövde 5 MB’ı aşıyor |
| 422 | invalid_json, invalid_order ya da alan listesi | Gövde geçersiz |
| 503 | store_unavailable | WooCommerce gövdesi ayrıştırılamadı ve mağazaya ulaşılamadı |
Aynı teslimat kimliği 24 saat içinde ikinci kez işlenmez: güvenle yeniden gönderebilirsiniz. İmza doğrulanmadan teslimat kimliği kaydedilmez; sahte bir istek gerçek bir teslimatı engelleyemez. Gizli değer ve sipariş içeriği loglanmaz.
© 2026 Erusoft