Połączenie jednego marketplace'u ze sklepem to praca na całe popołudnie. Jednoczesna integracja marketplace'u PrestaShop z Etsy i eBay to zupełnie inny problem, ponieważ trzy systemy uważają teraz, że posiadają autorytatywny numer magazynowy dla danego SKU, używają własnego modelu uwierzytelniania i narzucają własny budżet limitów stawek.
Błąd, z którym faktycznie spotykasz się w środowisku produkcyjnym, nigdy nie oznacza „niedziałające wywołanie API”. To przesadzenie z ilością sprzedanych egzemplarzy na eBayu, ponieważ zamówienie z Etsy dotarło 400 ms wcześniej. To oferta, która przetrwała produkt usunięty w zeszły wtorek. To zamówienie zaimportowane dwukrotnie, ponieważ webhook został ponowiony, podczas gdy Twój pracownik znajdował się w transakcji. Dlatego istotne pytanie nie brzmi, czy PrestaShop może komunikować się z eBayem i Etsy – oczywiście, że tak – ale jak zaprojektować synchronizację, aby działała poprawnie po uruchomieniu sklepu.
1.0 PrestaShop Webservice API kontra moduł łącznika marketplace: kiedy należy zbudować?
Szczera odpowiedź zależy nie tyle od Twoich umiejętności PHP, co od tego, kto poniesie koszty utrzymania, gdy eBay wycofa daną wersję API.
Interfejs API usługi internetowej PrestaShop to ogólna warstwa CRUD dla encji modelu obiektów sklepu. Znajduje się ona w katalogu /api/ i uwierzytelnia się za pomocą klucza dostępu back-office przesyłanego jako nazwa użytkownika HTTP Basic z pustym hasłem ( PrestaShop devdocs ). Dociera do produktów, kombinacji, stock_availables i zamówień, ale nie ma pojęcia o platformach sprzedażowych. Taksonomia Etsy, specyfikacja przedmiotów na eBayu, odświeżanie OAuth, identyfikatory ofert, zasady ponawiania prób i zabezpieczenia idempotentności – wszystko to pozostaje do Twojej dyspozycji.
| Niestandardowa kompilacja na bazie API usługi sieciowej | Moduł łącznika Marketplace | |
|---|---|---|
| Czas na pierwszą synchronizację aukcji | Na pierwszym miejscu są tygodnie, uwierzytelnianie, mapowanie i kolejkowanie | Od godzin do dni; w tym ekrany mapowania |
| Uaktualnienia API Marketplace | Śledzisz notatki dotyczące wydań Etsy i eBay | Odpowiedzialność sprzedawcy, if sprzedawca pozostaje aktywny |
| Kontrola mapowania danych | Możliwa jest logika atrybutów całkowitych dla każdej marki | Ograniczone przez interfejs mapowania modułu |
| Architektura synchronizacji | Twój wybór kolejki, pracowników, zamków i wycofania | Zwykle sterowane przez cron; zachowanie w czasie rzeczywistym jest zmienne |
| Radzenie sobie z warunkami wyścigowymi | Tylko tak dobre, jak to zbudujesz | Często najsłabszy obszar |
| Budżet limitu stawek | Jesteś właścicielem kontenerów tokenów i możesz ustalać priorytety | Nieprzezroczysty; sprawdź, jak moduł ogranicza |
| Debugowalność | Twoje logi, Twoje identyfikatory korelacji | Format dziennika dostawcy; śledzenie poszczególnych jednostek SKU jest zmienne |
| Koszt bieżący | Czas dla programisty, bezterminowo | Licencja plus tarcie o aktualizację |
| Najlepiej nadaje się do | 2+ kanały, złożone atrybuty, niestandardowe ceny | Standardowa synchronizacja eBay/Etsy, małe zespoły |
W praktyce kolejność jest lepsza niż albo-albo: kup łącznik, aby udowodnić, że kanał generuje przychody, a następnie zbuduj go, gdy katalog przerośnie swój model mapowania. Łączniki takie jak integracja PrestaShop eBay Marketplace firmy Knowband i integracja PrestaShop Etsy Marketplace istnieją, ponieważ ta pierwsza warstwa – profile, mapowanie kategorii, stan ofert, import zamówień, przepływ zwrotny statusu – działa tak samo w każdym projekcie. Niezależnie od wybranej opcji, poniższe kryteria nadal obowiązują; moduł zmienia tylko osobę, która go implementuje.

1.1 Czego API usługi sieciowej nie zrobi dla Ciebie
Przenosi rekordy, ale nie uruchamia logiki biznesowej. Polecenie POST /api/orders pomija PaymentModule::validateOrder(), więc dekrementacje zapasów, faktury i e-maile ze stanem zamówienia nigdy nie są generowane. Nie ma również udokumentowanego limitu żądań, co nie jest równoznaczne z brakiem limitu. Każde wywołanie /api/ uruchamia framework, więc prawdziwym limitem są pracownicy PHP-FPM, a pętla resynchronizacji wyczerpuje je na długo przed osiągnięciem limitów przez eBay. W tym przypadku pomaga jedna droga ewakuacyjna: moduł może zarejestrować własne zasoby webservice ( koncepcje usług webservice modułu ) i udostępnić jeden punkt końcowy marketplace_sync zamiast ośmiu ogólnych wywołań dla każdego produktu.
2.0 Mapowanie danych: kombinacje PrestaShop kontra taksonomia Etsy i specyfikacja przedmiotów na eBay
W tym miejscu projekty rynkowe po cichu tracą tygodnie. Te trzy modele katalogowe nie tylko używają różnych nazw pól, ale także różnią się co do tego, czym jest produkt.
PrestaShop modeluje produkt jako zagnieżdżone drzewo kategorii, id_category_default oraz kombinacje generowane z grup atrybutów. eBay wymaga pojedynczego identyfikatora kategorii (categoriId) oraz specyfikacji przedmiotu, których nazwy, kardynalność i dozwolone wartości są określone dla każdej kategorii i pobierane za pomocą funkcji getItemAspectsForCategory (API taksonomii eBay ). Etsy wymaga identyfikatora taxonomy_id z własnej taksonomii sprzedawcy oraz właściwości tego węzła, a także ogranicza liczbę wariantów do dwóch właściwości na ofertę.
Trzy konsekwencje, które pojawiają się podczas pierwszego wypuszczenia katalogu:
- Produkt z trzema grupami atrybutów: rozmiar, kolor, wykończenie, Urządzenia główne i akcesoria z jednego modelu nie mogą być używane z innym modelem, a modeli MXNUMX/MXNUMX nie można rozbudować do wersji MXNUMX. być pojedynczą ofertą Etsy. Możesz zwinąć wymiar w tytule lub podzielić produkt, więc jeden produkt PrestaShop jest teraz mapowany na kilka identyfikatorów ofert Etsy.
- eBay odrzuca publikację, gdy brakuje wymaganego aspektu, dlatego sprawdź mapowanie dla każdej kategorii zanim pchnięcie, a nie odkrycie go z 400.
- Oba rynki dokonują rewizji swoich taksonomii, co oznacza, że w przyszłości nie będzie już możliwe korzystanie z zakodowanego na stałe identyfikatora kategorii.
2.1 Ustaw SKU jako klucz dołączenia do każdego kanału
Przed przystąpieniem do mapowania należy ustalić tożsamość. Referencja PrestaShop powinna być głównym identyfikatorem synchronizacji, a każda kombinacja musi mieć swój własny identyfikator: TSHIRT-BLK-M, TSHIRT-BLK-L, TSHIRT-WHT-M. Interfejs API Inventory eBay jest z założenia adresowany do SKU ( eBay Inventory API ), więc kombinacja z pustą referencją jest niesynchronizowana. Należy to zweryfikować podczas wdrażania, a nie przy każdym pushu.
2.2 Przechowuj mapowanie jako dane i twórz jego wersje
Unikaj pisania mapCategory() w PHP. Mapowania to dane biznesowe, które edytuje sprzedawca, a nie kod, który wdrażasz ponownie.
-- Schemat ilustrujący warstwę mapowania
UTWÓRZ TABELĘ ps_mp_category_map (
id_map INT UNSIGNED NOT NULL AUTO_INCREMENT,
kanał ENUM('etsy','ebay') NOT NULL,
id_category INT UNSIGNED NOT NULL, -- Kategoria PrestaShop
remote_node VARCHAR(64) NOT NULL, -- etsy taxonomy_id | ebay categoryId
aspects_json TEKST NULL, -- domyślne wartości aspektu statycznego
taxonomy_rev VARCHAR(32) NULL, -- wersja drzewa kategorii eBay
KLUCZ PODSTAWOWY (id_map),
UNIKALNY KLUCZ channel_cat (kanał, id_kategoria)
) SILNIK=InnoDB DOMYŚLNY ZESTAW ZNAKÓW=utf8mb4;
UTWÓRZ TABELĘ ps_mp_listing_link (
id_product INT UNSIGNED NOT NULL,
id_attribute INT UNSIGNED NOT NULL DOMYŚLNE 0, -- 0 = prosty produkt
kanał ENUM('etsy','ebay') NOT NULL,
remote_id VARCHAR(64) NOT NULL, -- listing_id | offerId
remote_sku VARCHAR(64) NOT NULL,
last_pushed_at DATACZAS NULL,
KLUCZ PODSTAWOWY (id_produktu, id_atrybutu, kanał),
UNIKALNY KLUCZ chan_remote (kanał, identyfikator_zdalnego_zdalnego)
) SILNIK=InnoDB DOMYŚLNY ZESTAW ZNAKÓW=utf8mb4;
Przechowuj wersję drzewa kategorii eBay wraz z mapowaniem. Gdy getDefaultCategoryTreeId zwróci nową wersję, każdy wiersz z nieaktualnym taxonomy_rev wymaga ponownej walidacji, co stanowi różnicę między zaplanowanym remapowaniem a poniedziałkiem pełnym błędów publikacji.
3.0 Architektura synchronizacji inwentarza: webhooki, zaplanowane sondowanie lub oba te elementy
Porównaj, co tak naprawdę emitują obie strony, a odpowiedź przestanie być kwestią gustu.
| Kanał | Możliwość wypychania | Luka w pokryciu |
|---|---|---|
| PrestaShop | Brak natywnych webhooków wychodzących; moduł obejmuje actionUpdateQuantity, actionValidateOrder, actionProductUpdate | Nic nie uruchamia się w przypadku bezpośrednich edycji SQL lub niektórych ścieżek importu |
| Etsy | Webhooki obejmują tylko cztery zdarzenia zamówienia: order.paid, order.canceled, order.shipped, order.delivered (Webhooki Etsy) | Brak zdarzenia utworzonego na podstawie paragonu i brak zdarzenia zmiany stanu zapasów |
| eBay | Interfejs API powiadomień z subskrypcjami tematów i miejscami docelowymi HTTPS (API powiadomień eBay) | Dostępność tematów jest zmienna; wyliczaj za pomocą getTopics zamiast zakładać |
Etsy nie generuje żadnych danych, gdy kupujący zmienia ilość w koszyku, ani gdy tworzony jest paragon. Ta luka wymusza odpytywanie projektu, niezależnie od tego, jak dobrze obsługujesz webhooki. Zasada działania jest taka: webhooki zapewniają opóźnienie, a odpytywanie sprawdza poprawność : webhooki wyznaczają szybką ścieżkę, podczas gdy proces uzgadniania co 5–15 minut ponownie odczytuje ilości i ostatnie paragony, a następnie koryguje to, co zostało pominięte przez szybką ścieżkę. Uzgadnianie nie jest rozwiązaniem awaryjnym, którego nigdy nie należy się spodziewać, lecz tym, co ostatecznie poprawia system.
Jeśli zamiast tego uruchomisz konektor, ta sama architektura pojawi się jako zadania cron. Moduł, który jest zainstalowany, licencjonowany i zmapowany prawidłowo, nadal wygląda na uszkodzony, gdy jego zaplanowane zadanie nigdy się nie wykonuje, dlatego weryfikacja cron powinna znaleźć się na liście kontrolnej uruchomienia, a nie w notatkach dotyczących rozwiązywania problemów.
3.1 Nigdy nie wywołuj interfejsu API platformy handlowej podczas realizacji transakcji
// Przykład: hak modułu. Tylko kolejkowanie — nigdy nie wywołuj tutaj API marketplace.
funkcja publiczna hookActionUpdateQuantity($params)
{
$sku = $this->resolveSku((int) $params['id_product'], (int) $params['id_product_attribute']);
jeśli (!$sku) {
powrotu;
}
Db::getInstance()->insert('mp_sync_queue', [
'sku' => pSQL($sku),
'op' => 'stock.push',
'ładunek' => pSQL(json_encode(['ilość' => (int) $params['ilość']])),
'dedupe_key' => pSQL('stock:' . $sku), // powoduje załamanie serii
'created_at' => data('Ymd H:i:s'),
], false, true, Db::REPLACE); // REPLACE = wygrywa najnowsza intencja
}
Wywołanie HTTP wewnątrz haka dodaje opóźnienie w rynkowi do realizacji transakcji i powoduje niepowodzenie zamówienia, gdy Etsy działa wolno, więc hak tylko ustawia się w kolejce. Funkcja REPLACE na kluczu dedupe_key dla każdego SKU przekształca dwadzieścia ruchów cenowych w ciągu minuty w jedno wywołanie wychodzące, które przenosi aktualną ilość.
4.0 Wyścig w sytuacjach, gdy jeden SKU sprzedaje się na trzech kanałach jednocześnie
Weź cztery sztuki TSHIRT-BLK-M. Kupujący na eBayu bierze dwie sztuki, kupujący na Etsy jedną, a w sklepie stacjonarnym jedną – wszystko w ciągu dwóch sekund. Trzech pracowników się budzi, każdy odczytuje stan magazynowy, oblicza ilość i wysyła. Teraz czają się dwa niezależne błędy.
Arytmetyka względna traci aktualizacje. Pracownik wysyłający polecenie „dekrementacja o 2”, podczas gdy inny wysyła polecenie „dekrementacja o 1” dla wartości, które oba odczytane jako 4, trafiają na 2 lub 3, w zależności od kolejności. Zawsze przesyłaj wartości bezwzględne odczytane w momencie przesyłania. StockAvailable::getQuantityAvailableByProduct() jest jedynym źródłem prawdy, a ilości rynkowe są jego projekcjami, a nie danymi wejściowymi do arytmetyki.
Przeplatane pushy pozostawiają nieaktualny stan końcowy. Pracownik A odczytuje 2, pracownik B odczytuje 1 chwilę później, B pushuje 1, a następnie wolniejsze żądanie A trafia i zapisuje 2. eBay reklamuje teraz jednostkę, która nie istnieje. Blokada per SKU plus monotoniczne sprawdzanie wersji to najtańszy sposób egzekwowania kolejności.
// Przykład: serializacja wszystkich pushów dla jednego SKU we wszystkich kanałach.
$lockName = 'mp_sku_' . md5($sku);
$db = Db::getInstance();
// Blokada doradcza MySQL: czeka do 3 sekund, zwraca 1 po uzyskaniu danych, 0 po przekroczeniu limitu czasu.
jeśli (!(int) $db->getValue("WYBIERZ GET_LOCK('" . pSQL($lockName) . "', 3)")) {
$this->requeue($job, 5); // inny pracownik jest właścicielem tego SKU; spróbuj ponownie wkrótce
powrotu;
}
spróbuj {
$qty = (int) StockAvailable::getQuantityAvailableByProduct($idProduct, $idAttribute);
$ver = (int) $db->getValue(
'WYBIERZ wersję stockową Z ' . _DB_PREFIX_ . 'mp_sku_state GDZIE sku = "' . pSQL($sku) . '"'
);
jeśli ($job['wersja'] < $ver) {
return; // nowsze push już zostało wysłane; odrzuć to
}
$this->etsy->setQuantity($sku, $qty); // wartość bezwzględna
$this->ebay->setQuantity($sku, $qty); // wartość bezwzględna
$db->execute(
'AKTUALIZACJA' . _DB_PREFIX_ . 'mp_sku_state
USTAW stock_version = stock_version + 1, synced_qty = ' . $qty . ', synced_at = NOW()
GDZIE sku = "' . pSQL($sku) . '"'
);
} wreszcie {
$db->execute("WYBIERZ RELEASE_LOCK('" . pSQL($lockName) . "')");
}
Funkcja GET_LOCK ma zasięg sesji, więc obejmuje procesy PHP-FPM i cron w tej samej bazie danych i zwalnia po zerwaniu połączenia, czego nie robi flaga blokady w wierszu. W przypadku kilku serwerów baz danych przenieś blokadę do Redis i zachowaj kolumnę wersji jako zabezpieczenie.
Brak blokady eliminuje jednak ryzyko resztkowe. Pomiędzy finalizacją zamówienia na Etsy a Twoim pushem, eBay może legalnie sprzedać tę samą jednostkę, więc ogranicz to ryzyko komercyjne: opublikuj dostępne – 1 dla szybko zmieniających się produktów i push 0 dla ostatniej jednostki od razu, a nie przy kolejnym uzgodnieniu.
5.0 Jak limity stawek API Etsy, limity stawek API eBay i pułap PrestaShop się łączą
Każdy budżet sam w sobie wydaje się hojny. Jednak w synchronizacji trójstronnej mnożą się one w stosunku do liczby SKU.
| Kanał | Udokumentowane limity | Sygnały do odczytania |
|---|---|---|
| Etsy | Limity QPS i QPD dla każdej aplikacji w oknie przesuwnym; udokumentowana wartość domyślna nowej aplikacji to 10 żądań na sekundę i 10 000 żądań na 24 godziny, generowanych na żądanie (Limity stawek Etsy) | x-limit-na-sekundę, x-pozostało-w-tej-sekundie, x-limit-na-dzień, x-pozostało-dzisiaj; ponów-próbę-później na 429 |
| eBay | Dzienne limity wywołań dla poszczególnych aplikacji na interfejs API i zasób, ustalone w ramach kontroli wzrostu aplikacji (Limity wywołań API eBay) | API analityki deweloperskiej getRateLimits — kwota, wykorzystane, pozostałe, okno resetowania |
| PrestaShop | Brak opublikowanego limitu; ograniczenie ze względu na liczbę pracowników PHP-FPM i koszt rozruchu frameworka na wywołanie /api/ | Twoja własna szybkość 5xx i głębokość kolejki FPM |
Pełna resynchronizacja 3,000 SKU wymaga jednego zapisu stanu magazynowego Etsy na ofertę, jednej aktualizacji oferty eBay na SKU i jednego odczytu PrestaShop na SKU. Przy domyślnych 10 QPS na Etsy, oznacza to pięciominutowe, ciągłe zużycie energii bez marginesu dla modułu zbierającego zamówienia – jedynego zadania, które nigdy nie powinno się zatrzymywać. Trzy zasady pozwalają utrzymać budżet w ryzach:
- Uruchom jeden kontener tokenów na kanał, współdzielony przez każdego pracownika. Wyegzekwuj tę zasadę w Redis, ponieważ ogranicznik na proces mnoży rzeczywistą stawkę przez liczbę pracowników.
- Ustal priorytety dla kolejek. Zamówienia i wyzerowanie zapasów powodują aktualizacje cen i przesyłanie obrazów. Limit wydany na miniatury, podczas gdy narasta nadsprzedaż, to błąd projektowy.
- Partia i różnica. Interfejs API magazynu eBay umożliwia hurtowe aktualizacje cen i ilości, dzięki czemu można dostosować partię do bieżącego limitu za wywołanie, a następnie porównać ją z synced_qty i zatrzymać wydawanie kwoty, aby potwierdzić, że 7 nadal równa się 7.
6.0 Uwierzytelnianie: Etsy API OAuth, eBay OAuth 2.0 i klucze API PrestaShop
Trzy modele i tylko dwa z nich wygasają.
PrestaShop wysyła klucz dostępu jako podstawową nazwę użytkownika HTTP z pustym hasłem. Brak wygaśnięcia, odświeżenia, błędu odświeżania tokena – ryzyko jest odwrotne, ponieważ klucz nigdy nie zostanie zrecyklingowany, dopóki go nie zrecyklingujesz.
Etsy korzysta z kodu autoryzacyjnego OAuth 2.0 z obowiązkowym PKCE: code_verifier o długości 43–128 znaków i code_challenge S256. Tokeny dostępu posiadają parametr expires_in: 3600, a tokeny odświeżania są ważne przez 90 dni ( uwierzytelnianie Etsy ). Każde żądanie wymaga nagłówka x-api-key i tokena nośnika, a format tokena to {user_id}.{token}. Ten prefiks numeryczny należy do poświadczenia, a jego usunięcie to klasyczny błąd pierwszego dnia.
eBay wydaje tokeny dostępu użytkownika ważne przez 7,200 sekund i tokeny odświeżania ważne przez 47 304 000 sekund, czyli około osiemnastu miesięcy ( tokeny OAuth eBay ). Tokeny aplikacji obejmują dane publiczne, ale wszystko, co ma związek z asortymentem sprzedawcy, wymaga tokena użytkownika.
Błąd, który faktycznie przerywa zadania synchronizacji, to nie wygaśnięcie. To dziesięć procesów roboczych, które zauważają wygaśnięcie w tym samym momencie. Dlatego zabezpiecz odświeżanie za pomocą blokady jednokrotnego dostępu, ponownie sprawdź zapisany token pod tą blokadą i odśwież z dwuminutowym marginesem, a nie reaktywnie przy błędzie 401. Utrwal rotowany token odświeżania w tym samym zapisie co token dostępu, ponieważ awaria między dwoma zapisami powoduje utratę uprawnień. Następnie wysyłaj alerty zarówno o pomyślnym, jak i niepowodzeniu odświeżania, ponieważ uprawnienia, które nie zostały odświeżone przez 24 godziny, stanowią problem, nawet jeśli nic nie zostało zgłoszone ( najlepsze praktyki OAuth eBay ).
7.0 Synchronizacja zamówień na rynku: podatki, wysyłka, waluta i idempotencja
Import zamówień to miejsce, w którym księgowi znajdują błędy. Zamówienie z platformy handlowej nie jest zamówieniem PrestaShop z różnymi nazwami pól, lecz rozliczonym dokumentem finansowym. Przed napisaniem importera należy rozwiązać cztery niezgodności.
Podatek od pośredników na rynku. Etsy i eBay pobierają i odprowadzają podatek od sprzedaży lub VAT dla sprzedawcy w wielu jurysdykcjach. Podatek ten jest zawarty w towarze, ale nie stanowi ani zobowiązania sprzedawcy, ani jego przychodu, więc importowanie go do standardowej reguły podatkowej zawyża deklarację VAT. Należy go przypisać do reguły stawki zerowej i osobnego pola księgi głównej, a następnie potwierdzić sposób rozliczenia z księgowym sprzedawcy.
Wysyłka. Platformy wysyłkowe wysyłają kwotę już obliczoną na podstawie ich własnych profili wysyłkowych. Nie należy ponownie uruchamiać reguł przewoźnika PrestaShop, ponieważ sumy różnią się, a zamówienie nigdy nie jest uzgadniane z wypłatą. Zamiast tego należy utworzyć jednego przewoźnika dla każdego kanału i ustawić koszt z danych dostawy.
Waluta. Ładunek zawiera własną walutę, a wypłata może zostać zrealizowana w innej walucie. Zachowaj kwotę z rynku, kwotę w walucie sklepu oraz kurs wymiany użyty podczas importu, ponieważ ponowne użycie dzisiejszego kursu do ponownego wydrukowania faktury sprzed trzech miesięcy nie daje dokumentu, który nie pasuje do niczego.
Ścieżka tworzenia. Zbuduj koszyk, a następnie wywołaj PaymentModule::validateOrder() — jedyną ścieżkę, która zmniejsza stan zapasów, generuje fakturę, ustawia stan zamówienia i uruchamia haki, na których polegają inne moduły.
// Przykład: idempotentny import zamówień z rynku.
$externalId = $channel . ':' . $remoteOrderId;
jeśli (Db::getInstance()->getValue(
'WYBIERZ id_order Z ' . _DB_PREFIX_ . 'mp_order_link
GDZIE external_id = "' . pSQL($externalId) . '"'
)) {
return; // już zaimportowano — ponowienie webhooka lub nakładające się sondowanie
}
$cart = nowy koszyk();
$cart->id_customer = $idCustomer;
$cart->id_currency = (int) Waluta::getIdByIsoCode($payload['currency']);
$cart->id_carrier = (int) Konfiguracja::get('MP_CARRIER_' . strtoupper($channel));
$cart->id_address_delivery = $idAddress;
$cart->id_address_invoice = $idAddress;
$cart->add();
foreach ($payload['lines'] jako $line) {
$cart->updateQty((int) $line['ilość'], (int) $line['id_produkt'], (int) $line['id_atrybut']);
}
$module = Module::getInstanceByName('mpsync');
$module->validateOrder(
(int) $cart->id,
(int) Konfiguracja::get('PS_OS_PAYMENT'),
(float) $payload['total_paid'],
$channel . 'Rynek',
zero,
['transaction_id' => $remoteOrderId],
(int) $cart->id_currency,
fałszywy,
$cart->secure_key
);
Db::getInstance()->insert('mp_order_link', [
'external_id' => pSQL($externalId),
'id_order' => (int) $module->currentOrder,
'imported_at' => data('Ymd H:i:s'),
]);
Ustaw indeks UNIQUE na external_id. Powyższe polecenie SELECT to tylko szybka ścieżka; indeks jest gwarancją, ponieważ dwaj pracownicy mogą przejść to sprawdzenie w tej samej milisekundzie. Następnie przejrzyj strony z poleceniami getOrders na eBayu i paragonami sklepowymi na Etsy za pomocą utrwalonego kursora „aktualizacja od”, a nie stałego przesunięcia, które przesuwa się pod Tobą.
Idempotencja wykracza poza zamówienia. Push produktu składa się z czterech wywołań: utworzenia pozycji magazynowej, utworzenia oferty, przesłania obrazów i publikacji, co pozwala na rejestrowanie stanu każdego kroku (SKU, kanał, krok) i wznawianie próby zamiast jej ponownego uruchamiania. Etsy podpisuje również webhooki za pomocą webhook-id, webhook-timestamp i webhook-signature, co pozwala na deduplikację na podstawie webhook-id i odrzucanie znaczników czasu, których czas dryfuje dłużej niż około 300 sekund. Sam ten nagłówek powoduje wyłączenie klasy ponawiania duplikatów.
8.0 Monitorowanie synchronizacji z rynkiem produkcyjnym
Synchronizacja, która nie powiedzie się głośno, to zadanie konserwacyjne. Synchronizacja, która nie powiedzie się bez ostrzeżenia, to kolejka zwrotów.
| Rejestruj każdą operację za pomocą | Alarm włączony |
|---|---|
| Identyfikator korelacji obejmujący webhook → kolejkę → wywołanie API | Rozbieżność zapasów, lokalny ≠ zdalny przez więcej niż N minuty |
| SKU, kanał, operacja, bezwzględna ilość wysłanych | Błąd autoryzacji, każdy błąd odświeżania OAuth, natychmiast przekierowany |
| Pełne żądanie i odpowiedź dla nie-2xx, sekrety usunięte | Ograniczenie szybkości spalania, pozostały dzienny limit poniżej 20% przed godziną 18:00 |
| Pozostały limit budżetu na kanał | Wiek kolejkinajstarsze nieprzetworzone zadanie starsze niż 5 minut |
| Wygaśnięcie tokena i znaczniki czasu ostatniego pomyślnego odświeżenia | Luka w zamówieniach, zero zamówień z kanału w normalnie zajętym oknie |
| Wyniki uzgadniania: sprawdzone, naprawione, nierozwiązane | Cisza Cronazaplanowane zadanie synchronizacji, które nie zostało wykonane na czas |
Dwa wskaźniki zasługują na najwyższe wyróżnienie. Wiek kolejki jest wskaźnikiem wiodącym, ponieważ rośnie, zanim klienci zauważą jakiekolwiek nieprawidłowości. Liczba napraw uzgadnianych to wskaźnik uczciwości – gdy 15-minutowe przejście ciągle naprawia te same SKU, szybka ścieżka jest zepsuta, a sondowanie po cichu to ukrywa.
Na koniec, zamiast delty, zapisz całkowitą ilość, którą wysłałeś. Gdy sprzedawca zapyta, dlaczego eBay pokazał 3, a PrestaShop 1, odpowiedź musi być możliwa do uzyskania z samej linii logu.
9.0 Rozwiązywanie problemów z czterema błędami synchronizacji z rynkiem PrestaShop, z którymi możesz się spotkać
9.1 Listy pokazują nieaktualne ilości, podczas gdy logi pokazują HTTP 200
Sprawdź ładunek, a nie kod statusu. Na Etsy aktualizacja stanu magazynowego zastępuje całą strukturę magazynową, więc częściowa struktura może zresetować oferty, których nigdy nie zamierzałeś zmieniać. Na eBayu aktualizacja pozycji magazynowej nie jest tym samym, co aktualizacja opublikowanej oferty, a oferta zawiera ilość możliwą do sprzedaży. Odczytaj jeden kod SKU natychmiast po przesłaniu i porównaj pole po polu. W konfiguracji opartej na konektorze, najpierw przejrzyj ten sam łańcuch: czy produkt jest zmapowany, czy ma prawidłowe odniesienie, czy zadanie synchronizacji jest włączone i czy uruchomił się cron?
9.2 429 pojawiają się tylko podczas nocnej pełnej resynchronizacji
Twój kontener tokenów jest przypisany do konkretnego procesu, więc osiem procesów cron działa osiem razy szybciej niż zamierzona częstotliwość. Przenieś limiter do współdzielonej pamięci masowej. Następnie zakwestionuj samą pełną resynchronizację, porównaj z synced_qty i prześlij tylko zmiany, a nocne spalanie zazwyczaj spada o rząd wielkości. Szanuj retry-after na Etsy 429s i sprawdź getRateLimits na eBayu przed dużą partią, zamiast uderzać w ścianę w trakcie.
9.3 To samo zamówienie jest importowane dwukrotnie, w odstępie kilku godzin
Nakładające się okna ankiety i brakujące ograniczenie. Potwierdź, że indeks UNIQUE dla external_id istnieje, ponieważ polecenie SELECT z kontrolą duplikatów bez niego to wyścig, a nie zabezpieczenie. Następnie sprawdź kursor: sonda pytająca co 15 minut o „zamówienia zaktualizowane w ciągu ostatnich 30 minut” oferuje każde zamówienie dwukrotnie, zgodnie z założeniami. Utrzymaj wysoki próg, celowo go nałóż i pozwól bazie danych wymusić unikalność.
9.4 Synchronizacja jednego kanału zatrzymuje się o 3 nad ranem bez błędów
Zwykle utrata tokena odświeżania. Token odświeżania Etsy po cichu przekroczył 90-dniowe okno lub współbieżne odświeżenie dwukrotnie obróciło token, a Twój pracownik zapisał przegranego. Najpierw sprawdź wartość expires_at i znacznik czasu ostatniego pomyślnego odświeżenia w magazynie tokenów. Następnie upewnij się, że usługa cron serwera lub zewnętrzny harmonogram nadal wykonuje zadania synchronizacji. Zatrzymany harmonogram generuje dokładnie ten objaw i dokładnie te puste logi.
10.0 Lista kontrolna gotowości produkcyjnej dla sprzedaży wielokanałowej PrestaShop
Zanim uznasz, że integracja z Etsy lub eBay jest zakończona, przejrzyj poniższą listę:
- Produkty , każdy zsynchronizowany produkt i kombinacja niesie ze sobą unikalne odniesienie, kategorie są mapowane na prawidłowe węzły rynku, wymagane aspekty są wypełniane, a obrazy spełniają wymagania rynku.
- MagazynPrestaShop jest źródłem prawdy, wysyłki zawierają bezwzględne ilości zablokowane dla poszczególnych SKU, wysyłki bez zapasów magazynowych są wysyłane natychmiast, a uzgadnianie odbywa się zgodnie z harmonogramem.
- ZamówieniaIdentyfikator zamówienia na rynku jest przechowywany w ramach unikalnego ograniczenia, podatek ułatwiający i koszty wysyłki są mapowane celowo, a importy są przeprowadzane za pomocą validateOrder().
- API i uwierzytelnianie, dane uwierzytelniające są przechowywane bezpiecznie, odświeżanie odbywa się na marginesie za jednorazową blokadą, a limity szybkości są współdzielone przez pracowników.
- Cron i monitorowanie, każde wymagane zadanie jest weryfikowalnie wykonywane, widoczny jest wiek kolejki i naprawy uzgadniania, a błędy uwierzytelniania generują alert zamiast wpisu w dzienniku.
11.0 Od czego zacząć
Tworząc integrację z platformą PrestaShop od podstaw, kolejność, która pozwala uniknąć przeróbek, to: integralność SKU, mapowanie tabel, przesyłanie bezwzględnej ilości z blokadą per SKU, import zamówień z unikalnym zewnętrznym ID, uzgadnianie i webhooki na końcu. Webhooki to optymalizacja. Poprawna pętla odpytywania z blokadami i idempotentnością to system, któremu można zaufać.
Jeśli wolisz zacząć od działającego konektora i poświęcić czas na rozwój tego, co jest rzeczywiście specyficzne dla Twojego katalogu, oceń moduł na podstawie tej samej listy, mapowania, harmonogramowania, widoczności błędów, ochrony przed duplikatami, uzgadniania i potwierdź jego zadania cron przed uruchomieniem. Tak czy inaczej, celem nie jest jednorazowa synchronizacja. Chodzi o to, aby synchronizacja trwała nadal przez sześć miesięcy.
Jeśli masz pytania lub potrzebujesz pomocy w zakresie wydajności lub migracji witryny, nasi eksperci są do Twojej dyspozycji. Skontaktuj się z zespołem Knowband pod adresem [email protected] już dziś, aby uzyskać niezawodne wtyczki eCommerce dopasowane do Twoich potrzeb.


