Klienci zgłaszali że nie mogą złożyć zamówienia – po kliknięciu „Złóż zamówienie” strona się przeładowuje i koszyk jest pusty. Zamówienie nie trafia do systemu. Problem dotyczył tylko płatności kartą, przelew działał. Czas realizacji: 4 godziny.
Objawy
- Kliknięcie „Place Order” odświeża stronę bez potwierdzenia
- Koszyk jest pusty po próbie złożenia zamówienia
- W sieci przeglądarki (DevTools Network): żądanie POST do
/rest/V1/carts/mine/payment-informationzwraca 400 lub 500 - Problem tylko przy metodzie płatności kartą
- W
var/log/exception.log: błąd walidacji CSRF lub błąd bramki płatności
Diagnoza
# Otwórz DevTools > Network > XHR
# Złóż zamówienie i obserwuj requesty
# Znajdź failed request do /rest/V1/carts/
# Sprawdź odpowiedź - błąd 400:
# {"message": "Payment method is not available"}
# lub błąd 422:
# {"message": "Unable to authorize the payment"}
# Sprawdź logi bramki płatności
tail -f var/log/payment_vendor.log
# Sprawdź czy HTTPS jest poprawnie skonfigurowany
# (bramki płatności często wymagają HTTPS na callbacku)
Przyczyna
Certyfikat SSL wygasł na środowisku staging co powodowało że webhook bramki płatności nie mógł się połączyć z powrotem. Na produkcji dodatkowy problem: moduł cache’ował token płatności który wygasał po 15 minutach – klienci z wolnym połączeniem dostawali wygasły token.
Rozwiązanie
<?php
// Problem z cachowaniem tokenu - token ma TTL
// Przed: token cachowany na 1 godzinę
$token = $this->cache->get('payment_token');
// Po: cache z TTL zgodnym z TTL tokenu bramki (15 min)
$token = $this->cache->get('payment_token');
if (!$token || $this->isTokenExpiringSoon($token)) {
$token = $this->gatewayClient->generateToken();
$this->cache->set('payment_token', $token, ttl: 600); // 10 minut
}
private function isTokenExpiringSoon(string $token): bool
{
$payload = json_decode(base64_decode(explode('.', $token)[1]), true);
return ($payload['exp'] - time()) < 120; // < 2 minuty do wygaśnięcia
}
Wnioski
Checkout jest najbardziej krytyczną ścieżką w sklepie. Monitoring API bramki płatności i alerty na błędy 4xx/5xx powinny być standardem. Certyfikaty SSL wymagają automatycznego odnawiania (Let's Encrypt + certbot).
