Ugrás a fő tartalomra
Certyneo
Fejlesztő dokumentáció

Webhooks kapja meg a valós idejű aláírási eseményeket

A Certyneo-nál beállítson egy HTTPS URL-t, és kapjon egy HMAC-SHA256-os aláírt POST-t, amint az üzeneteken esemény történik: aláírás, elutasítás, lejárt. 8 támogatott esemény, exponenciális újrapróbálás 6 próbálkozás után, 8 soros kódkód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-kód-k

< 5s

Az esemény utáni átlagos átviteli idő

5x

Megpróbálások, ha nem sikerül (~ 9 óráig)

HMAC-SHA256

Minden egyes kérés aláírási algoritmusa

Az események katalógusa

A következő 8 esemény egy Certyneo boríték teljes életciklusát lefedi. Aktiváld azokat, amelyek érdekelnek a Beállítások → Webhooks, figyelj el a többieket a feliratkozás eseményenként granuláris.

EseményKiindulás
envelope.createdEgy borítékot hoznak létre (UI, API vagy sablon segítségével) ami a CRM oldalról történő bejegyzés létrehozásakor használható.
envelope.sentA boríték elküldésre kerül a aláírókhoz (első e-mail küldése).
envelope.completedAz eIDAS-t lezárt PDF és az audit nyomvonal elérhető a `proof_pdf_url` segítségével a betöltött teremben.
envelope.declinedA megtagadás oka (ha a aláíró adja) a `data.decline_reason`-ban található.
envelope.voidedA borítékot az adásadó törölte, mielőtt a teljes aláírás megtörtént volna.
envelope.expiredA levél lejárati dátuma teljes aláírás nélkül telt el. A hiányzó aláírók listája a `data.missing_signers`-ban található.
recipient.signedAz egyik aláíró (de nem feltétlenül mindenki) aláírta. Hasznos a sorrendű munkafolyamatokhoz: a következő aláíróhoz való átlépés.
recipient.viewedEgy aláíró nyitotta meg a aláírási linket, még nem írt alá, ami hasznos a célzott kereskedelmi fellendítésekhez.

Használati teher formátuma

Az események mindegyike ugyanazt a top-level JSON-szerkezetet használja: `event`, `envelope_id`, `occurred_at`, `data`.

{
  "event": "envelope.completed",
  "envelope_id": "env_01HG3K8X9Y2N4P5Q6R7S8T9V0W",
  "occurred_at": "2026-05-27T08:42:13.521Z",
  "data": {
    "title": "Contrat de prestation Acme Corp",
    "status": "completed",
    "created_at": "2026-05-24T14:12:00.000Z",
    "completed_at": "2026-05-27T08:42:13.000Z",
    "signers": [
      {
        "email": "client@acme.example",
        "name": "Alex Client",
        "signed_at": "2026-05-27T08:42:13.000Z",
        "method": "eidas_aes",
        "ip": "203.0.113.42"
      }
    ],
    "proof_pdf_url": "https://certyneo.com/api/envelopes/env_01HG.../proof.pdf"
  }
}

A HMAC aláírás a brutális testre számít, ahogy elküldtük ne változtassuk meg a réseket, a JSON újraparsolás gyakran megváltoztatja a kulcsok sorrendjét és megszakítja a hitelesítést.

Ellenőrizni a HMAC aláírást

Minden kérést aláírnak a webhook titkoddal (egy alkalommal látható, amikor a műszerfalban hozol létre, majd nyugalom alatt titkosítva).<timestamp>,v1=<hex_hmac>`. Mindig ellenőrizze a aláírást, mielőtt feldolgozza a célt e lépés nélkül bárki hamisíthatja az eseményt és hívhatja a végpontot.

Node.js / TypeScript

import crypto from "node:crypto";

export function verifyCertyneoSignature(
  rawBody: string,
  signatureHeader: string,
  secret: string,
): boolean {
  // Header format: t=<timestamp>,v1=<hex_hmac>
  const parts = Object.fromEntries(
    signatureHeader.split(",").map((p) => p.split("=")),
  );
  const ts = parts.t;
  const sig = parts.v1;
  if (!ts || !sig) return false;

  // Reject events older than 5 minutes (replay protection).
  const age = Math.abs(Date.now() / 1000 - Number(ts));
  if (age > 300) return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${ts}.${rawBody}`)
    .digest("hex");

  // timingSafeEqual to mitigate timing attacks.
  return crypto.timingSafeEqual(
    Buffer.from(expected, "hex"),
    Buffer.from(sig, "hex"),
  );
}

Python

import hashlib
import hmac
import time


def verify_certyneo_signature(
    raw_body: bytes, signature_header: str, secret: str
) -> bool:
    """Verify a Certyneo webhook signature.

    Header format: `t=<timestamp>,v1=<hex_hmac>`
    Rejects events older than 5 minutes (replay protection).
    """
    parts = dict(p.split("=") for p in signature_header.split(","))
    ts = parts.get("t")
    sig = parts.get("v1")
    if not ts or not sig:
        return False

    if abs(time.time() - int(ts)) > 300:
        return False

    expected = hmac.new(
        secret.encode("utf-8"),
        f"{ts}.{raw_body.decode('utf-8')}".encode("utf-8"),
        hashlib.sha256,
    ).hexdigest()

    return hmac.compare_digest(expected, sig)

Gyakori hiba

Ne használd a `===` vagy `==` funkciót a várt és a kapott aláírás összehasonlítására. Használd a time-safe funkciót (`crypto.timingSafeEqual` Node, `hmac.compare_digest` Python).

Újrapróbálási politika

Ha a végpontja nem HTTP 2xx (időszámítás, 5xx, kapcsolat elutasítás) válaszolt, akkor exponenciális visszavonáson keresztül csengünk. Összesen 6 kísérlet ~9 óra alatt. A 6 után az esemény `elhibázott` jelölésre kerül a webhook-pultján, és egy figyelmeztető e-mailt küldünk.

MegpróbálvaÖsszes időtartamEltelt idő
#100
#2+ 1 min1 min
#3+ 5 min6 min
#4+ 30 min36 min
#5+ 2 h2h 36
#6+ 6 h8h 36

Ha kézzel szeretné továbbítani a hibás eseményeket, a webhook panel egy Újraadás gombot kínál minden hibás szállításon a végleges hibás után 7 napig elérhető.

A valódi boríték elküldése nélkül tesztelni

A `/v1/webhooks/test` végpont elfogad egy URL-t és egy eseménytípust, és egy fiktív, pontosan valódi aláírású használati terhet POSTál. Ideális a kezelő folyamatos integrációban vagy helyi fejlesztés során való érvényesítéshez (ngrok vagy azzal egyenértékű).

# Trigger a test webhook to your endpoint
curl -X POST https://api.certyneo.com/v1/webhooks/test \
  -H "Authorization: Bearer $CERTYNEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event": "envelope.completed", "url": "https://your.app/webhooks/certyneo"}'

6 gyakorlat

  • A HMAC-jelet ellenőrizni a testből való olvasás előtt időbiztonságos összehasonlítást használni.
  • Minden `envelope_id` × `event`-t csak egyszer kezelni, a már a bázisban látott ID-ket tárolva (a visszaküldések ugyanazt az eseményt újra el tudják adni).
  • A HTTP 200-as válasz maximálisan 5 másodperc alatt, majd aszinkron (sorban) feldolgozás. Ellenkező esetben időzítés alatt marad és újrapróbálásnak számít.
  • A brut testfelvétel + a teljes aláírás hibaelhárítás a HMAC ellenőrzés gyakran nem sikerül a láthatatlan BOM-on vagy fehérhelyeken.
  • Kapcsolja be a "nem sikerült" események sorát, hogy a szolgálatnál esetlegesen manuálisan továbbítsák.
  • Tűrje el a 5 perces eltéréset a `t=` és a átvételi idő között, és utasítsa el, hogy blokkolja a replay-kat.

Tovább kell mennünk.

Készen álltok a rendszerek csatlakoztatására?

2 perc alatt készítsen ingyenes fiókot a webhook beállítása a Starter tervből kezdve elérhető (ingyenes, 5 boríték/hónap).