SelSup Developers

Асноўны працоўны паток · Кіраўнікі

Вэб-хакі і інтэграцыя на падставе падзей

Выхадная ўстаноўка webhook, бяспечны прыёмнік, абарона дублікатаў, і аднаўленне прапушчаных падзей праз API.

Раздзелы: 5Кіраўніцтва распрацоўшчыкам
→

Веб-хакі зніжаюць адтэрміноўку змен, але не замяняюць крыніцу праўды.

Інтэграцыі на падставе падзей і паслугі па заканчэнні

1

Дэфіцытуе падзеі і ўласнасць

Пачніце з аднаго дзелавога падзея, напрыклад, новы або зменены заказ, змены запасаў або змены коштаў.

Падтрымлівайце арыгінальную карыснасць вэб-хака асобна ад нармалізаванай мадэлі на абмежаваны перыяд.

Новае варыянтнае поле не павінна парушаць аналіз вядомай структуры падзеі.

2

Стварэнне бяспечнага прыёмніка HTTP

  1. 1

    Забарона патрабавання

    Прымаць толькі неабходныя метады і тыпы кантэнту, прымяніць мяжу памеру цела, і выкарыстоўваць кароткі час чытання.

  2. 2

    Праверка крыніцы

    Праверце X-SelSup-Прапіс з па-веб-хаук падпісаннеСакрэтам: HMAC-SHA256 над ASCII(t + "." + id + ".") затым сырыя баты цела. Адкінуць устараныя часовыя маркі і дубляваць ID дастаўкі.

  3. 3

    Працягвайце падзею

    Захоўваць карысную нагрузку і ключ дэдуплікацыі ў адной транзакцыі, а затым вярнуць паспяховы адказ хутка.

  4. 4

    Працэс асіхронна

    Званкі ERP, WMS і іншых сістэм з чаргі замест прыязджанага HTTP запыту.

!
Падтрымлівайце шлях адказу кароткі

Павольны адказ павялічвае час і рызыку падвойнага дастаўкі.

Мінімальны ўзор прыёмніка · JavaScript
const crypto = require('node:crypto');
const signingSecret = process.env.SELSUP_WEBHOOK_SECRET;

// Register this route before express.json() so req.body is a Buffer.
app.post('/selsup/events', express.raw({type: 'application/json'}), async (req, res) => {
  const header = req.get('X-SelSup-Signature') || '';
  const match = /^t=(\d+),id=([0-9a-f-]{36}),v1=([0-9a-f]{64})$/.exec(header);
  if (!match) return res.sendStatus(401);
  const [, timestamp, deliveryId, hex] = match;
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.sendStatus(401);
  const signed = Buffer.concat([
    Buffer.from(`${timestamp}.${deliveryId}.`, 'ascii'), req.body
  ]);
  const expected = crypto.createHmac('sha256', Buffer.from(signingSecret, 'hex'))
    .update(signed).digest();
  const actual = Buffer.from(hex, 'hex');
  if (actual.length !== expected.length || !crypto.timingSafeEqual(actual, expected)) {
    return res.sendStatus(401);
  }
  const inserted = await inbox.insertOnce(deliveryId, req.body);
  return res.sendStatus(inserted ? 202 : 200);
});

3

Дублікаты, заказ і дэдуплікацыя

Зрабіце падраздзяленне дубляжа, як звычайна. Выкарыстоўвайце стабільны ідэнтыфікатар падзеі, калі ён прысутнічае; інакш вывесці ключ з тыпу суб'екта, ID суб'ект, час мадыфікацыі і хэш значных дадзеных.

Падзеі могуць прыйсці непарадкавана. Параўноўвайце зменены Дата перад напісаннем або перазагрузіць бягучую суб'ект праз API.

Вярнуць статус поспеху для падзеі, якая ўжо апрацавана. У адваротным выпадку адправіцель можа працягваць перапрабаваць завершаную працу.

i
Узору ў паштовай скрыні

Тэбліца паступных падзей з унікальным ключом падзеі, статусам і лікам спробы спрашчае дэдуплікацыю, паўторную гульню і аўдытацыю.

4

Здабыць прапушчаныя падзеі

Выконваць перыядычную API пагадненне нават калі вэб-хакі здаровыя. Выкарыстоўвайце мадыфікавануюДата з перакладам для заказов і склад або зменены-SKU праверка для запасаў.

Пасля выключэння прыёмніка, выцягнуць паштовую скрынку і папрасіць змены для поўнага выключэнні вокны.

5

Кіраванне жыццёвым цыклам webhook

Выкласці актыўны URL, тып падзеі, апошні паспяховае атрыманне, і апошні error ў вашай інтэграцыі. Гэта дазваляе дыягнастыку без прамога доступу да сервера-лога.

Перад заменкай або выдаленнем URL, пераканацца, што новы прыёмнік прымае падзеі. Адмяніць старую таямніцу пасля пераезду.