SelSup Developers

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.

Sekcje: 5Przewodnik dla programistów
→

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 wydarzeniach

1

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. 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. 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. 3

    /Przez dalsze wydarzenie

    Przechowywać klucz do odtwalania i obciążenia w jednej transakcji, a następnie szybko zwrócić udany odpowiedź.

  4. 4

    Proces w sposób asynchroniczny

    Połączenie z ERP, WMS i innych systemów z kolejki zamiast wchodzącego żądania HTTP.

!
Trzymaj krótką ścieżkę reakcji

Powolna reakcja zwiększa czas wycofania i ryzyko podwójnego dostarczania.

Minimalny wzór odbiorcy · 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

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.

i
Wzorzec skrzynki wysyłkowej

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.

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.