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:
parent
323024f65d
commit
8f85c0107c
14 changed files with 508 additions and 68 deletions
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue