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ündmus | Sünnitus |
|---|---|
envelope.created | Loodakse ümbrik (UI, API või malli abil) kasulik CRM-poolsete salvestiste sünkroniseerimiseks. |
envelope.sent | Pakk saadetakse allkirjastanutele (esimene saadetud e-kiri). |
envelope.completed | Kõik allkirjastanud on allkirjastanud. eIDASi suletud PDF ja auditi jälg on saadaval payloadis `proof_pdf_url`. |
envelope.declined | Allakirjutanu keeldus pakendist.Keelutamise põhjus (kui allkirjastanud) on kirjas `data.decline_reason`. |
envelope.voided | Pakk on emitendi poolt tühistatud enne täielikku allkirjastamist. |
envelope.expired | Konverentsi kehtivusaeg on möödas ilma täieliku allkirjastamiseta. |
recipient.signed | Kasulik 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ähtaeg | Aeg möödas |
|---|---|---|
| #1 | 0 | 0 |
| #2 | + 1 min | 1 min |
| #3 | + 5 min | 6 min |
| #4 | + 30 min | 36 min |
| #5 | + 2 h | 2h 36 |
| #6 | + 6 h | 8h 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).