Баримт бичиг / Гарын авлага

Вебхүүк хүлээн авах

Гарын үсэгтэй үйл явдал аваад итгэхээсээ өмнө баталгаажуул.

Вебхүүк Business буюу түүнээс дээш багцад бий. Тохиргоо, Вебхүүк хэсэгт эсвэл POST /v1/workspaces/WORKSPACE/webhooks-оор эндпойнт үүсгэ. Гарын үсгийн нууц (az_whsec_...) үүсгэхэд буцна.

Юу илгээгдэх вэ

az холбоос, лийд, борлуулалт, түнш элсэлт, шимтгэл, төлбөр, шагналт даалгаврын JSON үйл явдал илгээнэ. Хүргэлт хамгийн багадаа нэг удаа тул үйл явдлын id-г санаж давтагдсаныг үл тооц. 10 секундэд 2xx төлвөөр хариул. Дахин чиглүүлэлт бүтэлгүйтэл гэж тооцогдож, бүтэлгүйтсэн хүргэлтийг дахин оролдоно.

Толгой

ТолгойУтга
Az-Signaturet=<unix секунд>,v1=<hex>, нууц солих үед хоёр дахь v1
Az-Event-IdДавтагдашгүй үйл явдлын id, давхардлыг шүүхэд
Az-Event-TypeЖишээ нь link.created
Az-Delivery-Id, Az-AttemptЭнэ хүргэлт ба оролдлогын дугаар

Гарын үсэг шалгах

v1 нь нууцыг бүтнээр нь түлхүүр, "<t>." + түүхий бие-г мессеж болгосон HMAC-SHA256-ийн жижиг hex. t одооноос таван минутаас илүү зөрсөн хүсэлтийг татгалз, тогтмол хугацаанд харьцуул.

import crypto from 'node:crypto';

export function verify(header, rawBody, secret, tolerance = 300) {
  const parts = header.split(',').map((p) => p.split('='));
  const t = Number(parts.find(([k]) => k === 't')?.[1]);
  if (!t || Math.abs(Date.now() / 1000 - t) > tolerance) return false;
  const expected = crypto.createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest('hex');
  return parts.some(([k, v]) => k === 'v1' && v?.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v), Buffer.from(expected)));
}

Задлахаасаа өмнө түүхий биеийг үргэлж унш. Гарын үсэг буруу бол дэлгэрэнгүйгүйгээр 400 хариул.