Асноўны працоўны паток · Кіраўнікі
Вэб-хакі і інтэграцыя на падставе падзей
Выхадная ўстаноўка webhook, бяспечны прыёмнік, абарона дублікатаў, і аднаўленне прапушчаных падзей праз API.
Веб-хакі зніжаюць адтэрміноўку змен, але не замяняюць крыніцу праўды.
Інтэграцыі на падставе падзей і паслугі па заканчэнні1
Дэфіцытуе падзеі і ўласнасць
Пачніце з аднаго дзелавога падзея, напрыклад, новы або зменены заказ, змены запасаў або змены коштаў.
Падтрымлівайце арыгінальную карыснасць вэб-хака асобна ад нармалізаванай мадэлі на абмежаваны перыяд.
Новае варыянтнае поле не павінна парушаць аналіз вядомай структуры падзеі.
2
Стварэнне бяспечнага прыёмніка HTTP
- 1
Забарона патрабавання
Прымаць толькі неабходныя метады і тыпы кантэнту, прымяніць мяжу памеру цела, і выкарыстоўваць кароткі час чытання.
- 2
Праверка крыніцы
Праверце X-SelSup-Прапіс з па-веб-хаук падпісаннеСакрэтам: HMAC-SHA256 над ASCII(t + "." + id + ".") затым сырыя баты цела. Адкінуць устараныя часовыя маркі і дубляваць ID дастаўкі.
- 3
Працягвайце падзею
Захоўваць карысную нагрузку і ключ дэдуплікацыі ў адной транзакцыі, а затым вярнуць паспяховы адказ хутка.
- 4
Працэс асіхронна
Званкі ERP, WMS і іншых сістэм з чаргі замест прыязджанага HTTP запыту.
Павольны адказ павялічвае час і рызыку падвойнага дастаўкі.
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.
Вярнуць статус поспеху для падзеі, якая ўжо апрацавана. У адваротным выпадку адправіцель можа працягваць перапрабаваць завершаную працу.
Тэбліца паступных падзей з унікальным ключом падзеі, статусам і лікам спробы спрашчае дэдуплікацыю, паўторную гульню і аўдытацыю.
4
Здабыць прапушчаныя падзеі
Выконваць перыядычную API пагадненне нават калі вэб-хакі здаровыя. Выкарыстоўвайце мадыфікавануюДата з перакладам для заказов і склад або зменены-SKU праверка для запасаў.
Пасля выключэння прыёмніка, выцягнуць паштовую скрынку і папрасіць змены для поўнага выключэнні вокны.
Сродкі API канечныя пункты
GET/api/order/findЗдабыць змены ў парадкуGET/api/wms/stock/findЗгадненне змены запасаў
5
Кіраванне жыццёвым цыклам webhook
Выкласці актыўны URL, тып падзеі, апошні паспяховае атрыманне, і апошні error ў вашай інтэграцыі. Гэта дазваляе дыягнастыку без прамога доступу да сервера-лога.
Перад заменкай або выдаленнем URL, пераканацца, што новы прыёмнік прымае падзеі. Адмяніць старую таямніцу пасля пераезду.
Сродкі API канечныя пункты
GET/api/webhook/Праверка канфігураваных вэб-хокаўDELETE/api/webhook/{webhookId}Знішчыць вэб-хаук