Bir Restomenum eklentisinin nasıl çalıştığının kuş bakışı haritası: kurulum/kimlik, Restomenum ↔ eklenti iletişiminin yönleri, scope/consent, imzalama ve yaşam döngüsü. Her kavram ilgili detay sayfasına bağlıdır.
Uçtan uca ilk eklenti için: Hızlı Başlangıç.
Eklenti (senin sistemin: webhookUrl · connectUrl · actionUrl — hepsi TEK domain)
▲ │
(3) │ │ Restomenum → eklenti
webhook│ ├─ webhook event'leri (async) /docs/events
imzalı │ ├─ lifecycle webhook'ları (async) /docs/lifecycle
│ ├─ hook/gate çağrısı (senkron) /docs/hooks
│ └─ aksiyon butonu POST (senkron) /docs/buttons
│ ▼
Restomenum (panel + runtime)
▲
(4) │ eklenti → Restomenum
Bearer │ ├─ Veri API (oku) /docs/api
apiKey │ └─ packets/create (yaz) /docs/api/packets-create
│
(1)(2) Kurulum: OAuth Connect → Token Exchange → { tenantId, apiKey, webhookSecret, scopes }Eklentin kendi sunucundur (kayıtlı bir domain altında webhookUrl, connectUrl, actionUrl + iframe UI origin'i). Restomenum ile iki yönde konuşur; hangi veriyi okuyabildiğini/ne yapabildiğini scope'lar belirler.
Tenant eklentini kurarken OAuth Connect akışı çalışır; dönen tek-kullanımlık code'u Token Exchange ile kalıcı dört değere çevirirsin ve tenant başına saklarsın:
| Değer | Ne için |
|---|---|
| tenantId | Kurulumun kimliği (her event/çağrı bununla eşlenir) |
| apiKey | Veri API çağrılarında Authorization: Bearer (serverId.pluginId.secret) |
| webhookSecret | webhook/hook imza doğrulaması + session token doğrulaması (HMAC) |
| scopes | Tenant'ın gerçekten onayladığı yetkiler (manifest'te istediğinin alt kümesi olabilir) |
Kurulum/abonelik durumu ayrıca Lifecycle Webhook'ları ile bildirilir (install/uninstall, subscription) — bunlara abone olmazsın, her bağlı kuruluma gelir.
packet.created…). Manifest events[] + events:subscribe ister. Event Kataloğu.allow/deny dönersin. Hook'lar.actionUrl'ine POST eder. Butonlar.X-Restomenum-Signature, HMAC, ±5 dk). Gelen her isteği ham gövde üzerinden doğrula; geçersizse 401 dön. İmza şeması.GET {RESTOMENUM_BASE}/plugin-api/…, Authorization: Bearer apiKey. API Uçları.POST /plugin-api/packets/create (orders:write). Fiyat sunucuda hesaplanır; idempotencyKey ile retry-güvenli.webhookSecret ile imzalı) ile kendi backend'inize güvenli çağrı yapar.customers:read, users:read) ek consent ister. Scope Referansı.webhookUrl + connectUrl + actionUrl + tüm UI origin'leri aynı registered domain altında olmalı. iframe Güvenliği.target.id verir; dolu veriyi Data API'den çekersin (opt-in includeData hariç).id'si var; retry'da tekrar gelir → id ile dedup.