Debugowanie problemów na lokalnym środowisku - instrukcja dla developera

Debugowanie problemów na lokalnym środowisku - instrukcja dla developera

Ze względu na to, że komunikacja z InPost Pay jest obustronna, czyli zarówno Magento wysyła do API InPost Pay żądania oraz API InPost Pay wysyła żądania do Magento, debugowanie problemów na lokalnym środowisku nie jest takie proste. W tym celu należy symulować żądania wysyłane z serwerów InPost Pay na lokalne środowisko na przykład za pośrednictwem oprogramowania Postman lub Insomnia itp.

 

Przygotowanie lokalnego środowiska do debugowania komunikacji z InPost Pay

  1. Żądania przychodzące z InPost Pay posiadają sygnaturę, która jest autoryzowana obustronnie. Nie jest możliwe wysłanie testowego żądania bez autoryzacji sygnatury. Jeśli jednak jest to środowisko lokalne lub testowe odpowiednio zabezpieczone przed klientami z zewnątrz można w tym celu zmodyfikować wskazany niżej plik dodając w pierwszej linii metody zwracanie zawsze poprawnej wartości weryfikacji sygnatury żądania.

\InPost\InPostPay\Plugin\Authorization\SignatureValidationPolicyPlugin::isSignatureValid

Kod po zmianie (pomiędzy liniami 64 i 65, fragment “return true;”) powinien wyglądać tak:

protected function isSignatureValid(): bool { return true; //ommit signature validation $endpoint = $this->restRequest->getRequestUri(); $requestSignature = (string)$this->restRequest->getHeader(self::X_SIGNATURE_HEADER, ''); $requestSignatureTimestamp = (string)$this->restRequest->getHeader(self::X_SIGNATURE_TIMESTAMP_HEADER, ''); $requestPublicKeyVersion = (string)$this->restRequest->getHeader( self::X_SIGNATURE_PUBLIC_KEY_VERSION_HEADER, '' ); ...

Uwaga! Bardzo ważne, aby tej zmiany omyłkowo nie zapisać w systemie wersjonowania plików i aby ta zmiana nie trafiła na środowisko produkcyjne, ponieważ żądania nie będą weryfikowane!

  1. W konfiguracji InPost Pay włączamy pełne logi:
    Store->Config->Sales->Payment->InPost Pay->Debugging Settings->Log Level: DEBUG

  2. Potrzebny będzie jeszcze dostęp do bazy danych, a dokładniej to co znajduje się w tabeli:

    inpost_pay_quote

    w kolumnie:

    basket_id

    Wartości te będą potrzebne do komunikacji z Magento poprzez aplikację Postman jako identyfikator koszyka. Więcej na temat komunikacji Postman->Magento poniżej.

Przykładowy scenariusz komunikacji Magento<->InPost Pay

  1. W przeglądarce pod adresem lokalnym sklepu wchodzimy w katalog produktów, następnie na stronę produktu (zależnie od konfiguracji wyświetlania Widgetu InPost Pay - jeśli jest włączony na karcie produktu, dodajemy produkt z InPost Pay, jeśli Widget pokazuje się tylko w koszyku dodajemy go klasycznie do koszyka, a następnie z podstrony koszyka lub minicart rozpoczynamy parowanie koszyka z InPost Pay)

  2. Po otwarciu formularza podajemy numer telefonu, nie musi to być numer prawdziwy:

    image-20240912-095055.png

  3. Następnie sprawdzamy w bazie danych we wspomnianej wyżej tabeli inpost_pay_quote.basket_id
    Będzie to identyfikator koszyka InPost Pay potrzebny w dalszych krokach w aplikacji Postman.
    Przykładowy basket_id: 5b09XLhdhVnrYG5HwPitSKcIhPLWkAHy

  4. W produkcyjnym scenariuszu, na telefonie aplikacja InPost Pay wyświetliłaby push z prośbą o potwierdzenie powiązania koszyka, którego zatwierdzenie wysłałoby do Magento następujące żądanie:

    POST:
    https://lokalna.domena/rest/v1/izi/basket/5b09XLhdhVnrYG5HwPitSKcIhPLWkAHy/confirmation

    { "phone_number": { "country_prefix": "+48", "phone": "123123123" }, "masked_phone_number": "12*****23", "name": "Jan", "surname": "Kowalski", "browser": { "browser_trusted": true, "browser_id": "cd50a5b7-dcbf-4f2e-b6fd-5d10260e6235" }, "inpost_basket_id": "9cf1ff98-0f54-4931-9a86-27477f3e43b2", "status": "SUCCESS" }

Gdzie w adresie URL pomiędzy “basket” a “confirmation“ znajduje się basket ID z bazy danych Magento.
Zatem aby wywołać w Postman potwierdzenie koszyka należy wysłać następujące żądanie:

image-20240912-095346.png

W odpowiedzi zostaną zwrócone wszystkie informacje jakie InPost Pay otrzymało o tym koszyku Magento i konfiguracji dostaw, zgód itp. Przykładowa odpowiedź Magento:

{ "basket_id": "5b09XLhdhVnrYG5HwPitSKcIhPLWkAHy", "summary": { "basket_base_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "basket_final_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "basket_promo_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "currency": "PLN", "basket_additional_information": "", "payment_type": [ "PAY_BY_LINK", "GOOGLE_PAY", "APPLE_PAY", "CARD", "CARD_TOKEN", "BLIK_CODE", "BLIK_TOKEN" ], "basket_expiration_date": "2024-09-16T08:42:40Z" }, "delivery": [ { "delivery_type": "APM", "delivery_date": "2024-09-16T08:42:40Z", "delivery_options": [ { "delivery_name": "InPost Paczkomat® 24/7 - płatność przy odbiorze", "delivery_code_value": "COD", "delivery_option_price": { "net": 1.63, "gross": 2, "vat": 0.37 } } ], "delivery_price": { "net": 8.13, "gross": 10, "vat": 1.87 }, "free_delivery_minimum_gross_price": 50 }, { "delivery_type": "COURIER", "delivery_date": "2024-09-16T08:42:40Z", "delivery_options": [ ], "delivery_price": { "net": 12.2, "gross": 15, "vat": 2.8 }, "free_delivery_minimum_gross_price": 100 } ], "promo_codes": [ ], "products": [ { "product_id": "9", "product_category": "4", "ean": "24-WB02", "product_name": "Compete Track Tote", "product_description": "The Compete Track Tote holds a host of exercise supplies with ease. Stash your towel, jacket and street shoes inside. Tuck water bottles in easy-access external spaces. Perfect for trips to gym or yoga studio, with dual top handles for convenience to and from. Two-way zippers. Contrast detailing. W 22.0\" x H 17\" x D 10\". Kolumny/Wiersze Kolumna A Kolumna B Kolumna C Kolumna D Kolumna E Wiersz 1 A1 c C1 D1 E1 Wiersz 2 A2 B2 C2 D2 E2 Wiersz 3 A3 B3 C3 D3 E3 Wiersz 4 A4 B4 C4 D4 E4 Wiersz 5 A5 B5 C5 D5 E5 Wiersz 6 A6 B6 C6 D6 E6 Wiersz 7 A7 B7 C7 D7 E7 Wiersz 8 A8 B8 C8 D8 E8 Wiersz 9 A9 B9 C9 D9 E9 Wiersz 10 A10 B10 C10 D10 E10 Lista numeryczna punktów: Punkt pierwszy Punkt drugi Punkt trzeci Punkt czwarty Punkt piąty Punkt szósty Punkt siódmy Punkt ósmy Punkt dziewiąty Punkt dziesiąty Punktowanie: Punkt pierwszy Punkt drugi Punkt trzeci Punkt czwarty Punkt piąty Punkt szósty Punkt siódmy Punkt ósmy Punkt dziewiąty Punkt dziesiąty Pogrubiony tekst! Kursywa! Galeria Zdjęć: Kilka znaków specjalnych:", "product_link": "https://lokalna.domena/compete-track-tote.html", "product_image": "https://lokalna.domena/media/catalog/product/w/b/wb02-green-0.jpg", "base_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "promo_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "quantity": { "quantity": 1, "quantity_type": "INTEGER", "quantity_unit": "sztuk", "available_quantity": 80, "max_quantity": 80 }, "product_attributes": [ { "attribute_name": "Activity", "attribute_value": "Yoga, Gym, School" }, { "attribute_name": "Style", "attribute_value": "Exercise, Tote" }, { "attribute_name": "Material", "attribute_value": "Nylon, Polyester, Rayon" }, { "attribute_name": "Strap/Handle", "attribute_value": "Adjustable, Double, Shoulder" }, { "attribute_name": "Features", "attribute_value": "Waterproof, Lightweight, Reflective" } ], "delivery_product": [ { "delivery_type": "COURIER", "if_delivery_available": true }, { "delivery_type": "APM", "if_delivery_available": true } ] } ], "related_products": [ ], "consents": [ { "consent_id": "1", "consent_link": "https://lokalna.domena/regulamin.html", "consent_description": "Potwierdzam, że zapoznałam(em) się z treścią Regulaminu oraz akceptuję ich postanowienia.", "label_link": "", "additional_consent_links": [ ], "consent_version": "1", "requirement_type": "REQUIRED_ONCE" } ] }
  1. W przypadku produkcyjnego środowiska, kliknięcie w aplikacji InPost Pay na telefonie “Złóż zamówienie” wysyła do Magento żądanie. W celu złożenia zamówienia na lokalnym środowisku należy zasymulować analogiczne żądanie:

    POST:
    https://lokalna.domena/rest/v1/izi/order

    { "order_details": { "basket_id": "5b09XLhdhVnrYG5HwPitSKcIhPLWkAHy", "currency": "PLN", "basket_price": { "net": 34.15, "gross": 42.00, "vat": 7.85 }, "payment_type": "CARD" }, "account_info": { "name": "Jan", "surname": "Kowalski", "phone_number": { "country_prefix": "+48", "phone": "123123123" }, "mail": "jan.kowalski.inpostpaytest@example.com", "client_address": { "country_code": "PL", "city": "Warszawa", "address": "Testowa 123", "postal_code": "12-345", "address_details": { "building": null } } }, "delivery": { "delivery_type": "APM", "mail": "jan.kowalski.inpostpaytest@example.com", "phone_number": { "country_prefix": "+48", "phone": "123123123" }, "delivery_point": "KRA28M" }, "consents": [ { "consent_id": "1", "consent_version": "1", "is_accepted": true } ] }

W powyższym przykładzie należy zmodyfikować:
basket_id ← wyżej opisywana wartość z bazy danych inpost_pay_quote.basket_id
sekcję basket_price ← należy tutaj podać dokładnie takie wartości jakie zwróciło poprzednie zapytanie jako sumę: summary.basket_final_price z ceną wybranej metody dostawy czyli: delivery.delivery_pricedla delivery_type: APM (czyli paczkomat).

W powyższym przykładzie byłoby to zatem:

... "basket_final_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, ...

dodane do:

... "delivery": [ { "delivery_type": "APM", ... "delivery_price": { "net": 8.13, "gross": 10, "vat": 1.87 }, ...

co razem daje:

{ "order_details": { ... "basket_price": { "net": 34.15, "gross": 42.00, "vat": 7.85 }, ... },

 

Uwaga! Te kwoty w produkcyjnym środowisku wylicza aplikacja InPost Pay, ale na potrzeby symulacji należy to samodzielnie wyliczyć. Jeśli zostaną źle policzone te kwoty, podane dane nie będą właściwie lub z przyczyn błędów po stronie Magento zamówienie się nie złoży, w pierwszej kolejności przyczyny należy szukać w logach:

{katalog_magento2}/var/log/inpost-pay/2024-09-09.log (aktualna data)

Jeśli zamówienie zostało złożone poprawnie, Magento powinno odpowiedzieć następująco:

{ "order_details": { "basket_id": "5b09XLhdhVnrYG5HwPitSKcIhPLWkAHy", "order_id": "000000372", "order_discount": 0, "order_comments": "", "basket_price": { "net": 34.15, "gross": 42, "vat": 7.85 }, "currency": "PLN", "payment_type": "CARD", "pos_id": "V017960022", "order_creation_date": "2024-09-09T09:44:31Z", "order_merchant_status_description": "Złożone", "order_base_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "order_final_price": { "net": 34.15, "gross": 42, "vat": 7.85 }, "delivery_references_list": [] }, "invoice_details": { "legal_form": "PERSON", "country_code": "PL", "tax_id_prefix": "", "tax_id": "", "company_name": "", "name": "Jan", "surname": "Kowalski", "city": "Warszawa", "street": "Testowa 123", "building": "", "flat": "", "postal_code": "12-345", "mail": "jan.kowalski.inpostpaytest@example.com", "registration_data_edited": "", "additional_information": "" }, "account_info": { "name": "Jan", "surname": "Kowalski", "phone_number": { "country_prefix": "+48", "phone": "123123123" }, "mail": "jan.kowalski.inpostpaytest@example.com", "client_address": { "country_code": "PL", "address": "Testowa 123", "address_details": { "street": "Testowa 123", "building": "", "flat": "" }, "city": "Warszawa", "postal_code": "12-345" } }, "delivery": { "delivery_type": "APM", "delivery_codes": [], "delivery_date": "2024-09-16T09:44:34Z", "delivery_options": [], "delivery_price": { "net": 8.13, "gross": 10, "vat": 1.87 }, "mail": "jan.kowalski.inpostpaytest@example.com", "delivery_point": "KRA28M", "courier_note": "", "phone_number": { "country_prefix": "+48", "phone": "123123123" }, "delivery_address": { "name": "Jan Kowalski", "country_code": "PL", "address": "Testowa 123", "city": "Warszawa", "postal_code": "12-345", "address_details": { "street": "Testowa 123", "building": "", "flat": "" } } }, "consents": [ { "consent_id": "1", "consent_version": "1", "is_accepted": true } ], "products": [ { "product_id": "9", "product_category": "4", "ean": "24-WB02", "product_name": "Compete Track Tote", "product_description": "The Compete Track Tote holds a host of exercise supplies with ease. Stash your towel, jacket and street shoes inside. Tuck water bottles in easy-access external spaces. Perfect for trips to gym or yoga studio, with dual top handles for convenience to and from. Two-way zippers. Contrast detailing. W 22.0\" x H 17\" x D 10\". Kolumny/Wiersze Kolumna A Kolumna B Kolumna C Kolumna D Kolumna E Wiersz 1 A1 c C1 D1 E1 Wiersz 2 A2 B2 C2 D2 E2 Wiersz 3 A3 B3 C3 D3 E3 Wiersz 4 A4 B4 C4 D4 E4 Wiersz 5 A5 B5 C5 D5 E5 Wiersz 6 A6 B6 C6 D6 E6 Wiersz 7 A7 B7 C7 D7 E7 Wiersz 8 A8 B8 C8 D8 E8 Wiersz 9 A9 B9 C9 D9 E9 Wiersz 10 A10 B10 C10 D10 E10 Lista numeryczna punktów: Punkt pierwszy Punkt drugi Punkt trzeci Punkt czwarty Punkt piąty Punkt szósty Punkt siódmy Punkt ósmy Punkt dziewiąty Punkt dziesiąty Punktowanie: Punkt pierwszy Punkt drugi Punkt trzeci Punkt czwarty Punkt piąty Punkt szósty Punkt siódmy Punkt ósmy Punkt dziewiąty Punkt dziesiąty Pogrubiony tekst! Kursywa! Galeria Zdjęć: Kilka znaków specjalnych:", "product_link": "https://lokalna.domena/compete-track-tote.html", "product_image": "https://lokalna.domena/media/catalog/product/w/b/wb02-green-0.jpg", "base_price": { "net": 26.02, "gross": 32, "vat": 5.98 }, "quantity": { "quantity": 1, "quantity_type": "INTEGER", "quantity_unit": "sztuk", "available_quantity": 79, "max_quantity": 79 }, "product_attributes": [ { "attribute_name": "Activity", "attribute_value": "Yoga, Gym, School" }, { "attribute_name": "Style", "attribute_value": "Exercise, Tote" }, { "attribute_name": "Material", "attribute_value": "Nylon, Polyester, Rayon" }, { "attribute_name": "Strap/Handle", "attribute_value": "Adjustable, Double, Shoulder" }, { "attribute_name": "Features", "attribute_value": "Waterproof, Lightweight, Reflective" } ], "delivery_product": [ { "delivery_type": "COURIER", "if_delivery_available": true }, { "delivery_type": "APM", "if_delivery_available": true } ] } ] }