Webhooks faigh na himeachtaí sínithe i bhfíor-am
Déan URL HTTPS a shocrú i do chomhábhair Certyneo agus faigh POST sínithe HMAC-SHA256 a luaithe a tharlaíonn ócáid ar do chlúdach: sínithe, diúltú, imithe in éag. 8 ócáid tacaithe, athchóirithe in 6 iarracht, seiceáil criptografach i 8 líne cód.
< 5s
Tá an t-ábhar a úsáidtear chun an t-ábhar a íoslódáil.
5x
Déan iarracht i gcás nach bhfuil (go dtí ~ 9 uair an chloig ina dhiaidh sin)
HMAC-SHA256
Algairidim sínithe gach iarratais
Catalogh imeachtaí
Tá an 8 imeacht thíos ag clúdach timthriall saoil iomlán an chlúdach Certyneo. Cuir na cinn a bhfuil suim agat iontu ar bun i gCeangail → Webhooks, neamhaird ar na cinn eile tá an síntiús gránálach in aghaidh na heachtra.
| Imeacht | Tosaíocht |
|---|---|
envelope.created | Cruthaítear an clúdach (de réir UI, API nó teimpléad) úsáideach chun taifeadadh taobh CRM a shioncruthú ón tús. |
envelope.sent | Seoltar an clúdach chuig na sínitheoirí (an chéad ríomhphost a seoltar). |
envelope.completed | Tá na sínitheoirí go léir sínithe. Tá an PDF eIDAS seilte agus an rian iniúchóireachta ar fáil trí `proof_pdf_url` sa phaillád. |
envelope.declined | Tá an cúis chun an coimhthionscadal a dhiúltú (más é an t-ionadaí a thug an cúis) in `data.decline_reason`. |
envelope.voided | Distinct from `expired` (dáoine vs timeout). |
envelope.expired | Tá an dáta éaga an chlúdaigh caite gan sínithe iomlán. Tá liosta de na síniúirí atá ar iarraidh in `data.missing_signers`. |
recipient.signed | Tá síniú déanta ag síniúóir aonair (ach ní gá go bhfuil síniú déanta ag gach duine). |
recipient.viewed | D'oscail síniúóir an nasc sínithe gan síniú fós, rud atá úsáideach le haghaidh athbheochan dírithe ar thrádáil. |
Comórtas
Tá an t-ábhar atá i `data` éagsúil ó ócáid go ócáid (táisc doiciméadúithe ag ócáid sa tagartha API). Seo sampla iomlán `envelope.completed`.
{
"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"
}
}Tá an t-ualach uimhriúil UTF-8 le BOM gan aon bhriathar. Tá síntiúis HMAC ríomh ar an gcorp amh mar a sheoltar ná déan athruithe ar na spásanna, athphársáil JSON déanann sé ord na eochracha a athrú go minic agus bristeann sé an fhíorú.
Déan seiceáil ar shíniú HMAC
Tá gach iarratais sínithe le do rún webhook (le feiceáil uair amháin nuair a chruthaítear iad sa dashboard, agus ansin cifrithe ag an am eile).<timestamp>,v1=<hex_hmac>`. Déan seiceáil i gcónaí ar an síniú sula ndéanann tú an t-ualach a phróiseáil gan an chéim seo, is féidir le duine ar bith imeacht a cheilt agus do chríochphointe a ghlaoch.
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)Míchumas coitianta
Ná húsáid `===` nó `==` chun comparáid a dhéanamh idir an síniú atá ag súil leis agus an síniú a fuarthas. Bain úsáid as fheidhm timing-safe (`crypto.timingSafeEqual` i Node, `hmac.compare_digest` i Python). Seachas sin, nochtann an difríocht ama comparáide idir dhá shíntiús go céim ar chéim an rún do ionsaitheoir paisinéir (timing attack).
Beartas athchóirithe
Má fhreagraíonn do chríochcheantar rud éigin seachas HTTP 2xx (timeout, 5xx, connection refused), déanaimid bacóff exponential. Is é an líon iomlán 6 iarracht in ~9 uair an chloig. Tar éis na 6 uair, marcáiltear an ócáid `failed` i do dhátachlár gréasáin agus seoltar ríomhphost rabhaidh.
| Déan iarracht | Réamhaisnéis | Am a chaitear |
|---|---|---|
| #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 |
Más mian leat imeacht a chaillte a chur ar aghaidh de láimh, cuireann an dashboard webhook cnaipe Ath-sheachadadh ar fáil ar gach seachadadh a chaill ar fáil ar feadh 7 lá tar éis an easpa deiridh.
Bain triail as gan fíor-chúlpach a sheoladh
Is é an pointe deiridh `/v1/webhooks/test` a ghlacann le URL agus cineál imeachta, agus POSTe payload ficseanúil sínithe díreach mar fíor.
# 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 Gnáthamh le leanúint
- Déan seiceáil ar shíntiús HMAC ANT aon léitheoireacht ar an gcorp úsáid comparáid thimpeallachta.
- Déan gach `envelope_id` × `event` a phróiseáil uair amháin amháin trí na IDanna a fheictear cheana féin a stóráil sa bhunachar (is féidir leis na hathshuiteálacha an ócáid chéanna a aisghairm).
- Freagair HTTP 200 laistigh de 5 soicind ar a mhéad, agus ansin próiseáil asynchronous (cotha). Seachas sin beidh tú in am agus go mbeidh tú mar athchóirithe.
- Logáil an corp bruta + síntiús iomlán i debug is minic a bhíonn an fhíorú HMAC ag teip ar BOM nó spás bán dofheicthe.
- Cuir isteach éad-litre ar na himeachtaí `failed` chun é a chur ar aghaidh go láimhe i gcás eachtraí ar do chuid seirbhíse.
- Toiléir a bheith i ndiaidh 5 nóiméad idir `t=` agus an t-am a ghlacann thar a bheith ann, diúltú chun athsheolúintí a bhac.
Chun dul níos faide
Réidh chun do chórais a nascadh?
Cruthaigh cuntas saor in aisce i 2 nóiméad tá an leagan amach webhook ar fáil ón bplean Starter (saor in aisce, 5 clúdach/meitheamh).