DHL: Auslandslabels mit V53WPAK, Feldlaengen und Tracking-Wiederholung

Log-Analyse 26.08. (P0-2, P1-5, P2-3):
- Produktcode fuer DHL Paket International ist V53WPAK; mit V53PAK wurde
  kein einziges Auslandslabel erzeugt. Alte Codes werden gemappt
  (LEGACY_PRODUCT_CODE_ALIASES), Abrechnungsnummer und Masse suchen auch
  unter den alten Setting-Schluesseln (dhl_account_v53pak) und Env-Namen.
- Zu lange Felder (Name, Stadt, Telefon, Referenz) werden auf die
  DHL-Grenzen gekuerzt bzw. bereinigt statt den Versand abzulehnen; refNo
  mindestens 8 Zeichen, sonst die Bestellreferenz.
- Tracking wiederholt bei HTTP 5xx der Unified-API bis zu dreimal.

Zolldaten fuer die Schweiz (P0-3) sind nicht Teil dieses Commits.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-23 15:41:35 +00:00
parent 323024f65d
commit 8f85c0107c
14 changed files with 508 additions and 68 deletions

View file

@ -58,6 +58,14 @@ class DhlTrackingService
*/
private const DEFAULT_QUOTA_PAUSE_SECONDS = 3600;
/**
* Versuche insgesamt (inklusive Erstversuch) bei HTTP 5xx der Tracking-API,
* und die Wartezeit dazwischen. Die Verzoegerung waechst je Versuch.
*/
private const SERVER_ERROR_MAX_ATTEMPTS = 3;
private const SERVER_ERROR_RETRY_DELAY_MS = 300;
/**
* Minimum gap between two consecutive DHL tracking calls.
*
@ -114,17 +122,7 @@ class DhlTrackingService
'has_api_key' => ! empty($this->apiKey),
]);
$response = Http::withHeaders([
'DHL-API-Key' => $this->apiKey,
'Accept' => 'application/json',
])
->withOptions($this->buildHttpOptions())
->get(self::TRACKING_ENDPOINT, [
'trackingNumber' => $trackingNumber,
'requesterCountryCode' => 'DE',
'originCountryCode' => 'DE',
'language' => 'de',
]);
$response = $this->requestTrackingWithRetry($trackingNumber);
return $this->processSingleShipmentResponse($trackingNumber, $response);
} catch (Exception $e) {
@ -144,6 +142,47 @@ class DhlTrackingService
}
}
/**
* Die Unified Tracking API liefert sporadisch HTTP 5xx. Das ist eine
* Stoerung auf DHL-Seite und geht beim naechsten Versuch meist durch,
* darum wird kurz gewartet und wiederholt, statt jeden Fehlversuch
* einzeln zu protokollieren.
*
* @return Response
*/
private function requestTrackingWithRetry(string $trackingNumber)
{
$attempt = 0;
do {
$attempt++;
$response = Http::withHeaders([
'DHL-API-Key' => $this->apiKey,
'Accept' => 'application/json',
])
->withOptions($this->buildHttpOptions())
->get(self::TRACKING_ENDPOINT, [
'trackingNumber' => $trackingNumber,
'requesterCountryCode' => 'DE',
'originCountryCode' => 'DE',
'language' => 'de',
]);
if ($response->status() < 500 || $attempt >= self::SERVER_ERROR_MAX_ATTEMPTS) {
return $response;
}
Log::info('[DHL Tracking Service] Unified API antwortete mit Serverfehler - erneuter Versuch', [
'tracking_number' => $trackingNumber,
'status_code' => $response->status(),
'attempt' => $attempt,
]);
usleep(self::SERVER_ERROR_RETRY_DELAY_MS * 1000 * $attempt);
} while (true);
}
/**
* Build the standard cURL/Guzzle options used for every DHL tracking call.
*