Webhooks

Webhooks

HeptaCert, belirli olaylar gerçekleştiğinde HTTP POST isteği göndererek sistemlerinizi gerçek zamanlı olarak tetikleyebilir.

Webhook Oluşturma

Admin paneli → Webhooks sayfasından URL ve dinlenecek olayları seçin.

Olaylar

OlayTetiklenme
attendee.registeredYeni katılımcı kaydolduğunda
attendee.checkinKatılımcı check-in yaptığında
certificate.issuedSertifika yayımlandığında
certificate.revokedSertifika iptal edildiğinde
event.createdYeni etkinlik oluşturulduğunda
event.updatedEtkinlik bilgileri güncellendiğinde
payment.completedÖdeme tamamlandığında

Payload Formatı

{
  "event": "certificate.issued",
  "timestamp": "2026-09-15T10:30:00Z",
  "data": {
    "certificate_id": 9001,
    "public_id": "abc123xyz",
    "attendee_name": "Ahmet Yılmaz",
    "attendee_email": "ahmet@example.com",
    "event_id": 42,
    "event_name": "Python Summit 2026",
    "cert_url": "https://heptacert.com/c/abc123xyz",
    "issued_at": "2026-09-15T10:30:00Z"
  }
}

İmza Doğrulama

Her webhook isteği X-HeptaCert-Signature başlığı içerir. Bu başlık, payload'ın HMAC-SHA256 imzasıdır.

import hashlib
import hmac
 
def verify_webhook(payload_bytes: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode(),
        payload_bytes,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)
⚠️

hmac.compare_digest kullanın — timing attack'lardan korur.

Express.js Örneği

const express = require("express");
const crypto = require("crypto");
 
const app = express();
app.use(express.raw({ type: "application/json" }));
 
app.post("/webhooks/heptacert", (req, res) => {
  const sig = req.headers["x-heptacert-signature"];
  const expected = crypto
    .createHmac("sha256", process.env.WEBHOOK_SECRET)
    .update(req.body)
    .digest("hex");
 
  if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
    return res.status(401).send("Invalid signature");
  }
 
  const payload = JSON.parse(req.body);
  console.log("Webhook alındı:", payload.event);
 
  if (payload.event === "certificate.issued") {
    // CRM'e bildir, Slack'e mesaj gönder, vs.
  }
 
  res.sendStatus(200);
});

Yeniden Deneme Politikası

Endpoint 2xx dışında bir yanıt döndürürse veya 10 saniye içinde yanıt vermezse HeptaCert şu aralıklarla yeniden dener:

DenemeBekleme
1.Hemen
2.5 dakika
3.30 dakika
4.2 saat
5.24 saat

5 başarısız denemeden sonra webhook devre dışı bırakılır ve bildirim e-postası gönderilir.

Test Etme

Webhook sayfasında Test Gönder butonunu kullanarak örnek bir payload gönderebilirsiniz.

Ya da ngrok ile lokal geliştirme ortamını dışarıya açın:

ngrok http 3000
# https://xxxx.ngrok.io → localhost:3000