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
Żą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::isSignatureValidKod 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!
W konfiguracji InPost Pay włączamy pełne logi:
Store->Config->Sales->Payment->InPost Pay->Debugging Settings->Log Level: DEBUGPotrzebny będzie jeszcze dostęp do bazy danych, a dokładniej to co znajduje się w tabeli:
inpost_pay_quotew kolumnie:
basket_idWartoś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
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)
Po otwarciu formularza podajemy numer telefonu, nie musi to być numer prawdziwy:
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:5b09XLhdhVnrYG5HwPitSKcIhPLWkAHyW 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:
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"
}
]
}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
}
]
}
]
}