Przepływ pracy od końca do końca · Przewodniki
Webhooki i integracja oparta na wydarzeniach
Ustawienie wyjściowego łącza internetowego, bezpieczny odbiornik, ochrona podwójnego i odzyskanie przeoczonych zdarzeń za pomocą API.
Webhooki zmniejszają opóźnienie zmian, ale nie zastępują źródła prawdy. Odbiorcy muszą być bezsilni, a okresową pojednanie pozostaje niezbędne.
Integracje i usługi backend oparte na wydarzeniach1
Definicja zdarzeń i własności
Zacznij od jednego zdarzenia biznesowego, takiego jak nowy lub zmieniony zamówienie, zmiana zapasów lub zmiana cen. Definiuj działanie właściciela danych i odbiorcy dla każdego zdarzenia.
Trzymaj oryginalny ładunek webhooka oddzielnie od standardowego modelu przez ograniczony czas.
Nowe pole opcjonalne nie może przerwać analizowania znanej struktury zdarzeń.
2
Wykonuj bezpieczny odbiornik HTTP
- 1
Wymaganie wniosku
Przyjmuj tylko wymagane metody i rodzaje treści, wprowadź ograniczenie wielkości ciała i użyj krótkiego czasu odczytu.
- 2
Sprawdź źródło
Sprawdź X-SelSup-Signature z podpisem na webhookSecret: HMAC-SHA256 over ASCII(t + "." + id + ".") po czym bajty ciała surowego. Odsuń stare znaki czasu i podwójne identyfikaty dostawy.
- 3
/Przez dalsze wydarzenie
Przechowywać klucz do odtwalania i obciążenia w jednej transakcji, a następnie szybko zwrócić udany odpowiedź.
- 4
Proces w sposób asynchroniczny
Połączenie z ERP, WMS i innych systemów z kolejki zamiast wchodzącego żądania HTTP.
Powolna reakcja zwiększa czas wycofania i ryzyko podwójnego dostarczania.
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
Duplikacje, zamówienie i deduplikacja
Użyj stałego identyfikatora zdarzenia, gdy jest obecny; w przeciwnym razie wywłaszcz klucz z typu jednostki, identyfikatora jednostki i czasu modyfikacji.
Wykonane zdarzenia mogą pojawić się w nieporządowym miejscu. Porównuj z modyfikowanymDatum przed napisanie lub przełóż bieżący podmiot za pośrednictwem API.
Wyrzuć status sukcesu dla zdarzenia, które zostało już przetworzone.
Tabela przychodzących wydarzeń z unikalnym kluczem zdarzenia, statusem i liczbą prób ułatwia odwzajemnianie, odtwarzanie i audyt.
4
Odzyskanie przeoczonych zdarzeń
Wykorzystaj czasami API, nawet jeśli webhooki są zdrowe.
Po wyłączeniu odbiorcy, wyczerpuj skrzynkę do wiadomości i poprosić o zmiany w całkowitym oknie wyłączenia.
Powiązane punkty końcowe API
GET/api/order/findOdzyskanie zmian w kolejnościGET/api/wms/stock/findZmiany akcji
5
Zarządzanie cyklem życia webhooka
Włącz aktywny adres URL, typ zdarzenia, ostatni udany odbiór i najnowszy error w swojej integracji. Umożliwia to diagnozę bez bezpośredniego dostępu do serwera.
Przed zastąpieniem lub usunięciem adresu URL sprawdź, czy nowy odbiorca akceptuje zdarzenia.
Powiązane punkty końcowe API
GET/api/webhook/Przegląd skonfigurowanych węzłówDELETE/api/webhook/{webhookId}Usunięcie włączenia