Siirdu põhisisu juurde
Certyneo
Arendaja dokumentatsioon

Webhooks saada realtime allkirjastamise sündmused

Korda oma Certyneo paneelile HTTPS URL ja saa HMAC-SHA256 allkirjastatud POST, kui teie ümbrikus toimub sündmus: allkirjastamine, keeldumine, aegumine. 8 toetatud sündmust, eksponeentaalne korduskäik 6 katse korral, 8 koodrežiimi krüptograafiline kontroll.

< 5s

Keskmine toimimiskuupäev pärast sündmust

5x

Katse ebaõnnestumisel (kuni ~ 9h hiljem)

HMAC-SHA256

Iga taotluse allkirjastamise algoritm

Sündmuste kataloog

Allpool esitatud 8 sündmust hõlmavad Certyneo-pakendi kogu elutsüklit.

SündmusSünnitus
envelope.createdLoodakse ümbrik (UI, API või malli abil) kasulik CRM-poolsete salvestiste sünkroniseerimiseks.
envelope.sentPakk saadetakse allkirjastanutele (esimene saadetud e-kiri).
envelope.completedKõik allkirjastanud on allkirjastanud. eIDASi suletud PDF ja auditi jälg on saadaval payloadis `proof_pdf_url`.
envelope.declinedAllakirjutanu keeldus pakendist.Keelutamise põhjus (kui allkirjastanud) on kirjas `data.decline_reason`.
envelope.voidedPakk on emitendi poolt tühistatud enne täielikku allkirjastamist.
envelope.expiredKonverentsi kehtivusaeg on möödas ilma täieliku allkirjastamiseta.
recipient.signedKasulik järjestikuste töövoogude jaoks: käivitada üleminek järgmisele allkirjasturile.
recipient.viewedÜks allkirjastanud avas allkirjastamise linki, ilma et oleks veel allkirjastanud.

Kasuliku laeva suurus

Kõik sündmused jagavad sama JSONi tipptasemel šemaat: `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"
  }
}

HMAC allkiri arvutatakse kehalise keha kohta nii, nagu saadetud ei muuda ruume, JSON-i uuesti analüüsimine muudab sageli võtmete järjestust ja rikub kontrollimise.

Kontrolli HMAC allkirja

Iga päring allkirjastatakse teie webhooki salajasusega (nähtatav vaid üks kord, kui seda paneelile luuakse, seejärel on see endal salastatud).<timestamp>V1=<hex_hmac>Kontrollige alati allkirja enne laeva töötlemist. Ilma selle sammuna võib igaüks ürituse võltsida ja teie lõpppunkti kutsuda.

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)

Sageli esinev viga

Kasuta `===` või `==`, et võrrelda oodatavat ja saadud allkirja. Kasuta `crypto.timingSafeEqual` (Node, Python) funktsiooni. Vastasel juhul näitab kahe allkirja võrdlemise aja vahe aeglaselt saladust talupidavale ründajale (timing attack).

Uurimispoliitika

Kui teie lõpppunkt vastab teisele kui HTTP 2xx (timeout, 5xx, connection refused) sõnumile, siis me helistame eksponentsiaalse tagasilükkamise järgi. Kokku 6 katset ~9 tunni jooksul. Pärast 6 üritust märgitakse sündmus `failed` teie veebisühenduse paneelil ja saadetakse hoiatus e-posti.

PüüaÜhtlustatud tähtaegAeg möödas
#100
#2+ 1 min1 min
#3+ 5 min6 min
#4+ 30 min36 min
#5+ 2 h2h 36
#6+ 6 h8h 36

Kui soovite ebaõnnestunud toimetust käsitsi edastada, on veebisühenduse paneelil iga ebaõnnestunud toimetuse puhul nuppu Re-deliver , mis on kättesaadav 7 päeva jooksul pärast lõplikku ebaõnnestumist.

Proovida ilma päris ümbriku saatmata

Lõpppunkt `/v1/webhooks/test` võtab vastu URL-i ja sündmuse tüübi ning POSTeb fiktiivse payload, mis on allkirjastatud täpselt nagu tõeline.

# 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 põhimõtet, mida järgida

  • Kontrolli HMAC allkirja enne keha lugemist kasutage ajastuse ohutu võrdlust.
  • Töödelda iga `envelope_id` × `event` ainult üks kord, säilitades baasis juba vaadatud ID-d (võimalik, et tagasipöördumised annavad sama sündmuse uuesti).
  • Vastake HTTP 200-le kuni 5 sekundi jooksul ja töötle seejärel asünkroniliselt (jooksujärjekorras).
  • Riiete logimine + täielik allkiri paranduseks HMAC-kontrolli tulemused ebaõnnestuvad sageli nähtamatu BOM-i või valgusaali puhul.
  • Liita dead-letter queue sündmustele, et juhusliku juhtumi korral oma teenistust käsitsi edasi anda.
  • Suletab 5 minuti pikkuse vahe `t=` ja vastuvõtmise aja vahel, lükkas tagasi, et blokeerida taasesitused.

Et minna edasi

Kas olete valmis oma süsteemide ühendamiseks?

Loe tasuta konto 2 minutiga veebhook on saadaval Starter-plaanist (tasuta, 5 ümbrikut kuus).