13-05-2026 implementation FR
This commit is contained in:
parent
245c281541
commit
70240d2b6a
61 changed files with 4472 additions and 2 deletions
190
dev/2026-05-13-dhl-modul/ENTWICKLUNGSKONZEPT-DHL-MODUL.md
Normal file
190
dev/2026-05-13-dhl-modul/ENTWICKLUNGSKONZEPT-DHL-MODUL.md
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
# Entwicklungskonzept DHL Modul
|
||||
|
||||
Stand: 13.05.2026
|
||||
|
||||
## Ziel
|
||||
|
||||
Diese Datei ist die aktuelle Arbeitsgrundlage fuer die Weiterentwicklung des DHL Moduls. Die bisherigen Markdown-Dateien in diesem Ordner dokumentieren abgeschlossene oder ueberholte Zwischenstaende, insbesondere den frueheren SDK-Ansatz, Paketinstallation, SSL/cURL-Fixes und einzelne abgeschlossene Entwicklungsschritte.
|
||||
|
||||
Aktuelle Anforderungen kommen aus `docs/dhl/Anpassung DHL Modul.md`:
|
||||
|
||||
- Internationaler Versand ausserhalb Deutschlands, insbesondere Oesterreich und Spanien.
|
||||
- Freies Feld fuer Sendungsreferenz oder interne Hinweise wie "Nachlieferung".
|
||||
- Adressvalidierung vor Labelerstellung, damit fehlerhafte Labels und kostenpflichtige Stornos vermieden werden.
|
||||
- Storno im DHL Cockpit pruefen und stabilisieren.
|
||||
- Gewicht von Kompensationsprodukten in das DHL-Paketgewicht einrechnen.
|
||||
- Tracking-Mails auf Rhythmus, Ausloeser und Mehrfachversand pruefen.
|
||||
- Tracking-Codes in Admin, User-Portal und User-N-Portal sichtbar machen.
|
||||
- Tracking-Mail-Versand nur bei Statusaenderung.
|
||||
- DHL-Umstellung von `V62WP` Warenpost auf `V62KP` DHL Kleinpaket bis spaetestens 31.05.2026.
|
||||
|
||||
## Aktueller technischer Stand
|
||||
|
||||
Das produktive Modul basiert auf dem Paket `packages/acme-laravel-dhl` und verwendet die DHL REST API ueber `Acme\Dhl\Support\DhlClient`. Die zentrale Tabelle ist `dhl_package_shipments`.
|
||||
|
||||
Wichtige produktive Einstiegspunkte:
|
||||
|
||||
- `app/Http/Controllers/DhlShipmentController.php`
|
||||
- `app/Services/DhlShipmentService.php`
|
||||
- `app/Services/DhlModalService.php`
|
||||
- `app/Services/DhlDataHelper.php`
|
||||
- `app/Services/DhlTrackingService.php`
|
||||
- `packages/acme-laravel-dhl/src/Services/ShippingService.php`
|
||||
- `packages/acme-laravel-dhl/src/Services/ReturnsService.php`
|
||||
- `packages/acme-laravel-dhl/src/Models/DhlShipment.php`
|
||||
- `config/dhl.php`
|
||||
|
||||
Historische Dokumente erwaehnen teilweise alte Strukturen wie `App\Models\DhlShipment`, `dhl_shipments` oder einen konsolidierten `DhlApiService`. Diese Angaben sind nicht mehr massgeblich, ausser sie werden explizit in aktuellem Code noch referenziert. Aktuell gibt es genau dort noch Altlasten, die bereinigt werden muessen.
|
||||
|
||||
## Offensichtliche Befunde
|
||||
|
||||
### 1. Produktkuerzel `V62WP` ist veraltet
|
||||
|
||||
`V62WP` ist weiterhin in Konfiguration, Admin-Settings, Validierung, Produktauswahl und Sprachdateien vorhanden. DHL verlangt die Umstellung auf `V62KP`.
|
||||
|
||||
Betroffene Stellen:
|
||||
|
||||
- `config/dhl.php`
|
||||
- `app/Http/Controllers/SettingController.php`
|
||||
- `app/Services/DhlModalService.php`
|
||||
- `packages/acme-laravel-dhl/src/Services/ShippingService.php`
|
||||
- `resources/lang/*/dhl.php`
|
||||
|
||||
Risiko: Kleinpaket/Warenpost-Labels koennen nach der DHL-Frist abgelehnt werden.
|
||||
|
||||
### 2. Async Tracking verwendet veraltetes Model
|
||||
|
||||
`app/Jobs/TrackShipmentJob.php` importiert `App\Models\DhlShipment`, dieses Model existiert im aktuellen System nicht mehr. Die produktive DHL-Integration verwendet `Acme\Dhl\Models\DhlShipment`.
|
||||
|
||||
Risiko: Asynchrones Tracking bricht zur Laufzeit, sobald Queue-Tracking genutzt wird.
|
||||
|
||||
### 3. Statuswerte fuer Storno sind inkonsistent
|
||||
|
||||
Im Paket wird bei erfolgreichem Storno `canceled` gesetzt. Andere Stellen, Uebersetzungen und historische Dokumente verwenden `cancelled`.
|
||||
|
||||
Risiko: Filter, Badges, Terminal-Status, Uebersetzungen und Storno-Buttons verhalten sich uneinheitlich.
|
||||
|
||||
### 4. Storno ist technisch vorhanden, aber nicht robust genug
|
||||
|
||||
Storno laeuft ueber `DELETE /parcel/de/shipping/v2/orders/{shipmentNumber}`. Der Code prueft `canCancel()`, speichert aber Fehler nur begrenzt fachlich verwertbar. Produktspezifische Einschraenkungen wie Warenpost/Kleinpaket sind nicht sauber modelliert.
|
||||
|
||||
Risiko: Anwender sehen generische Fehler und koennen nicht erkennen, ob ein Storno produktbedingt, statusbedingt, API-bedingt oder wegen Sandbox/Production-Mismatch scheitert.
|
||||
|
||||
### 5. Internationaler Versand ist nur teilweise vorbereitet
|
||||
|
||||
`V53PAK` ist als internationales Produkt vorhanden, und einige Laender werden in 3-stellige ISO-Codes konvertiert. Dennoch gibt es keinen zentralen Produktentscheid je Zielland, keine harte Validierung nicht unterstuetzter Laender und einen gefaehrlichen Fallback auf `DEU`.
|
||||
|
||||
Risiko: Sendungen nach Oesterreich, Spanien oder weitere Laender koennen falsche Produktcodes, falsche Abrechnungsnummern oder falsche Laendercodes erhalten.
|
||||
|
||||
### 6. Adressvalidierung ist nur formal
|
||||
|
||||
Aktuell prueft das Modul Pflichtfelder, Hausnummern und einfache PLZ-Regeln. Eine echte Pruefung, ob Strasse, PLZ und Ort postalisch existieren, findet nicht statt.
|
||||
|
||||
Empfohlene Loesung: DHL/Post & DHL `DATAFACTORY AUTOCOMPLETE 2.0` fuer DE/AT/CH pruefen und integrieren. Alternativen fuer breiteren Laenderumfang: Loqate, Google Address Validation oder HERE. Wichtig ist eine harte Sperre bei nicht versandfaehigen Adressen vor Labelerstellung.
|
||||
|
||||
### 7. Referenzfeld ist API-seitig vorhanden, aber nicht im Cockpit nutzbar
|
||||
|
||||
`ShippingService` kann `reference` nach `refNo` mappen. `DhlDataHelper` setzt aktuell automatisch `Order-{id}`.
|
||||
|
||||
Risiko: Admins koennen Hinweise wie "Nachlieferung" nicht strukturiert am Label/API-Auftrag hinterlegen.
|
||||
|
||||
### 8. Gewicht von Kompensationsprodukten fehlt
|
||||
|
||||
Kompensationsprodukte werden im Warenkorb mit Gewicht `0` abgelegt, damit die Kompensationslogik nicht beeinflusst wird. Das DHL-Gewicht kommt aus `ShoppingOrder->weight` und enthaelt dieses Produktgewicht dadurch nicht.
|
||||
|
||||
Risiko: DHL-Label wird mit zu geringem Paketgewicht erstellt.
|
||||
|
||||
### 9. Tracking-Mail-Logik ist grundsaetzlich brauchbar, muss aber abgesichert werden
|
||||
|
||||
Der Scheduler ruft stuendlich `dhl:update-tracking --days=30 --send-emails` auf. Statusabhaengige Intervalle verhindern zu viele API-Calls. Automatische Mails werden nur gesendet, wenn eine Sendung neu auf `in_transit` wechselt und noch keine Mail markiert wurde.
|
||||
|
||||
Risiko: Statusspruenge direkt auf `out_for_delivery` oder besondere DHL-Statuscodes koennen ohne Mail bleiben. Mehrere Sendungen einer Bestellung werden teils zusammengefasst, aber die fachliche Regel muss final bestaetigt werden.
|
||||
|
||||
## Entwicklungskonzept
|
||||
|
||||
### Phase 1: Pflichtkorrekturen vor DHL-Frist
|
||||
|
||||
1. `V62WP` vollstaendig auf `V62KP` migrieren.
|
||||
2. Neue Konfigurationskeys fuer `DHL_ACCOUNT_NUMBER_V62KP`, Admin-Setting `dhl_account_v62kp`, Dimensionen und Uebersetzungen einfuehren.
|
||||
3. `ShippingService` Validierung um `V62KP` erweitern und `V62WP` entfernen oder nur noch als Legacy-Mapping fuer Altdaten anzeigen.
|
||||
4. Bestehende Sendungen mit `V62WP` historisch lesbar lassen, aber neue Labelerstellung blockieren.
|
||||
5. Tests fuer Produktcode-Auswahl, Validierung und Payload-Erstellung schreiben.
|
||||
|
||||
### Phase 2: Stabilisierung von Tracking und Storno
|
||||
|
||||
1. `TrackShipmentJob` auf aktuelles Model und aktuellen `DhlTrackingService` umstellen.
|
||||
2. Statuswerte vereinheitlichen. Empfehlung: intern `canceled` verwenden, Uebersetzung auf Deutsch "Storniert".
|
||||
3. `TERMINAL_STATUSES`, Badges, Filter und Sprachdateien entsprechend angleichen.
|
||||
4. Storno-Fehler strukturiert speichern: HTTP-Status, DHL-Fehlercode, DHL-Detailtext, Zeitpunkt.
|
||||
5. Admin-Feedback verbessern: nicht stornierbar wegen Status, Produkt, API-Antwort oder nicht auffindbarer DHL-Sendung.
|
||||
6. Tests fuer erfolgreiche Stornierung, bereits stornierte Sendung, nicht stornierbare Sendung und API-Fehler.
|
||||
|
||||
### Phase 3: Internationalisierung Versand
|
||||
|
||||
1. Zentralen Service fuer Produkt-/Billing-Entscheidung einfuehren, z. B. `DhlProductResolver`.
|
||||
2. Zielland, Produktcode, Abrechnungsnummer und erlaubte Services dort validieren.
|
||||
3. Regeln initial:
|
||||
- `DE`: `V01PAK` oder `V62KP`
|
||||
- `AT`, `ES` und weitere aktivierte Laender: `V53PAK`
|
||||
4. Fallback auf `DEU` entfernen. Unbekannte Laender muessen mit klarer Fehlermeldung abbrechen.
|
||||
5. Cockpit-Formular: Produkt anhand Zielland vorschlagen, aber Admin-Korrektur erlauben.
|
||||
|
||||
### Phase 4: Adressvalidierung vor Labelerstellung
|
||||
|
||||
1. Neuen serverseitigen Validierungsendpunkt fuer DHL-Adressen schaffen.
|
||||
2. Basisvalidierung behalten: Pflichtfelder, Land, PLZ-Format, Hausnummer, Packstation/Postnummer.
|
||||
3. DHL DATAFACTORY AUTOCOMPLETE 2.0 fuer DE/AT/CH evaluieren.
|
||||
4. Falls DHL fuer alle benoetigten Laender nicht ausreicht, externen Provider evaluieren.
|
||||
5. UI-Status einfuehren:
|
||||
- gueltig: Labelerstellung erlaubt
|
||||
- Warnung: Admin kann bewusst fortfahren
|
||||
- Fehler: Labelerstellung gesperrt
|
||||
6. Validierungsergebnis optional am Shipment/Order protokollieren.
|
||||
|
||||
### Phase 5: Referenzfeld und Admin-UX
|
||||
|
||||
1. Neues Formularfeld `reference` oder `shipment_reference` im DHL Cockpit.
|
||||
2. Wert an `DhlDataHelper::prepareOrderData()` uebergeben.
|
||||
3. `ShippingService` nutzt vorhandenes Mapping nach `refNo`.
|
||||
4. Referenz im Shipment speichern, damit spaeter nachvollziehbar ist, warum eine Sendung erstellt wurde.
|
||||
5. Laengenlimit der DHL API beachten, aktuell maximal 35 Zeichen.
|
||||
|
||||
### Phase 6: DHL-Gewicht korrekt berechnen
|
||||
|
||||
1. Separaten Gewichtsdienst fuer DHL einfuehren, z. B. `DhlShipmentWeightCalculator`.
|
||||
2. Basis: `ShoppingOrder->weight`.
|
||||
3. Fuer `shopping_order_items` mit `comp > 0` das Produktgewicht aus `Product->weight` nachladen und addieren.
|
||||
4. Nur DHL-Gewicht anpassen, nicht die bestehende Warenkorb-/Versandkostenlogik.
|
||||
5. Rundung und DHL-Grenzwerte je Produkt testen.
|
||||
|
||||
### Phase 7: Tracking-Codes und Mails fachlich finalisieren
|
||||
|
||||
1. Bestehende Admin-Anzeige pruefen und bei Bedarf vereinheitlichen.
|
||||
2. Tracking-Code-Anzeige in User-Portal und User-N-Portal ergaenzen.
|
||||
3. Mail-Regel final definieren:
|
||||
- automatisch nur einmal pro Sendung
|
||||
- nur bei relevanter Statusaenderung
|
||||
- mehrere Sendungen einer Bestellung sinnvoll zusammenfassen
|
||||
4. Statusspruenge wie `created` direkt nach `out_for_delivery` abdecken.
|
||||
5. Command `dhl:update-tracking` Tests fuer Mailausloeser und Nicht-Ausloeser ergaenzen.
|
||||
|
||||
## Empfohlene Reihenfolge
|
||||
|
||||
1. `V62WP` -> `V62KP`, Statuswerte und `TrackShipmentJob` korrigieren.
|
||||
2. Storno stabilisieren und bessere Fehlermeldungen im Cockpit anzeigen.
|
||||
3. Internationalen Produktresolver einbauen.
|
||||
4. Referenzfeld und Gewichtskorrektur umsetzen.
|
||||
5. Adressvalidierung integrieren.
|
||||
6. Tracking-Anzeigen und Mailregeln final testen.
|
||||
|
||||
## Teststrategie
|
||||
|
||||
- Feature-Tests fuer Controller-Endpunkte: Label erstellen, Storno, Tracking-Mail, Tracking-Update.
|
||||
- Unit-Tests fuer Produktresolver, Gewichtskalkulation und Adressvalidierung.
|
||||
- HTTP-Fakes fuer DHL API Responses inklusive Fehlerfaelle.
|
||||
- Regression-Test fuer `V62KP` Payload.
|
||||
- Command-Test fuer `dhl:update-tracking --send-emails`.
|
||||
|
||||
## Legacy-Dokumentation
|
||||
|
||||
Die bisherigen Markdown-Dateien wurden nach `dev/dhl-modul/legacy` verschoben. Sie bleiben als Historie erhalten, sind aber nicht mehr die aktuelle Arbeitsgrundlage.
|
||||
656
dev/2026-05-13-dhl-modul/dhl_test.txt
Normal file
656
dev/2026-05-13-dhl-modul/dhl_test.txt
Normal file
|
|
@ -0,0 +1,656 @@
|
|||
--- Test 1: Specific API Endpoint (api-eu.dhl.com/parcel/de/shipping/v2) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host api-eu.dhl.com:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 34.89.220.138
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 34.89.220.138:443...
|
||||
* Connected to api-eu.dhl.com (34.89.220.138) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [2957 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: C=DE; ST=Nordrhein-Westfalen; L=Bonn; O=Deutsche Post AG; CN=api.dhl.com
|
||||
* start date: Feb 18 05:32:51 2025 GMT
|
||||
* expire date: Feb 18 05:31:51 2026 GMT
|
||||
* subjectAltName: host "api-eu.dhl.com" matched cert's "api-eu.dhl.com"
|
||||
* issuer: C=DE; O=Deutsche Post AG; CN=DPDHL Global TLS CA - I5
|
||||
* SSL certificate verify ok.
|
||||
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* using HTTP/1.x
|
||||
} [5 bytes data]
|
||||
> GET /parcel/de/shipping/v2 HTTP/1.1
|
||||
> Host: api-eu.dhl.com
|
||||
> User-Agent: curl/8.5.0
|
||||
> Accept: */*
|
||||
>
|
||||
{ [5 bytes data]
|
||||
< HTTP/1.1 200
|
||||
< Date: Tue, 16 Sep 2025 08:58:44 GMT
|
||||
< Content-Type: application/json
|
||||
< Content-Length: 206
|
||||
< Connection: keep-alive
|
||||
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
|
||||
< Pragma: no-cache
|
||||
< Expires: 0
|
||||
< Strict-Transport-Security: max-age=31536000; includeSubDomains
|
||||
< Access-Control-Allow-Origin: https://developer.dhl.com/
|
||||
< Vary: Origin
|
||||
< Access-Control-Allow-Methods: GET,OPTIONS,POST,DELETE
|
||||
< Access-Control-Max-Age: 7200
|
||||
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With,Profile-ID,Environment-ID,developerID,api-username,My-Client-IP,originalURL
|
||||
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
|
||||
< Correlation-Id: 8dda82f9-5559-4a79-b6cf-d9f2ca2653ea
|
||||
< X-XSS-Protection: 1; mode=block
|
||||
< Content-Security-Policy: default-src 'self'; script-src 'self'
|
||||
< X-Content-Type-Options: nosniff
|
||||
<
|
||||
{ [206 bytes data]
|
||||
100 206 100 206 0 0 299 0 --:--:-- --:--:-- --:--:-- 299
|
||||
* Connection #0 to host api-eu.dhl.com left intact
|
||||
|
||||
{
|
||||
"amp" : {
|
||||
"name": "pp-parcel-shipping-native",
|
||||
"version": "v2.1.4",
|
||||
"rev": "40",
|
||||
"env": "prod-eu"
|
||||
},
|
||||
"backend" : {
|
||||
"version" : "2.1.0",
|
||||
"env" : "production"
|
||||
}
|
||||
}
|
||||
\n\n--- Test 2: Insecure Mode (-k) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host api-eu.dhl.com:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 34.89.220.138
|
||||
* Trying 34.89.220.138:443...
|
||||
* Connected to api-eu.dhl.com (34.89.220.138) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [2957 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: C=DE; ST=Nordrhein-Westfalen; L=Bonn; O=Deutsche Post AG; CN=api.dhl.com
|
||||
* start date: Feb 18 05:32:51 2025 GMT
|
||||
* expire date: Feb 18 05:31:51 2026 GMT
|
||||
* issuer: C=DE; O=Deutsche Post AG; CN=DPDHL Global TLS CA - I5
|
||||
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
|
||||
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* using HTTP/1.x
|
||||
} [5 bytes data]
|
||||
> GET /parcel/de/shipping/v2 HTTP/1.1
|
||||
> Host: api-eu.dhl.com
|
||||
> User-Agent: curl/8.5.0
|
||||
> Accept: */*
|
||||
>
|
||||
{ [5 bytes data]
|
||||
< HTTP/1.1 200
|
||||
< Date: Tue, 16 Sep 2025 08:58:44 GMT
|
||||
< Content-Type: application/json
|
||||
< Content-Length: 206
|
||||
< Connection: keep-alive
|
||||
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
|
||||
< Pragma: no-cache
|
||||
< Expires: 0
|
||||
< Strict-Transport-Security: max-age=31536000; includeSubDomains
|
||||
< Access-Control-Allow-Origin: https://developer.dhl.com/
|
||||
< Vary: Origin
|
||||
< Access-Control-Allow-Methods: GET,OPTIONS,POST,DELETE
|
||||
< Access-Control-Max-Age: 7200
|
||||
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With,Profile-ID,Environment-ID,developerID,api-username,My-Client-IP,originalURL
|
||||
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
|
||||
< Correlation-Id: c853b11f-5627-456c-81be-d712e42b57f7
|
||||
< X-XSS-Protection: 1; mode=block
|
||||
< Content-Security-Policy: default-src 'self'; script-src 'self'
|
||||
< X-Content-Type-Options: nosniff
|
||||
<
|
||||
{ [206 bytes data]
|
||||
100 206 100 206 0 0 393 0 --:--:-- --:--:-- --:--:-- 393
100 206 100 206 0 0 343 0 --:--:-- --:--:-- --:--:-- 343
|
||||
* Connection #0 to host api-eu.dhl.com left intact
|
||||
|
||||
{
|
||||
"amp" : {
|
||||
"name": "pp-parcel-shipping-native",
|
||||
"version": "v2.1.4",
|
||||
"rev": "40",
|
||||
"env": "prod-eu"
|
||||
},
|
||||
"backend" : {
|
||||
"version" : "2.1.0",
|
||||
"env" : "production"
|
||||
}
|
||||
}
|
||||
\n\n--- Test 3: Sister API (v0) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host api-eu.dhl.com:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 34.89.220.138
|
||||
* Trying 34.89.220.138:443...
|
||||
* Connected to api-eu.dhl.com (34.89.220.138) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [2957 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: C=DE; ST=Nordrhein-Westfalen; L=Bonn; O=Deutsche Post AG; CN=api.dhl.com
|
||||
* start date: Feb 18 05:32:51 2025 GMT
|
||||
* expire date: Feb 18 05:31:51 2026 GMT
|
||||
* subjectAltName: host "api-eu.dhl.com" matched cert's "api-eu.dhl.com"
|
||||
* issuer: C=DE; O=Deutsche Post AG; CN=DPDHL Global TLS CA - I5
|
||||
* SSL certificate verify ok.
|
||||
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* using HTTP/1.x
|
||||
} [5 bytes data]
|
||||
> GET /parcel/de/shipping/v0 HTTP/1.1
|
||||
> Host: api-eu.dhl.com
|
||||
> User-Agent: curl/8.5.0
|
||||
> Accept: */*
|
||||
>
|
||||
{ [5 bytes data]
|
||||
< HTTP/1.1 200 OK
|
||||
< Date: Tue, 16 Sep 2025 08:58:45 GMT
|
||||
< Content-Type: application/json
|
||||
< Content-Length: 127
|
||||
< Connection: keep-alive
|
||||
< Host: api-eu.dhl.com
|
||||
< X-Forwarded-For: 79.210.54.184
|
||||
< X-Forwarded-Port: 443
|
||||
< X-Forwarded-Proto: https
|
||||
< User-Agent: curl/8.5.0
|
||||
< Accept: */*
|
||||
< Correlation-Id: 942f1900-6298-4089-9115-d3937f20e3a7
|
||||
< Access-Control-Allow-Origin: https://developer.dhl.com/
|
||||
< Vary: Origin
|
||||
< Access-Control-Allow-Methods: GET,POST,DELETE,PUT,OPTIONS
|
||||
< Access-Control-Max-Age: 7200
|
||||
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,DHL-API-Key,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With
|
||||
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
|
||||
< Strict-Transport-Security: max-age=63113904; includeSubDomains; preload
|
||||
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
|
||||
< Cache-Control: must-revalidate, no-cache, private
|
||||
< X-XSS-Protection: 1; mode=block
|
||||
< Content-Security-Policy: default-src 'self'; script-src 'self'
|
||||
< X-Content-Type-Options: nosniff
|
||||
<
|
||||
{ [127 bytes data]
|
||||
100 127 100 127 0 0 241 0 --:--:-- --:--:-- --:--:-- 241
|
||||
* Connection #0 to host api-eu.dhl.com left intact
|
||||
|
||||
{
|
||||
"amp" : {
|
||||
"name": "pp-parcel-shipping-soap",
|
||||
"version": "v1.1.9",
|
||||
"rev": "78",
|
||||
"env": "prod-eu"
|
||||
}
|
||||
}
|
||||
\n\n--- Test 4: Sandbox Environment (api-sandbox.dhl.com) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host api-sandbox.dhl.com:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 34.89.220.138
|
||||
* Trying 34.89.220.138:443...
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to api-sandbox.dhl.com (34.89.220.138) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [2957 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: C=DE; ST=Nordrhein-Westfalen; L=Bonn; O=Deutsche Post AG; CN=api.dhl.com
|
||||
* start date: Feb 18 05:32:51 2025 GMT
|
||||
* expire date: Feb 18 05:31:51 2026 GMT
|
||||
* subjectAltName: host "api-sandbox.dhl.com" matched cert's "api-sandbox.dhl.com"
|
||||
* issuer: C=DE; O=Deutsche Post AG; CN=DPDHL Global TLS CA - I5
|
||||
* SSL certificate verify ok.
|
||||
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* using HTTP/1.x
|
||||
} [5 bytes data]
|
||||
> GET /parcel/de/shipping/v2 HTTP/1.1
|
||||
> Host: api-sandbox.dhl.com
|
||||
> User-Agent: curl/8.5.0
|
||||
> Accept: */*
|
||||
>
|
||||
{ [5 bytes data]
|
||||
< HTTP/1.1 200
|
||||
< Date: Tue, 16 Sep 2025 08:58:46 GMT
|
||||
< Content-Type: application/json
|
||||
< Content-Length: 203
|
||||
< Connection: keep-alive
|
||||
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
|
||||
< Pragma: no-cache
|
||||
< Expires: 0
|
||||
< Strict-Transport-Security: max-age=31536000; includeSubDomains
|
||||
< Access-Control-Allow-Origin: https://developer.dhl.com/
|
||||
< Vary: Origin
|
||||
< Access-Control-Allow-Methods: GET,OPTIONS,POST,DELETE
|
||||
< Access-Control-Max-Age: 7200
|
||||
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With,Profile-ID,Environment-ID,developerID,api-username,My-Client-IP,originalURL
|
||||
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
|
||||
< Correlation-Id: 18c6b27c-02af-4cb2-9033-1e8c0685b779
|
||||
< X-XSS-Protection: 1; mode=block
|
||||
< Content-Security-Policy: default-src 'self'; script-src 'self'
|
||||
< X-Content-Type-Options: nosniff
|
||||
<
|
||||
{ [203 bytes data]
|
||||
100 203 100 203 0 0 341 0 --:--:-- --:--:-- --:--:-- 341
|
||||
* Connection #0 to host api-sandbox.dhl.com left intact
|
||||
|
||||
{
|
||||
"amp" : {
|
||||
"name": "pp-parcel-shipping-native",
|
||||
"version": "v2.1.4",
|
||||
"rev": "39",
|
||||
"env": "sandbox"
|
||||
},
|
||||
"backend" : {
|
||||
"version" : "2.1.0",
|
||||
"env" : "sandbox"
|
||||
}
|
||||
}
|
||||
\n\n--- Test 5: Different API (tracking) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host api.dhl.com:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 34.89.220.138
|
||||
* Trying 34.89.220.138:443...
|
||||
* Connected to api.dhl.com (34.89.220.138) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [2957 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: C=DE; ST=Nordrhein-Westfalen; L=Bonn; O=Deutsche Post AG; CN=api.dhl.com
|
||||
* start date: Feb 18 05:32:51 2025 GMT
|
||||
* expire date: Feb 18 05:31:51 2026 GMT
|
||||
* subjectAltName: host "api.dhl.com" matched cert's "api.dhl.com"
|
||||
* issuer: C=DE; O=Deutsche Post AG; CN=DPDHL Global TLS CA - I5
|
||||
* SSL certificate verify ok.
|
||||
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
|
||||
* using HTTP/1.x
|
||||
} [5 bytes data]
|
||||
> GET /parcel/de/tracking/v1 HTTP/1.1
|
||||
> Host: api.dhl.com
|
||||
> User-Agent: curl/8.5.0
|
||||
> Accept: */*
|
||||
>
|
||||
{ [5 bytes data]
|
||||
< HTTP/1.1 200
|
||||
< Date: Tue, 16 Sep 2025 08:58:46 GMT
|
||||
< Content-Type: application/json
|
||||
< Content-Length: 178
|
||||
< Connection: keep-alive
|
||||
< content-security-policy: default-src 'none'; frame-ancestors 'none'; script-src 'none'; style-src 'none'
|
||||
< x-content-type-options: nosniff
|
||||
< x-frame-options: SAMEORIGIN
|
||||
< x-xss-protection: 1; mode=block
|
||||
< strict-transport-security: max-age=31536000; includeSubDomains
|
||||
< Access-Control-Allow-Origin: *
|
||||
< Vary: Origin
|
||||
< Access-Control-Allow-Methods: GET,OPTIONS
|
||||
< Access-Control-Max-Age: 7200
|
||||
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,DHL-API-Key,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With
|
||||
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
|
||||
< Correlation-Id: 8f71eabb-3843-48f9-b90a-d390b8958eac
|
||||
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
|
||||
< Cache-Control: must-revalidate, no-cache, private
|
||||
<
|
||||
{ [178 bytes data]
|
||||
100 178 100 178 0 0 321 0 --:--:-- --:--:-- --:--:-- 321
100 178 100 178 0 0 292 0 --:--:-- --:--:-- --:--:-- 292
|
||||
* Connection #0 to host api.dhl.com left intact
|
||||
|
||||
{
|
||||
"amp" : {
|
||||
"name": "pp-parcel-tracking",
|
||||
"version": "v1.0.6",
|
||||
"rev": "24",
|
||||
"env": "prod",
|
||||
"backend env": "prod",
|
||||
"backend version": "1.1.0"
|
||||
}
|
||||
}
|
||||
\n\n--- Test 6: Force EU Server (Apigee) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host rgas1rt001-3-routers.dn.apigee.net:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 35.198.247.238
|
||||
* Trying 35.198.247.238:443...
|
||||
* Connected to rgas1rt001-3-routers.dn.apigee.net (35.198.247.238) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [4022 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: CN=apigee.net
|
||||
* start date: Jul 21 20:39:26 2025 GMT
|
||||
* expire date: Oct 19 20:39:25 2025 GMT
|
||||
* subjectAltName does not match rgas1rt001-3-routers.dn.apigee.net
|
||||
* SSL: no alternative certificate subject name matches target host name 'rgas1rt001-3-routers.dn.apigee.net'
|
||||
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
|
||||
* Closing connection
|
||||
} [5 bytes data]
|
||||
* TLSv1.2 (OUT), TLS alert, close notify (256):
|
||||
} [2 bytes data]
|
||||
curl: (60) SSL: no alternative certificate subject name matches target host name 'rgas1rt001-3-routers.dn.apigee.net'
|
||||
More details here: https://curl.se/docs/sslcerts.html
|
||||
|
||||
curl failed to verify the legitimacy of the server and therefore could not
|
||||
establish a secure connection to it. To learn more about this situation and
|
||||
how to fix it, please visit the web page mentioned above.
|
||||
\n\n--- Test 7: Force US Server (Apigee) ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host agea1rt001-2-routers.dn.apigee.net:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 35.229.17.35
|
||||
* Trying 35.229.17.35:443...
|
||||
* Connected to agea1rt001-2-routers.dn.apigee.net (35.229.17.35) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [108 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Certificate (11):
|
||||
{ [4022 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
|
||||
{ [333 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Server finished (14):
|
||||
{ [4 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
|
||||
} [70 bytes data]
|
||||
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.2 (OUT), TLS handshake, Finished (20):
|
||||
} [16 bytes data]
|
||||
* TLSv1.2 (IN), TLS handshake, Finished (20):
|
||||
{ [16 bytes data]
|
||||
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 / prime256v1 / rsaEncryption
|
||||
* ALPN: server accepted http/1.1
|
||||
* Server certificate:
|
||||
* subject: CN=apigee.net
|
||||
* start date: Jul 21 20:39:26 2025 GMT
|
||||
* expire date: Oct 19 20:39:25 2025 GMT
|
||||
* subjectAltName does not match agea1rt001-2-routers.dn.apigee.net
|
||||
* SSL: no alternative certificate subject name matches target host name 'agea1rt001-2-routers.dn.apigee.net'
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
|
||||
* Closing connection
|
||||
} [5 bytes data]
|
||||
* TLSv1.2 (OUT), TLS alert, close notify (256):
|
||||
} [2 bytes data]
|
||||
curl: (60) SSL: no alternative certificate subject name matches target host name 'agea1rt001-2-routers.dn.apigee.net'
|
||||
More details here: https://curl.se/docs/sslcerts.html
|
||||
|
||||
curl failed to verify the legitimacy of the server and therefore could not
|
||||
establish a secure connection to it. To learn more about this situation and
|
||||
how to fix it, please visit the web page mentioned above.
|
||||
\n\n--- Test 8: api Github.com ---
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
Dload Upload Total Spent Left Speed
|
||||
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Host api.github.com:443 was resolved.
|
||||
* IPv6: (none)
|
||||
* IPv4: 140.82.121.5
|
||||
* Trying 140.82.121.5:443...
|
||||
* Connected to api.github.com (140.82.121.5) port 443
|
||||
* ALPN: curl offers h2,http/1.1
|
||||
} [5 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
|
||||
} [512 bytes data]
|
||||
* CAfile: /etc/ssl/certs/ca-certificates.crt
|
||||
* CApath: /etc/ssl/certs
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Server hello (2):
|
||||
{ [122 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
|
||||
{ [19 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Certificate (11):
|
||||
{ [3134 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
|
||||
{ [79 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Finished (20):
|
||||
{ [36 bytes data]
|
||||
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
|
||||
} [1 bytes data]
|
||||
* TLSv1.3 (OUT), TLS handshake, Finished (20):
|
||||
} [36 bytes data]
|
||||
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256 / X25519 / id-ecPublicKey
|
||||
* ALPN: server accepted h2
|
||||
* Server certificate:
|
||||
* subject: CN=*.github.com
|
||||
* start date: Feb 5 00:00:00 2025 GMT
|
||||
* expire date: Feb 5 23:59:59 2026 GMT
|
||||
* subjectAltName: host "api.github.com" matched cert's "*.github.com"
|
||||
* issuer: C=GB; ST=Greater Manchester; L=Salford; O=Sectigo Limited; CN=Sectigo ECC Domain Validation Secure Server CA
|
||||
* SSL certificate verify ok.
|
||||
* Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
|
||||
* Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
|
||||
* Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
|
||||
} [5 bytes data]
|
||||
* using HTTP/2
|
||||
* [HTTP/2] [1] OPENED stream for https://api.github.com/
|
||||
* [HTTP/2] [1] [:method: GET]
|
||||
* [HTTP/2] [1] [:scheme: https]
|
||||
* [HTTP/2] [1] [:authority: api.github.com]
|
||||
* [HTTP/2] [1] [:path: /]
|
||||
* [HTTP/2] [1] [user-agent: curl/8.5.0]
|
||||
* [HTTP/2] [1] [accept: */*]
|
||||
} [5 bytes data]
|
||||
> GET / HTTP/2
|
||||
> Host: api.github.com
|
||||
> User-Agent: curl/8.5.0
|
||||
> Accept: */*
|
||||
>
|
||||
{ [5 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
|
||||
{ [57 bytes data]
|
||||
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
|
||||
{ [57 bytes data]
|
||||
* old SSL session ID is stale, removing
|
||||
{ [5 bytes data]
|
||||
< HTTP/2 200
|
||||
< date: Tue, 16 Sep 2025 08:58:44 GMT
|
||||
< cache-control: public, max-age=60, s-maxage=60
|
||||
< vary: Accept,Accept-Encoding, Accept, X-Requested-With
|
||||
< x-github-api-version-selected: 2022-11-28
|
||||
< access-control-expose-headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
|
||||
< access-control-allow-origin: *
|
||||
< strict-transport-security: max-age=31536000; includeSubdomains; preload
|
||||
< x-frame-options: deny
|
||||
< x-content-type-options: nosniff
|
||||
< x-xss-protection: 0
|
||||
< referrer-policy: origin-when-cross-origin, strict-origin-when-cross-origin
|
||||
< content-security-policy: default-src 'none'
|
||||
< server: github.com
|
||||
< content-type: application/json; charset=utf-8
|
||||
< x-github-media-type: github.v3; format=json
|
||||
< etag: W/"4f825cc84e1c733059d46e76e6df9db557ae5254f9625dfe8e1b09499c449438"
|
||||
< accept-ranges: bytes
|
||||
< x-ratelimit-limit: 60
|
||||
< x-ratelimit-remaining: 57
|
||||
< x-ratelimit-reset: 1758015947
|
||||
< x-ratelimit-resource: core
|
||||
< x-ratelimit-used: 3
|
||||
< content-length: 2396
|
||||
< x-github-request-id: F783:23D2B0:2B07123:28DA969:68C926C9
|
||||
<
|
||||
{ [2396 bytes data]
|
||||
100 2396 100 2396 0 0 5265 0 --:--:-- --:--:-- --:--:-- 5265
|
||||
* Connection #0 to host api.github.com left intact
|
||||
{
|
||||
"current_user_url": "https://api.github.com/user",
|
||||
"current_user_authorizations_html_url": "https://github.com/settings/connections/applications{/client_id}",
|
||||
"authorizations_url": "https://api.github.com/authorizations",
|
||||
"code_search_url": "https://api.github.com/search/code?q={query}{&page,per_page,sort,order}",
|
||||
"commit_search_url": "https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}",
|
||||
"emails_url": "https://api.github.com/user/emails",
|
||||
"emojis_url": "https://api.github.com/emojis",
|
||||
"events_url": "https://api.github.com/events",
|
||||
"feeds_url": "https://api.github.com/feeds",
|
||||
"followers_url": "https://api.github.com/user/followers",
|
||||
"following_url": "https://api.github.com/user/following{/target}",
|
||||
"gists_url": "https://api.github.com/gists{/gist_id}",
|
||||
"hub_url": "https://api.github.com/hub",
|
||||
"issue_search_url": "https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}",
|
||||
"issues_url": "https://api.github.com/issues",
|
||||
"keys_url": "https://api.github.com/user/keys",
|
||||
"label_search_url": "https://api.github.com/search/labels?q={query}&repository_id={repository_id}{&page,per_page}",
|
||||
"notifications_url": "https://api.github.com/notifications",
|
||||
"organization_url": "https://api.github.com/orgs/{org}",
|
||||
"organization_repositories_url": "https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}",
|
||||
"organization_teams_url": "https://api.github.com/orgs/{org}/teams",
|
||||
"public_gists_url": "https://api.github.com/gists/public",
|
||||
"rate_limit_url": "https://api.github.com/rate_limit",
|
||||
"repository_url": "https://api.github.com/repos/{owner}/{repo}",
|
||||
"repository_search_url": "https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}",
|
||||
"current_user_repositories_url": "https://api.github.com/user/repos{?type,page,per_page,sort}",
|
||||
"starred_url": "https://api.github.com/user/starred{/owner}{/repo}",
|
||||
"starred_gists_url": "https://api.github.com/gists/starred",
|
||||
"topic_search_url": "https://api.github.com/search/topics?q={query}{&page,per_page}",
|
||||
"user_url": "https://api.github.com/users/{user}",
|
||||
"user_organizations_url": "https://api.github.com/user/orgs",
|
||||
"user_repositories_url": "https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",
|
||||
"user_search_url": "https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"
|
||||
}
|
||||
151
dev/2026-05-13-dhl-modul/legacy/AKTUALISIERUNG-PAKET-ANSATZ.md
Normal file
151
dev/2026-05-13-dhl-modul/legacy/AKTUALISIERUNG-PAKET-ANSATZ.md
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
# DHL Modul - Aktualisierung auf Paket-Ansatz
|
||||
|
||||
## Überarbeitung: Von SDK zu eigenständigem Laravel-Paket
|
||||
|
||||
**Datum**: $(date '+%Y-%m-%d')
|
||||
**Grund**: Das christoph-schaeffer/dhl-business-shipping SDK ist veraltet und macht Probleme mit DHL-Login
|
||||
|
||||
## Neue Architektur: packages/acme-laravel-dhl
|
||||
|
||||
### ✅ Durchgeführte Überarbeitungen
|
||||
|
||||
#### 1. Code Refactoring für bessere Lesbarkeit
|
||||
- **Services vollständig überarbeitet**:
|
||||
- `ShippingService` - Versandlabel-Erstellung mit klarer Struktur
|
||||
- `TrackingService` - Tracking-Status mit Bulk-Updates
|
||||
- `ReturnsService` - Retourenlabel-Management
|
||||
- `DhlClient` - HTTP-Client mit umfassendem Error-Handling
|
||||
|
||||
- **Verbesserungen**:
|
||||
- Vollständige PHPDoc-Dokumentation
|
||||
- Typisierung aller Parameter und Rückgabewerte
|
||||
- Private Methoden für bessere Code-Organisation
|
||||
- Validierung aller Eingabedaten
|
||||
- Exception-Handling mit aussagekräftigen Fehlermeldungen
|
||||
|
||||
#### 2. Datenbankschema an optimierten Plan angepasst
|
||||
- **Vereinfachtes Schema** entsprechend PLAN-OPTIMIERT.md:
|
||||
- Eine zentrale `dhl_shipments` Tabelle
|
||||
- `type` Spalte für Outbound/Return-Unterscheidung
|
||||
- `related_shipment_id` für Retour-Verknüpfung
|
||||
- Tracking-Status direkt in Haupttabelle
|
||||
|
||||
- **Migration erstellt**:
|
||||
- `/database/migrations/2025_01_01_000000_create_dhl_shipments_table.php`
|
||||
- `/database/migrations/2025_01_01_000200_create_dhl_tracking_events_table.php`
|
||||
|
||||
- **Neue Models**:
|
||||
- `DhlShipment` - Hauptmodel mit Relationships und Scopes
|
||||
- `DhlTrackingEvent` - Tracking-Events für Phase 2
|
||||
|
||||
#### 3. Error Handling und Validation implementiert
|
||||
- **DhlClient mit robustem Error-Handling**:
|
||||
- HTTP-Status-Code spezifische Exceptions
|
||||
- Retry-Mechanismus (3 Versuche)
|
||||
- Timeout-Handling (30 Sekunden)
|
||||
- User-Agent für API-Identifikation
|
||||
|
||||
- **Service-Validierung**:
|
||||
- Eingabedaten-Validierung vor API-Aufrufen
|
||||
- Konfigurationsprüfung (Billing Number, etc.)
|
||||
- Aussagekräftige Exception-Messages
|
||||
|
||||
### 🗂️ Neue Paket-Struktur
|
||||
|
||||
```
|
||||
packages/acme-laravel-dhl/
|
||||
├── composer.json # Laravel-Paket Konfiguration
|
||||
├── config/dhl.php # DHL API Konfiguration
|
||||
├── database/migrations/ # Datenbank-Struktur
|
||||
│ ├── 2025_01_01_000000_create_dhl_shipments_table.php
|
||||
│ └── 2025_01_01_000200_create_dhl_tracking_events_table.php
|
||||
├── src/
|
||||
│ ├── DhlServiceProvider.php # Laravel Service Provider
|
||||
│ ├── DhlManager.php # Hauptmanager-Klasse
|
||||
│ ├── Facades/DHL.php # Laravel Facade
|
||||
│ ├── Models/
|
||||
│ │ ├── DhlShipment.php # Zentrales Shipment-Model
|
||||
│ │ └── DhlTrackingEvent.php # Tracking-Events
|
||||
│ ├── Services/
|
||||
│ │ ├── ShippingService.php # Versandlabel-Service
|
||||
│ │ ├── TrackingService.php # Tracking-Service
|
||||
│ │ └── ReturnsService.php # Retour-Service
|
||||
│ ├── Support/
|
||||
│ │ └── DhlClient.php # HTTP-API-Client
|
||||
│ └── Http/Controllers/ # Für spätere Web-Integration
|
||||
└── routes/api.php # API-Routen für Webhooks
|
||||
```
|
||||
|
||||
### 📋 Aktualisierter Implementierungsplan
|
||||
|
||||
#### Phase 1: Paket-Integration (2 Schritte)
|
||||
1. **Paket-Registrierung im Hauptprojekt**
|
||||
- composer.json Repositories-Eintrag
|
||||
- Service Provider Registration
|
||||
- Konfiguration publizieren
|
||||
|
||||
2. **API-Credentials Setup**
|
||||
- .env Variablen konfigurieren
|
||||
- Test-Verbindung zur DHL API
|
||||
|
||||
#### Phase 2: Admin-Integration (4 Schritte)
|
||||
3. **Admin-Controller erstellen**
|
||||
- DhlShipmentController für Backend
|
||||
- Integration in bestehende Order-Verwaltung
|
||||
|
||||
4. **Blade-Views für DHL Cockpit**
|
||||
- Sendungsübersicht mit DataTables
|
||||
- Label-Download und -Druck
|
||||
|
||||
5. **Queue-Jobs für Async-Processing**
|
||||
- CreateShipmentJob
|
||||
- CancelShipmentJob
|
||||
- CreateReturnLabelJob
|
||||
|
||||
6. **Tracking-Automation**
|
||||
- UpdateTrackingStatusJob
|
||||
- Artisan Command für Scheduler
|
||||
|
||||
#### Phase 3: Testing & Finalisierung (2 Schritte)
|
||||
7. **Unit/Feature Tests**
|
||||
- Service-Tests mit Mocked API
|
||||
- Controller-Tests
|
||||
- Database-Tests
|
||||
|
||||
8. **Documentation & Polish**
|
||||
- Benutzerhandbuch
|
||||
- API-Dokumentation
|
||||
- Performance-Optimierung
|
||||
|
||||
### ⚠️ Breaking Changes zum alten Ansatz
|
||||
|
||||
1. **Namespace geändert**: `App\Services\DhlApiService` → `Acme\Dhl\Services\*`
|
||||
2. **Datenbank**: `dhl_shipments` statt mehrerer separater Tabellen
|
||||
3. **Model**: `DhlShipment` statt `DhlShipment` (ähnlich, aber neue Struktur)
|
||||
4. **API-Integration**: Direkter HTTP-Client statt SDK-Wrapper
|
||||
|
||||
### 🔧 Migration vom alten System
|
||||
|
||||
Falls bereits bestehende DHL-Integration vorhanden:
|
||||
1. Bestehende Daten nach `dhl_shipments` migrieren
|
||||
2. Controller-Aufrufe auf neue Services umstellen
|
||||
3. View-Integrationen aktualisieren
|
||||
|
||||
### 📦 Vorteile des Paket-Ansatzes
|
||||
|
||||
- **Unabhängigkeit**: Keine Abhängigkeit von veralteten SDKs
|
||||
- **Wartbarkeit**: Sauberer, dokumentierter Code
|
||||
- **Flexibilität**: Direkter API-Zugang ermöglicht alle DHL-Features
|
||||
- **Testbarkeit**: Vollständig mockbare Services
|
||||
- **Laravel-Integration**: Native Laravel-Patterns und Features
|
||||
- **Wiederverwendbarkeit**: Als eigenständiges Paket nutzbar
|
||||
|
||||
### 🎯 Nächste Schritte
|
||||
|
||||
1. **Paket im Hauptprojekt registrieren**
|
||||
2. **DHL API-Credentials konfigurieren**
|
||||
3. **Erste Testlabel erstellen**
|
||||
4. **Admin-Interface implementieren**
|
||||
5. **Bestehende Order-Integration anpassen**
|
||||
|
||||
Das überarbeitete System ist nun deutlich stabiler, wartbarer und zukunftssicher.
|
||||
167
dev/2026-05-13-dhl-modul/legacy/DHL_CURL_781_EXTREME_FIX.md
Normal file
167
dev/2026-05-13-dhl-modul/legacy/DHL_CURL_781_EXTREME_FIX.md
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
# DHL cURL 7.81.0 Extreme Fix - Hartnäckiges SSL-Problem
|
||||
|
||||
## Problem identifiziert
|
||||
|
||||
Ihr Live-Server hat ein **extrem hartnäckiges SSL-Problem** mit:
|
||||
|
||||
- **cURL 7.81.0** (Release-Date: 2022-01-05)
|
||||
- **OpenSSL 3.0.2** (15 Mar 2022)
|
||||
- **PHP 8.4.12**
|
||||
|
||||
**Alle bisherigen Methoden schlagen fehl:**
|
||||
|
||||
- Method 1: Enhanced SSL ❌
|
||||
- Method 2: Relaxed SSL ❌
|
||||
- Method 3: Direct cURL ❌
|
||||
|
||||
## Extreme Lösung implementiert
|
||||
|
||||
### 1. Vierte Fallback-Methode hinzugefügt
|
||||
|
||||
**Method 4: Extreme Fallback** mit minimaler SSL-Konfiguration:
|
||||
|
||||
- ✅ **SSL-Verifikation komplett deaktiviert**
|
||||
- ✅ **TLS 1.2 erzwungen**
|
||||
- ✅ **HTTP/1.1 erzwungen**
|
||||
- ✅ **IPv4 erzwungen**
|
||||
- ✅ **DNS-Cache deaktiviert**
|
||||
- ✅ **Keep-Alive deaktiviert**
|
||||
- ✅ **Fresh Connections**
|
||||
- ✅ **Minimale Buffer-Größe**
|
||||
- ✅ **Längere Timeouts (30s)**
|
||||
|
||||
### 2. Spezielle Konfiguration für cURL 7.81.0
|
||||
|
||||
#### .env-Konfiguration:
|
||||
|
||||
```env
|
||||
# DHL Extreme Fallback für cURL 7.81.0
|
||||
DHL_BASE_URL=https://api-eu.dhl.com
|
||||
DHL_TEST_MODE=false
|
||||
DHL_SANDBOX=false
|
||||
|
||||
# Extreme SSL-Konfiguration
|
||||
DHL_SSL_VERIFY_PEER=false
|
||||
DHL_SSL_VERIFY_HOST=false
|
||||
DHL_SSL_VERSION=TLSv1_2
|
||||
DHL_TIMEOUT=60
|
||||
DHL_CONNECT_TIMEOUT=30
|
||||
|
||||
# Ihre Live-Daten
|
||||
DHL_API_KEY=your_real_live_api_key
|
||||
DHL_USERNAME=your_real_live_username
|
||||
DHL_PASSWORD=your_real_live_password
|
||||
```
|
||||
|
||||
### 3. Was die extreme Methode macht
|
||||
|
||||
#### Minimale SSL-Konfiguration:
|
||||
|
||||
```php
|
||||
CURLOPT_SSL_VERIFYPEER => false,
|
||||
CURLOPT_SSL_VERIFYHOST => false,
|
||||
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2,
|
||||
```
|
||||
|
||||
#### Maximale Kompatibilität:
|
||||
|
||||
```php
|
||||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||||
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
|
||||
CURLOPT_DNS_CACHE_TIMEOUT => 0,
|
||||
CURLOPT_TCP_KEEPALIVE => 0,
|
||||
CURLOPT_FRESH_CONNECT => true,
|
||||
CURLOPT_FORBID_REUSE => true,
|
||||
```
|
||||
|
||||
#### Erweiterte Timeouts:
|
||||
|
||||
```php
|
||||
CURLOPT_TIMEOUT => 30,
|
||||
CURLOPT_CONNECTTIMEOUT => 30,
|
||||
CURLOPT_LOW_SPEED_TIME => 30,
|
||||
CURLOPT_LOW_SPEED_LIMIT => 1,
|
||||
```
|
||||
|
||||
### 4. Test der extremen Lösung
|
||||
|
||||
```bash
|
||||
# Konfiguration neu laden
|
||||
php artisan config:clear
|
||||
|
||||
# Test mit allen 4 Methoden
|
||||
php artisan tinker
|
||||
```
|
||||
|
||||
```php
|
||||
$settingController = new \App\Http\Controllers\SettingController();
|
||||
$dhlConfig = $settingController->getDhlConfig();
|
||||
$dhlClient = new \Acme\Dhl\Support\DhlClient(
|
||||
$dhlConfig['base_url'],
|
||||
$dhlConfig['api_key'],
|
||||
$dhlConfig['username'],
|
||||
$dhlConfig['password']
|
||||
);
|
||||
|
||||
$result = $dhlClient->testConnection();
|
||||
echo $result ? 'SUCCESS' : 'FAILED';
|
||||
```
|
||||
|
||||
### 5. Erwartete Logs
|
||||
|
||||
Sie sollten jetzt folgende Logs sehen:
|
||||
|
||||
```
|
||||
[INFO] DHL API connection test - trying Laravel HTTP with enhanced SSL
|
||||
[WARNING] DHL API connection test failed with Laravel HTTP with enhanced SSL
|
||||
[INFO] DHL API connection test - trying Laravel HTTP with relaxed SSL
|
||||
[WARNING] DHL API connection test failed with Laravel HTTP with relaxed SSL
|
||||
[INFO] DHL API connection test - trying Direct cURL fallback
|
||||
[WARNING] DHL API connection test failed with Direct cURL fallback
|
||||
[INFO] DHL API connection test - trying Extreme fallback with minimal SSL
|
||||
[INFO] DHL API connection test successful with Extreme fallback with minimal SSL
|
||||
```
|
||||
|
||||
### 6. Warum diese Lösung funktioniert
|
||||
|
||||
#### Problem mit cURL 7.81.0:
|
||||
|
||||
- **Bekannte SSL-Bugs** in dieser Version
|
||||
- **Probleme mit modernen TLS-Handshakes**
|
||||
- **Instabile Verbindungen** bei komplexen SSL-Konfigurationen
|
||||
|
||||
#### Extreme Lösung:
|
||||
|
||||
- **Minimale SSL-Konfiguration** - nur das Nötigste
|
||||
- **Erzwungene IPv4** - vermeidet IPv6-Probleme
|
||||
- **Deaktivierte Caching** - frische Verbindungen
|
||||
- **Längere Timeouts** - mehr Zeit für langsame Verbindungen
|
||||
- **Spezielle User-Agent** - kompatibel mit DHL-Servern
|
||||
|
||||
### 7. Sicherheitshinweise
|
||||
|
||||
⚠️ **Wichtig**: Diese Lösung deaktiviert SSL-Verifikation für maximale Kompatibilität.
|
||||
|
||||
**Für Produktionsumgebungen empfohlen:**
|
||||
|
||||
1. **cURL aktualisieren** auf Version 8.0+ wenn möglich
|
||||
2. **OpenSSL aktualisieren** auf Version 3.0.13+
|
||||
3. **Alternative**: Proxy-Server mit moderner SSL-Konfiguration
|
||||
|
||||
### 8. Monitoring
|
||||
|
||||
Die Lösung loggt detailliert:
|
||||
|
||||
- Welche Methode erfolgreich war
|
||||
- Detaillierte cURL-Fehlerinformationen
|
||||
- Server-Umgebungsdetails
|
||||
|
||||
## Fazit
|
||||
|
||||
Diese extreme Lösung sollte auch das hartnäckigste SSL-Problem mit cURL 7.81.0 beheben! 🎉
|
||||
|
||||
**Falls auch Method 4 fehlschlägt, liegt das Problem wahrscheinlich an:**
|
||||
|
||||
- Server-Firewall/Proxy-Konfiguration
|
||||
- Netzwerk-Infrastruktur
|
||||
- DHL-Server-seitige Probleme
|
||||
152
dev/2026-05-13-dhl-modul/legacy/DHL_LEGACY_CURL_CONFIG.md
Normal file
152
dev/2026-05-13-dhl-modul/legacy/DHL_LEGACY_CURL_CONFIG.md
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
# DHL Konfiguration für ältere cURL-Versionen (Live-Server)
|
||||
|
||||
## Problem identifiziert
|
||||
|
||||
Ihr Live-Server verwendet:
|
||||
|
||||
- **cURL 7.81.0** (ältere Version)
|
||||
- **OpenSSL 3.0.2** (ältere Version)
|
||||
- **PHP 8.2.29**
|
||||
|
||||
Im Vergleich zu Ihrem Testserver:
|
||||
|
||||
- **cURL 8.5.0** (neuere Version)
|
||||
- **OpenSSL 3.0.13** (neuere Version)
|
||||
- **PHP 8.4.12**
|
||||
|
||||
## Optimierte Lösung implementiert
|
||||
|
||||
### 1. Automatische cURL-Versionserkennung
|
||||
|
||||
Die Lösung erkennt automatisch ältere cURL-Versionen (< 8.0.0) und passt die Konfiguration an:
|
||||
|
||||
- **HTTP/2 deaktiviert** für ältere cURL-Versionen
|
||||
- **TCP Keep-Alive aktiviert** für bessere Verbindungsstabilität
|
||||
- **Fresh Connections** für jeden Request
|
||||
- **Optimierte SSL-Handhabung** für ältere OpenSSL-Versionen
|
||||
|
||||
### 2. Spezielle Konfiguration für Ihren Live-Server
|
||||
|
||||
#### .env-Konfiguration:
|
||||
|
||||
```env
|
||||
# DHL Live-Konfiguration für ältere cURL-Versionen
|
||||
DHL_BASE_URL=https://api-eu.dhl.com
|
||||
DHL_TEST_MODE=false
|
||||
DHL_SANDBOX=false
|
||||
|
||||
# SSL-Konfiguration optimiert für cURL 7.81.0
|
||||
DHL_SSL_VERIFY_PEER=true
|
||||
DHL_SSL_VERIFY_HOST=true
|
||||
DHL_SSL_VERSION=TLSv1_2
|
||||
DHL_TIMEOUT=30
|
||||
DHL_CONNECT_TIMEOUT=15
|
||||
|
||||
# Ihre Live-Daten
|
||||
DHL_API_KEY=your_real_live_api_key
|
||||
DHL_USERNAME=your_real_live_username
|
||||
DHL_PASSWORD=your_real_live_password
|
||||
```
|
||||
|
||||
### 3. Fallback-Optionen für problematische Server
|
||||
|
||||
#### Option A: SSL-Verifikation deaktivieren (falls weiterhin Probleme)
|
||||
|
||||
```env
|
||||
DHL_SSL_VERIFY_PEER=false
|
||||
DHL_SSL_VERIFY_HOST=false
|
||||
```
|
||||
|
||||
#### Option B: Ältere TLS-Version verwenden
|
||||
|
||||
```env
|
||||
DHL_SSL_VERSION=TLSv1_1
|
||||
```
|
||||
|
||||
#### Option C: Längere Timeouts
|
||||
|
||||
```env
|
||||
DHL_TIMEOUT=60
|
||||
DHL_CONNECT_TIMEOUT=30
|
||||
```
|
||||
|
||||
### 4. Was die Lösung automatisch macht
|
||||
|
||||
#### Für cURL 7.81.0 (Ihr Live-Server):
|
||||
|
||||
- ✅ Verwendet HTTP/1.1 statt HTTP/2
|
||||
- ✅ Aktiviert TCP Keep-Alive für bessere Verbindungsstabilität
|
||||
- ✅ Verwendet Fresh Connections für jeden Request
|
||||
- ✅ Optimiert SSL-Handhabung für OpenSSL 3.0.2
|
||||
|
||||
#### Für cURL 8.5.0+ (Ihr Testserver):
|
||||
|
||||
- ✅ Verwendet HTTP/2 wenn verfügbar
|
||||
- ✅ Standard-Konfiguration für moderne cURL-Versionen
|
||||
|
||||
### 5. Test der optimierten Lösung
|
||||
|
||||
```bash
|
||||
# Konfiguration neu laden
|
||||
php artisan config:clear
|
||||
|
||||
# Test mit Debug-Logs
|
||||
php artisan tinker
|
||||
```
|
||||
|
||||
```php
|
||||
$settingController = new \App\Http\Controllers\SettingController();
|
||||
$dhlConfig = $settingController->getDhlConfig();
|
||||
$dhlClient = new \Acme\Dhl\Support\DhlClient(
|
||||
$dhlConfig['base_url'],
|
||||
$dhlConfig['api_key'],
|
||||
$dhlConfig['username'],
|
||||
$dhlConfig['password']
|
||||
);
|
||||
|
||||
$result = $dhlClient->testConnection();
|
||||
echo $result ? 'SUCCESS' : 'FAILED';
|
||||
```
|
||||
|
||||
### 6. Debug-Logs für Ihren Live-Server
|
||||
|
||||
Sie werden folgende Logs sehen:
|
||||
|
||||
```
|
||||
[INFO] DHL Server Environment Debug Info {
|
||||
"curl_version": {"version": "7.81.0", ...},
|
||||
"curl_is_old": true,
|
||||
"compatibility": {
|
||||
"will_use_http2": false,
|
||||
"will_use_tcp_keepalive": true,
|
||||
"will_use_fresh_connections": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7. Warum diese Lösung funktioniert
|
||||
|
||||
#### Problem mit cURL 7.81.0:
|
||||
|
||||
- Weniger robuste SSL-Handhabung
|
||||
- Probleme mit HTTP/2
|
||||
- Instabile Verbindungen bei längeren Requests
|
||||
|
||||
#### Lösung:
|
||||
|
||||
- **TCP Keep-Alive**: Hält Verbindungen stabil
|
||||
- **Fresh Connections**: Vermeidet Verbindungsprobleme
|
||||
- **HTTP/1.1**: Kompatibel mit älteren cURL-Versionen
|
||||
- **Optimierte SSL-Optionen**: Angepasst für OpenSSL 3.0.2
|
||||
|
||||
### 8. Monitoring
|
||||
|
||||
Die Lösung loggt automatisch:
|
||||
|
||||
- cURL-Version und Kompatibilitätsstatus
|
||||
- Welche Optimierungen aktiviert sind
|
||||
- Erfolgreiche Verbindungsmethode
|
||||
|
||||
## Fazit
|
||||
|
||||
Die Lösung ist jetzt speziell für Ihren Live-Server mit cURL 7.81.0 optimiert und sollte das SSL-Verbindungsproblem beheben! 🎉
|
||||
119
dev/2026-05-13-dhl-modul/legacy/DHL_LIVE_SERVER_FIX.md
Normal file
119
dev/2026-05-13-dhl-modul/legacy/DHL_LIVE_SERVER_FIX.md
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
# DHL Live-Server SSL-Problem - Erweiterte Lösung
|
||||
|
||||
## Problem
|
||||
|
||||
Der SSL-Fehler `cURL error 56: OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading` tritt nur auf dem Live-Server auf, nicht auf dem Testserver.
|
||||
|
||||
## Erweiterte Lösung implementiert
|
||||
|
||||
### 1. Multi-Methoden-Fallback
|
||||
|
||||
Die `DhlClient` Klasse versucht jetzt automatisch mehrere Verbindungsmethoden:
|
||||
|
||||
1. **Enhanced SSL** - Optimierte SSL-Konfiguration mit HTTP/2
|
||||
2. **Relaxed SSL** - Fallback mit deaktivierter SSL-Verifikation
|
||||
3. **Direct cURL** - Direkte cURL-Implementierung als letzter Ausweg
|
||||
|
||||
### 2. Erweiterte Debug-Logs
|
||||
|
||||
- Server-Umgebungsinformationen werden automatisch geloggt
|
||||
- Detaillierte Fehlermeldungen für jede Verbindungsmethode
|
||||
- PHP, cURL und OpenSSL-Versionsinformationen
|
||||
|
||||
### 3. Live-Server-spezifische Konfiguration
|
||||
|
||||
#### Für problematische Live-Server (.env):
|
||||
|
||||
```env
|
||||
# DHL Live-Konfiguration mit SSL-Fallback
|
||||
DHL_BASE_URL=https://api-eu.dhl.com
|
||||
DHL_TEST_MODE=false
|
||||
DHL_SANDBOX=false
|
||||
|
||||
# SSL-Fallback-Optionen für Live-Server
|
||||
DHL_SSL_VERIFY_PEER=false
|
||||
DHL_SSL_VERIFY_HOST=false
|
||||
DHL_SSL_VERSION=TLSv1_2
|
||||
DHL_TIMEOUT=30
|
||||
DHL_CONNECT_TIMEOUT=15
|
||||
|
||||
# Ihre Live-Daten
|
||||
DHL_API_KEY=your_live_api_key
|
||||
DHL_USERNAME=your_live_username
|
||||
DHL_PASSWORD=your_live_password
|
||||
```
|
||||
|
||||
### 4. Test der erweiterten Lösung
|
||||
|
||||
```bash
|
||||
# Konfiguration neu laden
|
||||
php artisan config:clear
|
||||
|
||||
# Test mit Debug-Logs
|
||||
php artisan tinker
|
||||
```
|
||||
|
||||
```php
|
||||
$settingController = new \App\Http\Controllers\SettingController();
|
||||
$dhlConfig = $settingController->getDhlConfig();
|
||||
$dhlClient = new \Acme\Dhl\Support\DhlClient(
|
||||
$dhlConfig['base_url'],
|
||||
$dhlConfig['api_key'],
|
||||
$dhlConfig['username'],
|
||||
$dhlConfig['password']
|
||||
);
|
||||
|
||||
// Test mit erweiterten Debug-Logs
|
||||
$result = $dhlClient->testConnection();
|
||||
echo $result ? 'SUCCESS' : 'FAILED';
|
||||
```
|
||||
|
||||
### 5. Log-Analyse
|
||||
|
||||
Nach dem Test finden Sie in den Laravel-Logs (`storage/logs/laravel.log`):
|
||||
|
||||
- **Server Environment Debug Info** - Umgebungsdetails
|
||||
- **DHL API connection test - trying [Method]** - Jede versuchte Methode
|
||||
- **DHL API connection test successful with [Method]** - Erfolgreiche Methode
|
||||
- **DHL API connection test failed with [Method]** - Fehlgeschlagene Methoden
|
||||
|
||||
### 6. Häufige Live-Server-Probleme
|
||||
|
||||
#### Problem: Ältere OpenSSL-Version
|
||||
|
||||
```env
|
||||
DHL_SSL_VERSION=TLSv1_1
|
||||
```
|
||||
|
||||
#### Problem: Firewall/Proxy
|
||||
|
||||
```env
|
||||
DHL_TIMEOUT=60
|
||||
DHL_CONNECT_TIMEOUT=30
|
||||
```
|
||||
|
||||
#### Problem: SSL-Zertifikatsprobleme
|
||||
|
||||
```env
|
||||
DHL_SSL_VERIFY_PEER=false
|
||||
DHL_SSL_VERIFY_HOST=false
|
||||
```
|
||||
|
||||
### 7. Monitoring
|
||||
|
||||
Die Lösung loggt automatisch:
|
||||
|
||||
- Welche Verbindungsmethode erfolgreich war
|
||||
- Server-Umgebungsdetails
|
||||
- Detaillierte Fehlermeldungen
|
||||
|
||||
### 8. Rollback-Option
|
||||
|
||||
Falls die erweiterte Lösung Probleme verursacht, können Sie zur ursprünglichen Version zurückkehren, indem Sie die `testConnection()` Methode in `DhlClient.php` vereinfachen.
|
||||
|
||||
## Wichtige Hinweise
|
||||
|
||||
- Die Lösung ist vollständig abwärtskompatibel
|
||||
- Alle bestehenden Konfigurationen funktionieren weiterhin
|
||||
- Die Fallback-Methoden werden nur bei Bedarf verwendet
|
||||
- Debug-Logs helfen bei der Problemdiagnose
|
||||
143
dev/2026-05-13-dhl-modul/legacy/DHL_LIVE_SERVER_SOLUTION.md
Normal file
143
dev/2026-05-13-dhl-modul/legacy/DHL_LIVE_SERVER_SOLUTION.md
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
# ✅ DHL Live-Server SSL-Problem - FINALE LÖSUNG
|
||||
|
||||
## Problem gelöst! 🎉
|
||||
|
||||
Der SSL-Fehler `cURL error 56: OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading` auf dem Live-Server wurde erfolgreich behoben.
|
||||
|
||||
## Was wurde implementiert
|
||||
|
||||
### 1. **Multi-Methoden-Fallback-System**
|
||||
|
||||
Die `DhlClient` Klasse versucht automatisch **3 verschiedene Verbindungsmethoden**:
|
||||
|
||||
1. **Enhanced SSL** - Optimierte SSL-Konfiguration mit HTTP/2
|
||||
2. **Relaxed SSL** - Fallback mit deaktivierter SSL-Verifikation
|
||||
3. **Direct cURL** - Direkte cURL-Implementierung als letzter Ausweg
|
||||
|
||||
### 2. **Erweiterte Debug-Logs**
|
||||
|
||||
- Automatische Server-Umgebungsanalyse
|
||||
- Detaillierte Fehlermeldungen für jede Methode
|
||||
- PHP, cURL und OpenSSL-Versionsinformationen
|
||||
|
||||
### 3. **Konfigurierbare SSL-Optionen**
|
||||
|
||||
Neue `.env`-Variablen für Live-Server-Probleme:
|
||||
|
||||
```env
|
||||
# DHL SSL-Konfiguration für Live-Server
|
||||
DHL_SSL_VERIFY_PEER=true
|
||||
DHL_SSL_VERIFY_HOST=true
|
||||
DHL_SSL_VERSION=TLSv1_2
|
||||
DHL_TIMEOUT=30
|
||||
DHL_CONNECT_TIMEOUT=10
|
||||
```
|
||||
|
||||
## Für Ihren Live-Server
|
||||
|
||||
### Schritt 1: Live-Daten konfigurieren
|
||||
|
||||
```env
|
||||
# DHL Live-Konfiguration
|
||||
DHL_BASE_URL=https://api-eu.dhl.com
|
||||
DHL_TEST_MODE=false
|
||||
DHL_SANDBOX=false
|
||||
|
||||
# Ihre echten Live-Daten
|
||||
DHL_API_KEY=your_real_live_api_key
|
||||
DHL_USERNAME=your_real_live_username
|
||||
DHL_PASSWORD=your_real_live_password
|
||||
```
|
||||
|
||||
### Schritt 2: Konfiguration neu laden
|
||||
|
||||
```bash
|
||||
php artisan config:clear
|
||||
```
|
||||
|
||||
### Schritt 3: Test durchführen
|
||||
|
||||
```bash
|
||||
php artisan tinker
|
||||
```
|
||||
|
||||
```php
|
||||
$settingController = new \App\Http\Controllers\SettingController();
|
||||
$dhlConfig = $settingController->getDhlConfig();
|
||||
$dhlClient = new \Acme\Dhl\Support\DhlClient(
|
||||
$dhlConfig['base_url'],
|
||||
$dhlConfig['api_key'],
|
||||
$dhlConfig['username'],
|
||||
$dhlConfig['password']
|
||||
);
|
||||
|
||||
$result = $dhlClient->testConnection();
|
||||
echo $result ? 'SUCCESS' : 'FAILED';
|
||||
```
|
||||
|
||||
## Was Sie in den Logs sehen werden
|
||||
|
||||
### Bei erfolgreicher Verbindung:
|
||||
|
||||
```
|
||||
[INFO] DHL Server Environment Debug Info {...}
|
||||
[INFO] DHL API connection test - trying Laravel HTTP with enhanced SSL
|
||||
[INFO] DHL API connection test successful with Laravel HTTP with enhanced SSL
|
||||
```
|
||||
|
||||
### Bei Problemen (mit Fallback):
|
||||
|
||||
```
|
||||
[INFO] DHL API connection test - trying Laravel HTTP with enhanced SSL
|
||||
[WARNING] DHL API connection test failed with Laravel HTTP with enhanced SSL
|
||||
[INFO] DHL API connection test - trying Laravel HTTP with relaxed SSL
|
||||
[INFO] DHL API connection test successful with Laravel HTTP with relaxed SSL
|
||||
```
|
||||
|
||||
## Fallback-Optionen für problematische Server
|
||||
|
||||
### Option 1: SSL-Verifikation deaktivieren
|
||||
|
||||
```env
|
||||
DHL_SSL_VERIFY_PEER=false
|
||||
DHL_SSL_VERIFY_HOST=false
|
||||
```
|
||||
|
||||
### Option 2: Ältere TLS-Version
|
||||
|
||||
```env
|
||||
DHL_SSL_VERSION=TLSv1_1
|
||||
```
|
||||
|
||||
### Option 3: Längere Timeouts
|
||||
|
||||
```env
|
||||
DHL_TIMEOUT=60
|
||||
DHL_CONNECT_TIMEOUT=30
|
||||
```
|
||||
|
||||
## Vorteile der Lösung
|
||||
|
||||
✅ **Automatischer Fallback** - Keine manuelle Intervention nötig
|
||||
✅ **Detaillierte Debug-Logs** - Einfache Problemdiagnose
|
||||
✅ **Vollständig abwärtskompatibel** - Bestehende Konfigurationen funktionieren
|
||||
✅ **Server-spezifische Anpassung** - Konfigurierbar für verschiedene Umgebungen
|
||||
✅ **Produktionsreif** - Getestet und stabil
|
||||
|
||||
## Monitoring
|
||||
|
||||
Die Lösung loggt automatisch:
|
||||
|
||||
- Welche Verbindungsmethode erfolgreich war
|
||||
- Server-Umgebungsdetails (PHP, cURL, OpenSSL-Versionen)
|
||||
- Detaillierte Fehlermeldungen für jede Methode
|
||||
|
||||
## Support
|
||||
|
||||
Bei weiteren Problemen:
|
||||
|
||||
1. Prüfen Sie die Debug-Logs in `storage/logs/laravel.log`
|
||||
2. Verwenden Sie die Fallback-Konfigurationsoptionen
|
||||
3. Die Lösung versucht automatisch alle verfügbaren Methoden
|
||||
|
||||
**Die Lösung ist jetzt produktionsreif und sollte auf Ihrem Live-Server funktionieren!** 🚀
|
||||
101
dev/2026-05-13-dhl-modul/legacy/DHL_SSL_FIX_README.md
Normal file
101
dev/2026-05-13-dhl-modul/legacy/DHL_SSL_FIX_README.md
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
# DHL SSL-Verbindungsproblem behoben
|
||||
|
||||
## Problem
|
||||
|
||||
Der Fehler `cURL error 56: OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading` wurde behoben.
|
||||
|
||||
## Lösung
|
||||
|
||||
Die SSL/TLS-Konfiguration in den DHL-Services wurde verbessert:
|
||||
|
||||
### 1. Verbesserte SSL-Konfiguration
|
||||
|
||||
- **TLS-Version**: Erzwingt TLS 1.2 oder höher
|
||||
- **SSL-Verifikation**: Konfigurierbare Peer- und Host-Verifikation
|
||||
- **Timeout-Einstellungen**: Optimierte Verbindungs- und Gesamtzeitouts
|
||||
- **cURL-Optionen**: Erweiterte cURL-Konfiguration für bessere Kompatibilität
|
||||
|
||||
### 2. Neue Konfigurationsoptionen
|
||||
|
||||
In der `.env`-Datei können folgende SSL-Optionen gesetzt werden:
|
||||
|
||||
```env
|
||||
# DHL SSL-Konfiguration (optional)
|
||||
DHL_SSL_VERIFY_PEER=true
|
||||
DHL_SSL_VERIFY_HOST=true
|
||||
DHL_SSL_VERSION=TLSv1_2
|
||||
DHL_TIMEOUT=30
|
||||
DHL_CONNECT_TIMEOUT=10
|
||||
```
|
||||
|
||||
### 3. Für Live-Daten konfigurieren
|
||||
|
||||
Um von Sandbox auf Live-Daten zu wechseln:
|
||||
|
||||
```env
|
||||
# DHL Live-Konfiguration
|
||||
DHL_BASE_URL=https://api-eu.dhl.com
|
||||
DHL_TEST_MODE=false
|
||||
DHL_SANDBOX=false
|
||||
DHL_API_KEY=your_live_api_key
|
||||
DHL_USERNAME=your_live_username
|
||||
DHL_PASSWORD=your_live_password
|
||||
```
|
||||
|
||||
### 4. Geänderte Dateien
|
||||
|
||||
- `packages/acme-laravel-dhl/src/Support/DhlClient.php`
|
||||
- `app/Services/DhlTrackingService.php`
|
||||
- `packages/acme-laravel-dhl/config/dhl.php`
|
||||
|
||||
### 5. Test der Verbindung
|
||||
|
||||
```bash
|
||||
php artisan config:clear
|
||||
php artisan tinker
|
||||
```
|
||||
|
||||
```php
|
||||
$settingController = new \App\Http\Controllers\SettingController();
|
||||
$dhlConfig = $settingController->getDhlConfig();
|
||||
$dhlClient = new \Acme\Dhl\Support\DhlClient(
|
||||
$dhlConfig['base_url'],
|
||||
$dhlConfig['api_key'],
|
||||
$dhlConfig['username'],
|
||||
$dhlConfig['password']
|
||||
);
|
||||
$result = $dhlClient->testConnection();
|
||||
echo $result ? 'SUCCESS' : 'FAILED';
|
||||
```
|
||||
|
||||
## Fallback-Optionen
|
||||
|
||||
Falls weiterhin SSL-Probleme auftreten:
|
||||
|
||||
1. **SSL-Verifikation deaktivieren** (nur für Tests):
|
||||
|
||||
```env
|
||||
DHL_SSL_VERIFY_PEER=false
|
||||
DHL_SSL_VERIFY_HOST=false
|
||||
```
|
||||
|
||||
2. **Ältere TLS-Version verwenden**:
|
||||
|
||||
```env
|
||||
DHL_SSL_VERSION=TLSv1_1
|
||||
```
|
||||
|
||||
3. **Timeout erhöhen**:
|
||||
```env
|
||||
DHL_TIMEOUT=60
|
||||
DHL_CONNECT_TIMEOUT=30
|
||||
```
|
||||
|
||||
## Wichtige Hinweise
|
||||
|
||||
- Die SSL-Verbesserungen sind abwärtskompatibel
|
||||
- Alle bestehenden Konfigurationen funktionieren weiterhin
|
||||
- Die neuen Optionen sind optional und haben sinnvolle Standardwerte
|
||||
- Für Produktionsumgebungen sollten SSL-Verifikationen aktiviert bleiben
|
||||
|
||||
|
||||
33
dev/2026-05-13-dhl-modul/legacy/OPTIMIERUNGEN.md
Normal file
33
dev/2026-05-13-dhl-modul/legacy/OPTIMIERUNGEN.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# Optimierungen am DHL-Modul
|
||||
|
||||
## Code-Verbesserungen
|
||||
|
||||
- Erweiterte Logging in allen Services und DhlClient.
|
||||
- Robuste Payload-Extraktion mit data_get().
|
||||
- Exponential Backoff für Rate-Limits in DhlClient.
|
||||
|
||||
## Behebene Fehler
|
||||
|
||||
- Namenskonflikt: Shipment zu DhlShipment geändert.
|
||||
- Erweiterte Status-Updates in Webhook und TrackingService (mehr Codes gemappt).
|
||||
- Validierung in cancelLabel: Prüft Existenz und canCancel().
|
||||
|
||||
## Optionale Queues
|
||||
|
||||
- Neu in config: 'use_queue' => false (Standard: synchron).
|
||||
- In Services: Wenn true, dispatch Job (z.B. SyncTrackingJob); sonst synchron.
|
||||
- Für Entwicklung/Erstrollout: Synchron. Bei höherer Last: Aktivieren für Asynchronität.
|
||||
|
||||
## Weitere Dokumentation
|
||||
|
||||
- Aktualisierte README.md und PAKET-INSTALLATION.md mit Queue-Infos.
|
||||
|
||||
## Weitere Fixes
|
||||
|
||||
- DhlClient: Sleep zu usleep geändert mit Cap auf 10 Sekunden.
|
||||
- ShippingService: HouseNumber required for DHL!, Retry für Storage::put.
|
||||
- TrackingService: Transaction um firstOrCreate.
|
||||
- Migration: Kommentar zur anonymen Klasse.
|
||||
- Status-Mappings: Zentral in DhlShipment, referenziert in TrackingService.
|
||||
- DhlManager: Descriptive Variablen, Typ-Hints.
|
||||
- Storage-Retry: 3 Versuche mit Logging in ShippingService.
|
||||
257
dev/2026-05-13-dhl-modul/legacy/PAKET-INSTALLATION.md
Normal file
257
dev/2026-05-13-dhl-modul/legacy/PAKET-INSTALLATION.md
Normal file
|
|
@ -0,0 +1,257 @@
|
|||
# DHL Paket Installation & Setup
|
||||
|
||||
## 1. Paket im Hauptprojekt registrieren
|
||||
|
||||
### composer.json erweitern
|
||||
|
||||
```json
|
||||
{
|
||||
"repositories": [
|
||||
{
|
||||
"type": "path",
|
||||
"url": "./packages/acme-laravel-dhl"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"acme/laravel-dhl": "*"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
composer update acme/laravel-dhl
|
||||
```
|
||||
|
||||
## 2. Service Provider registrieren
|
||||
|
||||
### config/app.php (falls Auto-Discovery nicht funktioniert)
|
||||
|
||||
```php
|
||||
'providers' => [
|
||||
// ...
|
||||
Acme\Dhl\DhlServiceProvider::class,
|
||||
],
|
||||
|
||||
'aliases' => [
|
||||
// ...
|
||||
'DHL' => Acme\Dhl\Facades\DHL::class,
|
||||
],
|
||||
```
|
||||
|
||||
## 3. Konfiguration publizieren
|
||||
|
||||
```bash
|
||||
# Konfigurationsdatei publizieren
|
||||
php artisan vendor:publish --provider="Acme\Dhl\DhlServiceProvider" --tag="config"
|
||||
|
||||
# Migrations ausführen
|
||||
php artisan migrate
|
||||
```
|
||||
|
||||
## 4. Umgebungsvariablen konfigurieren
|
||||
|
||||
### .env erweitern
|
||||
|
||||
```env
|
||||
# DHL API Configuration
|
||||
DHL_BASE_URL=https://api-eu.dhl.com
|
||||
DHL_API_KEY=your_api_key_here
|
||||
DHL_USERNAME=your_username
|
||||
DHL_PASSWORD=your_password
|
||||
DHL_BILLING_NUMBER=your_billing_number
|
||||
|
||||
# DHL Default Settings
|
||||
DHL_PRODUCT=V01PAK
|
||||
DHL_LABEL_FORMAT=PDF
|
||||
DHL_PRINT_FORMAT=A4
|
||||
DHL_RETOURE_PRINT_FORMAT=A4
|
||||
DHL_PROFILE=STANDARD_GRUPPENPROFIL
|
||||
|
||||
# DHL Webhook (optional)
|
||||
DHL_WEBHOOK_ENABLED=false
|
||||
DHL_WEBHOOK_SECRET=your_webhook_secret
|
||||
DHL_WEBHOOK_ROUTE=dhl/webhooks/tracking
|
||||
|
||||
# DHL Queue Settings (optional)
|
||||
DHL_USE_QUEUE=false
|
||||
```
|
||||
|
||||
## 5. Test-Verbindung prüfen
|
||||
|
||||
### Artisan Command (zu erstellen)
|
||||
|
||||
```bash
|
||||
php artisan dhl:test-connection
|
||||
```
|
||||
|
||||
### Oder via Tinker
|
||||
|
||||
```php
|
||||
php artisan tinker
|
||||
|
||||
// Service-Container Test
|
||||
app(Acme\Dhl\Services\ShippingService::class);
|
||||
|
||||
// Model Test
|
||||
use Acme\Dhl\Models\DhlShipment;
|
||||
DhlShipment::query()->count();
|
||||
|
||||
// API-Test (vereinfacht)
|
||||
// $client = app(Acme\Dhl\Support\DhlClient::class);
|
||||
// $client->testConnection();
|
||||
```
|
||||
|
||||
## 6. Integration in bestehende Models
|
||||
|
||||
### ShoppingOrder Model erweitern
|
||||
|
||||
```php
|
||||
use Acme\Dhl\Models\DhlShipment;
|
||||
|
||||
class ShoppingOrder extends Model
|
||||
{
|
||||
/**
|
||||
* DHL Sendungen für diese Bestellung
|
||||
*/
|
||||
public function dhlShipments(): HasMany
|
||||
{
|
||||
return $this->hasMany(DhlShipment::class, 'order_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Ausgehende DHL Sendungen
|
||||
*/
|
||||
public function dhlOutboundShipments(): HasMany
|
||||
{
|
||||
return $this->dhlShipments()->outbound();
|
||||
}
|
||||
|
||||
/**
|
||||
* DHL Retouren
|
||||
*/
|
||||
public function dhlReturns(): HasMany
|
||||
{
|
||||
return $this->dhlShipments()->returns();
|
||||
}
|
||||
|
||||
/**
|
||||
* Hat DHL Sendungen
|
||||
*/
|
||||
public function hasDhlShipments(): bool
|
||||
{
|
||||
return $this->dhlShipments()->exists();
|
||||
}
|
||||
|
||||
/**
|
||||
* Neueste DHL Sendung
|
||||
*/
|
||||
public function latestDhlShipment(): ?DhlShipment
|
||||
{
|
||||
return $this->dhlShipments()
|
||||
->latest()
|
||||
->first();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 7. Verwendung in Controllern
|
||||
|
||||
### Beispiel Controller-Integration
|
||||
|
||||
```php
|
||||
use Acme\Dhl\Services\ShippingService;
|
||||
use Acme\Dhl\Services\TrackingService;
|
||||
use Acme\Dhl\Services\ReturnsService;
|
||||
|
||||
class OrderController extends Controller
|
||||
{
|
||||
public function createDhlLabel(
|
||||
ShoppingOrder $order,
|
||||
ShippingService $shippingService
|
||||
) {
|
||||
try {
|
||||
$result = $shippingService->createLabel([
|
||||
'order_id' => $order->id,
|
||||
'shipper' => [
|
||||
'name' => 'Ihre Firma',
|
||||
'street' => 'Ihre Straße 123',
|
||||
'postalCode' => '12345',
|
||||
'city' => 'Ihre Stadt',
|
||||
'country' => 'DE'
|
||||
],
|
||||
'consignee' => [
|
||||
'name' => $order->shipping_name,
|
||||
'street' => $order->shipping_street,
|
||||
'postalCode' => $order->shipping_zip,
|
||||
'city' => $order->shipping_city,
|
||||
'country' => $order->shipping_country
|
||||
],
|
||||
'weight_kg' => $order->total_weight ?? 1.0
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'shipment_number' => $result['shipmentNumber'],
|
||||
'label_path' => $result['label_path']
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => $e->getMessage()
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 8. Facade-Verwendung
|
||||
|
||||
```php
|
||||
use DHL;
|
||||
|
||||
// Label erstellen
|
||||
$result = DHL::createLabel($orderData);
|
||||
|
||||
// Tracking-Status abrufen
|
||||
$status = DHL::getTrackingStatus('1234567890');
|
||||
|
||||
// Retourenlabel erstellen
|
||||
$return = DHL::createReturn($returnData);
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Composer-Probleme
|
||||
|
||||
```bash
|
||||
# Cache leeren
|
||||
composer dump-autoload
|
||||
php artisan config:clear
|
||||
php artisan cache:clear
|
||||
|
||||
# Paket neu installieren
|
||||
composer remove acme/laravel-dhl
|
||||
composer install
|
||||
```
|
||||
|
||||
### Migration-Probleme
|
||||
|
||||
```bash
|
||||
# Migrations-Status prüfen
|
||||
php artisan migrate:status
|
||||
|
||||
# Rollback und neu migrieren
|
||||
php artisan migrate:rollback --step=2
|
||||
php artisan migrate
|
||||
```
|
||||
|
||||
### Service-Provider nicht gefunden
|
||||
|
||||
```bash
|
||||
# Auto-Discovery cache leeren
|
||||
composer dump-autoload
|
||||
php artisan package:discover
|
||||
```
|
||||
195
dev/2026-05-13-dhl-modul/legacy/PLAN-OPTIMIERT.md
Normal file
195
dev/2026-05-13-dhl-modul/legacy/PLAN-OPTIMIERT.md
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
# DHL Versandmodul - Optimierter Programmierplan (MVP)
|
||||
|
||||
## Bewertung der Optimierungsvorschläge
|
||||
|
||||
### ✅ Akzeptierte Optimierungen:
|
||||
|
||||
1. **Vereinfachtes Datenbank-Schema**: Eine `dhl_shipments` Tabelle mit `type` Spalte für Outbound/Return
|
||||
2. **Tracking vereinfacht**: Aktueller Status in Haupttabelle, separate Events-Tabelle für Phase 2
|
||||
3. **Konsolidierte Service-Klasse**: Ein `DhlApiService` statt drei separate Services
|
||||
4. **Advanced Features verschoben**: Excel Export, Webhooks, Notifications als Phase 2
|
||||
|
||||
### 🔄 Kleine Anpassungen am Vorschlag:
|
||||
|
||||
- Jobs bleiben getrennt (CreateShipment, Cancel, ReturnLabel) für bessere Queue-Verwaltung
|
||||
- Tracking-Job für Scheduler-Integration beibehalten
|
||||
- Admin-Navigation früher implementieren für bessere UX
|
||||
|
||||
---
|
||||
|
||||
# Finaler Optimierter Plan - DHL Modul (MVP)
|
||||
|
||||
## Phase 1: Fundament und Kernlogik (8 Schritte)
|
||||
|
||||
### 1. Setup & Dependencies ✅ AKTUALISIERT
|
||||
|
||||
- ~~Composer: `dhl-sdk-api-php/dhl-sdk-bcs` installieren~~ (veraltet, Probleme mit DHL-Login)
|
||||
- **NEUER ANSATZ**: Eigenständiges Laravel-Paket `packages/acme-laravel-dhl`
|
||||
- Direkte DHL API-Integration über HTTP-Client (Guzzle)
|
||||
- Queue-System aktivieren (database driver)
|
||||
|
||||
### 2. Konfiguration
|
||||
|
||||
- `config/dhl.php` erstellen (API-Credentials, Absenderadressen)
|
||||
- Environment-Variablen in `.env` definieren
|
||||
|
||||
### 3. Datenbank & Model ✅ ABGESCHLOSSEN
|
||||
|
||||
- Migration für `dhl_shipments` Tabelle: ✅
|
||||
- order_id, dhl_shipment_no, type (outbound/return)
|
||||
- related_shipment_id (für Retouren), weight_kg, label_path
|
||||
- status, tracking_status, last_tracked_at
|
||||
- api_response_data (JSON), created_at, updated_at
|
||||
- `DhlShipment` Model mit vollständigen Relationships ✅
|
||||
- `DhlTrackingEvent` Model für detaillierte Events ✅
|
||||
|
||||
### 4. Zentraler Service ✅ ABGESCHLOSSEN
|
||||
|
||||
- ~~`DhlApiService` als Wrapper um DHL SDK~~ (SDK-Ansatz verworfen)
|
||||
- **NEUE STRUKTUR**:
|
||||
- `DhlClient` - HTTP-Client für API-Kommunikation ✅
|
||||
- `ShippingService` - Label-Erstellung und -Verwaltung ✅
|
||||
- `TrackingService` - Status-Tracking und -Updates ✅
|
||||
- `ReturnsService` - Retourenlabel-Management ✅
|
||||
- Vollständige Error-Behandlung und Validation ✅
|
||||
|
||||
### 5. Queue Jobs
|
||||
|
||||
- `CreateShipmentJob` für asynchrone Label-Erstellung
|
||||
- `CancelShipmentJob` für Stornierungen
|
||||
- `CreateReturnLabelJob` für Retourenetiketten
|
||||
|
||||
### 6. Controller Foundation
|
||||
|
||||
- `DhlShipmentController` mit store/show/cancel Methoden
|
||||
- Basis-Routen in `routes/web.php`
|
||||
|
||||
### 7. Error Handling & Logging ✅ ABGESCHLOSSEN
|
||||
|
||||
- Exception-Handling für DHL API-Fehler ✅
|
||||
- HTTP-Status spezifische Exceptions
|
||||
- Retry-Mechanismus (3x mit 300ms Delay)
|
||||
- Timeout-Handling (30s)
|
||||
- Aussagekräftige Fehlermeldungen ✅
|
||||
- Validation aller Eingabedaten ✅
|
||||
|
||||
### 8. Basic Testing
|
||||
|
||||
- Unit-Tests für `DhlApiService`
|
||||
- Feature-Tests für Controller
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Admin-Oberfläche (6 Schritte)
|
||||
|
||||
### 9. Navigation & Layout
|
||||
|
||||
- Admin-Menüpunkt "DHL Cockpit"
|
||||
- Bootstrap 5 Layout für DHL-Views
|
||||
|
||||
### 10. Cockpit (Zentrale Übersicht)
|
||||
|
||||
- `index()` Methode im Controller
|
||||
- `cockpit.blade.php` View mit DataTable
|
||||
- Filter: Datum, Status, Sendungstyp
|
||||
|
||||
### 11. Einzelaktionen
|
||||
|
||||
- "Label herunterladen" Button
|
||||
- "Sendung stornieren" Button mit Confirmation
|
||||
|
||||
### 12. Batch-Operationen
|
||||
|
||||
- Mehrere Sendungen auswählen
|
||||
- Stapeldruck von Labels
|
||||
- Massen-Stornierung
|
||||
|
||||
### 13. Integration in Bestellverwaltung
|
||||
|
||||
- DHL-Button in Bestelldetails
|
||||
- Direkter Zugang zu Sendungsinformationen
|
||||
|
||||
### 14. Status-Anzeige & Feedback
|
||||
|
||||
- Alert-System für Erfolgsmeldungen/Fehler
|
||||
- Real-time Status-Updates
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Tracking und Retouren (5 Schritte)
|
||||
|
||||
### 15. Tracking-System
|
||||
|
||||
- `UpdateTrackingStatusJob` für automatische Updates
|
||||
- Artisan Command `dhl:update-tracking`
|
||||
- Scheduler-Integration
|
||||
|
||||
### 16. Tracking-Anzeige
|
||||
|
||||
- Tracking-Status im Cockpit
|
||||
- Tracking-Details in Sendungsansicht
|
||||
- Timeline-View für Sendungsverlauf
|
||||
|
||||
### 17. Retouren-Management
|
||||
|
||||
- Button "Retourenlabel erstellen"
|
||||
- Retouren-Workflow im Admin
|
||||
- Verknüpfung Original-Sendung ↔ Retoure
|
||||
|
||||
### 18. Customer-Interface (Basic)
|
||||
|
||||
- Einfache öffentliche Tracking-Seite
|
||||
- Tracking-Nummer-Eingabe
|
||||
|
||||
### 19. Notifications (Basic)
|
||||
|
||||
- E-Mail bei Sendungserstellung
|
||||
- E-Mail bei wichtigen Status-Änderungen
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Finalisierung & Polish (4 Schritte)
|
||||
|
||||
### 20. Performance-Optimierung
|
||||
|
||||
- Eager Loading für Relationships
|
||||
- Caching für häufige API-Abfragen
|
||||
- Database-Indexe
|
||||
|
||||
### 21. Comprehensive Testing
|
||||
|
||||
- Integration-Tests für DHL SDK
|
||||
- Browser-Tests für Admin-Interface
|
||||
- Error-Scenario Tests
|
||||
|
||||
### 22. Documentation
|
||||
|
||||
- Benutzerhandbuch für Shop-Mitarbeiter
|
||||
- Code-Dokumentation
|
||||
- API-Dokumentation
|
||||
|
||||
### 23. Production-Ready Features
|
||||
|
||||
- Environment-spezifische Konfiguration
|
||||
- Monitoring & Alerting
|
||||
- Backup & Recovery-Konzept
|
||||
|
||||
---
|
||||
|
||||
## Optionale Erweiterungen (Phase 2 des Projekts)
|
||||
|
||||
### Advanced Features (später):
|
||||
|
||||
- Separate `dhl_tracking_events` Tabelle für detaillierte Historie
|
||||
- Excel/CSV Export von Sendungsdaten
|
||||
- Webhook-Integration für automatische Updates
|
||||
- SMS-Notifications
|
||||
- Erweiterte Reporting-Features
|
||||
- Multi-Tenant Support
|
||||
- API für externe Systeme
|
||||
|
||||
---
|
||||
|
||||
**Total: 23 konkrete Schritte** für ein vollständig funktionsfähiges DHL Versandmodul
|
||||
|
||||
Dieser Plan fokussiert sich auf die Kernfunktionalitäten und liefert schnell ein nutzbares Ergebnis.
|
||||
120
dev/2026-05-13-dhl-modul/legacy/README.md
Normal file
120
dev/2026-05-13-dhl-modul/legacy/README.md
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
# DHL Versandmodul - Entwicklungsdokumentation
|
||||
|
||||
## Projektübersicht
|
||||
|
||||
Laravel 11 DHL Versandmodul als eigenständiges Paket mit direkter DHL API-Integration.
|
||||
|
||||
## Architektur-Überarbeitungen ✅
|
||||
|
||||
**August 2025**: Wechsel von SDK-Ansatz zu eigenständigem Laravel-Paket
|
||||
|
||||
### Grund für Überarbeitung
|
||||
|
||||
- `christoph-schaeffer/dhl-business-shipping` SDK ist veraltet
|
||||
- Probleme mit DHL-Login im alten SDK
|
||||
- Bessere Kontrolle durch direkte API-Integration
|
||||
|
||||
### Neue Architektur
|
||||
|
||||
- **Eigenständiges Laravel-Paket**: `packages/acme-laravel-dhl`
|
||||
- **Direkte DHL API**: HTTP-Client statt SDK-Wrapper
|
||||
- **Vereinfachtes Schema**: Eine `dhl_package_shipments` Tabelle für Outbound/Returns
|
||||
- **Moderne Laravel-Patterns**: Service Provider, Facades, Models
|
||||
|
||||
## Aktueller Entwicklungsstand ✅
|
||||
|
||||
### Phase 1: Paket-Grundlagen (ABGESCHLOSSEN)
|
||||
|
||||
- ✅ **Code Refactoring**: Services mit besserer Lesbarkeit
|
||||
- ✅ **Datenbankschema**: Vereinfacht nach optimiertem Plan
|
||||
- ✅ **Error Handling**: Umfassende Exception-Behandlung
|
||||
- ✅ **Models**: DhlShipment + DhlTrackingEvent, inkl. Relationen
|
||||
- ✅ **Services**: ShippingService, TrackingService, ReturnsService
|
||||
- ✅ **HTTP-Client**: DhlClient mit Retry-Mechanismus
|
||||
|
||||
### Phase 2: Integration (ABGESCHLOSSEN)
|
||||
|
||||
- ✅ **Paket-Registration**: In Hauptprojekt eingebunden
|
||||
- ✅ **API-Setup**: Credentials und Konfiguration
|
||||
- ✅ **Admin-Controller**: Backend-Integration
|
||||
- ✅ **Queue-Jobs**: Asynchrone Verarbeitung
|
||||
|
||||
### Phase 3: Admin-Interface (TEILWEISE ABGESCHLOSSEN)
|
||||
|
||||
- ✅ **DHL Cockpit**: Sendungsübersicht mit serverseitigem DataTables
|
||||
- ✅ **Label-Management**: Download und Druck
|
||||
- [ ] **Order-Integration**: DHL-Buttons in Bestellverwaltung
|
||||
|
||||
### Phase 4: Advanced Features (NÄCHSTE SCHRITTE)
|
||||
|
||||
- [ ] **Tracking-Automation**: Scheduler-Integration
|
||||
- [ ] **Notifications**: E-Mail-Benachrichtigungen
|
||||
- [ ] **Testing**: Unit/Feature Tests
|
||||
- [ ] **Documentation**: Benutzerhandbuch
|
||||
|
||||
## Optimierungen und Änderungen (Letzte Updates)
|
||||
|
||||
- **Performance-Boost im Cockpit**: Die Sendungsübersicht wurde auf serverseitiges DataTables umgestellt, was die Ladezeiten bei großen Datenmengen drastisch reduziert.
|
||||
- **Erweiterte Druckformate**: Das Modul unterstützt jetzt die Konfiguration von `print_format` und `retoure_print_format` via `.env` oder Admin-Einstellungen. Diese werden als Query-Parameter an die DHL API übergeben, um das physische Layout der Etiketten (z.B. A4, 910-300-700) zu steuern.
|
||||
- **Speicherung des Routing-Codes**: Der `routing_code` (Leitcode) von DHL wird nun aus der API-Antwort extrahiert und in der Datenbank in der Spalte `dhl_package_shipments.routing_code` gespeichert.
|
||||
- **API-Antwort-Parsing verbessert**: Die Logik wurde angepasst, um die Sendungsdaten korrekt aus dem `items`-Array der API-Antwort zu extrahieren.
|
||||
- **Code optimiert**: Verbesserte Error-Handling, Logging in Services und Client.
|
||||
- **Fehler behoben**: Namenskonflikte (Shipment -> DhlShipment), erweiterte Status-Mappings, robuste Validierungen.
|
||||
- **Optionale Queues**: Konfiguriert via 'use_queue' in `config/dhl.php`. Synchron in Entwicklung, asynchron bei hoher Last.
|
||||
|
||||
## Dateistruktur
|
||||
|
||||
### Aktuelle Dokumentation
|
||||
|
||||
- `AKTUALISIERUNG-PAKET-ANSATZ.md` - Überarbeitungsdetails
|
||||
- `PLAN-OPTIMIERT.md` - Ursprünglicher Plan (aktualisiert)
|
||||
- `PAKET-INSTALLATION.md` - Setup-Anleitung
|
||||
- `OPTIMIERUNGEN.md` - Details zu früheren Optimierungen
|
||||
|
||||
### Paket-Struktur
|
||||
|
||||
```
|
||||
packages/acme-laravel-dhl/
|
||||
├── config/dhl.php # Konfiguration
|
||||
├── database/migrations/ # Datenbankstruktur
|
||||
├── src/
|
||||
│ ├── Services/ # Business Logic
|
||||
│ ├── Models/ # Eloquent Models
|
||||
│ ├── Support/ # HTTP Client
|
||||
│ └── DhlServiceProvider.php # Laravel Integration
|
||||
```
|
||||
|
||||
## Technische Highlights
|
||||
|
||||
### Moderne Laravel-Integration
|
||||
|
||||
- **PSR-4 Autoloading**: Sauberer Namespace
|
||||
- **Service Provider**: Auto-Discovery Support
|
||||
- **Facades**: `DHL::createLabel()` Syntax
|
||||
- **Config Publishing**: `php artisan vendor:publish`
|
||||
|
||||
### Robuste API-Integration
|
||||
|
||||
- **Retry-Mechanismus**: 3 Versuche mit ansteigendem Delay
|
||||
- **Timeout-Handling**: 30 Sekunden pro Request
|
||||
- **HTTP-Status Mapping**: Spezifische Exceptions
|
||||
- **Request/Response Logging**: Vollständige Nachverfolgung
|
||||
- **Flexible API-Parameter**: Unterstützt Body-Payload und Query-Parameter bei POST-Requests.
|
||||
|
||||
### Optimiertes Datenbankschema
|
||||
|
||||
- **Eine Haupttabelle**: `dhl_package_shipments` für Outbound + Returns
|
||||
- **Zusätzliche Felder**: `routing_code` für interne DHL-Logistik
|
||||
- **Efficient Indexing**: Performance-optimiert
|
||||
- **JSON-Felder**: Flexible API-Daten-Speicherung
|
||||
- **Self-References**: Retour-Verknüpfungen
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Order-Integration** abschließen (Buttons in Bestelldetails).
|
||||
2. **Tracking-Automatisierung** implementieren.
|
||||
3. **Umfassende Tests** für die neuen Features schreiben.
|
||||
|
||||
---
|
||||
|
||||
**Status**: Admin-Cockpit implementiert und performant, Kernfunktionalität stabil.
|
||||
136
dev/2026-05-13-dhl-modul/legacy/SCHRITT-3-COMPLETED.md
Normal file
136
dev/2026-05-13-dhl-modul/legacy/SCHRITT-3-COMPLETED.md
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
# Schritt 3: Datenbank & Model - ABGESCHLOSSEN ✅
|
||||
|
||||
## Durchgeführte Arbeiten
|
||||
|
||||
### 3.1 Migration für dhl_shipments Tabelle erstellt ✅
|
||||
- **File**: `database/migrations/2025_08_19_155158_create_dhl_shipments_table.php`
|
||||
- **Status**: Erfolgreich migriert
|
||||
- **Tabelle**: `dhl_shipments`
|
||||
|
||||
#### Tabellenstruktur:
|
||||
```sql
|
||||
- id (bigint unsigned, Primary Key)
|
||||
- shopping_order_id (int unsigned, Foreign Key -> shopping_orders.id)
|
||||
- related_shipment_id (bigint unsigned, Self-Reference für Retouren)
|
||||
- shipment_number (varchar, DHL Sendungsnummer)
|
||||
- tracking_number (varchar, DHL Tracking-Nummer)
|
||||
- type (enum: 'outbound', 'return')
|
||||
- weight, length, width, height (Paketdaten)
|
||||
- product_code (varchar, DHL Produktcode)
|
||||
- services (json, Zusätzliche Services)
|
||||
- label_path, label_format, label_printed (Label-Management)
|
||||
- status (enum: created, submitted, in_transit, delivered, returned, cancelled, failed)
|
||||
- tracking_status, tracking_details, last_tracked_at (Tracking)
|
||||
- recipient_* (vollständige Empfängeradresse)
|
||||
- api_request_data, api_response_data, api_errors (API Debugging)
|
||||
- shipping_cost, currency (Kostenabrechnung)
|
||||
- notes, metadata (Zusätzliche Daten)
|
||||
- shipped_at, delivered_at (Timestamps)
|
||||
- created_at, updated_at (Standard Laravel Timestamps)
|
||||
```
|
||||
|
||||
#### Indizes:
|
||||
- shopping_order_id (Performance)
|
||||
- shipment_number (DHL Suche)
|
||||
- tracking_number (Tracking-Suche)
|
||||
- [type, status] (Kombiniert für Filter)
|
||||
- created_at (Chronologische Sortierung)
|
||||
|
||||
#### Foreign Key Constraints:
|
||||
- shopping_order_id → shopping_orders.id (CASCADE DELETE)
|
||||
- related_shipment_id → dhl_shipments.id (SET NULL)
|
||||
|
||||
### 3.2 DhlShipment Model erstellt ✅
|
||||
- **File**: `app/Models/DhlShipment.php`
|
||||
- **Status**: Vollständig implementiert
|
||||
- **Namespace**: `App\Models\DhlShipment`
|
||||
|
||||
#### Model Features:
|
||||
- ✅ **Vollständige Eloquent Konfiguration** (fillable, casts, table)
|
||||
- ✅ **Konstanten für Status und Typen**
|
||||
- ✅ **Relationships**: belongsTo ShoppingOrder, self-reference für Retouren
|
||||
- ✅ **Scopes**: outbound(), returns(), active(), trackable()
|
||||
- ✅ **Helper Methods**: isOutbound(), isReturn(), canBeCancelled(), hasTracking(), hasLabel()
|
||||
- ✅ **Accessors**: getRecipientAddressAttribute(), getDimensionsAttribute(), getStatusLabelAttribute()
|
||||
- ✅ **Boot Method**: Setzt Default-Werte aus Konfiguration
|
||||
|
||||
#### Konstanten:
|
||||
```php
|
||||
// Typen
|
||||
const TYPE_OUTBOUND = 'outbound';
|
||||
const TYPE_RETURN = 'return';
|
||||
|
||||
// Status
|
||||
const STATUS_CREATED = 'created';
|
||||
const STATUS_SUBMITTED = 'submitted';
|
||||
const STATUS_IN_TRANSIT = 'in_transit';
|
||||
const STATUS_DELIVERED = 'delivered';
|
||||
const STATUS_RETURNED = 'returned';
|
||||
const STATUS_CANCELLED = 'cancelled';
|
||||
const STATUS_FAILED = 'failed';
|
||||
```
|
||||
|
||||
### 3.3 ShoppingOrder Model erweitert ✅
|
||||
- **File**: `app/Models/ShoppingOrder.php`
|
||||
- **Erweitert um DHL Relationships**
|
||||
|
||||
#### Neue Methods:
|
||||
```php
|
||||
dhlShipments() // Alle DHL Sendungen
|
||||
dhlOutboundShipments() // Nur Versand-Sendungen
|
||||
dhlReturnShipments() // Nur Retour-Sendungen
|
||||
hasDhlShipments(): bool // Prüft ob DHL Sendungen existieren
|
||||
getLatestDhlShipment() // Neueste DHL Sendung
|
||||
```
|
||||
|
||||
## Optimierungen implementiert
|
||||
|
||||
### MVP-Fokus erreicht ✅
|
||||
- **Eine zentrale Tabelle** statt separater Tabellen für Retouren
|
||||
- **Vollständige Empfängeradresse** in der Tabelle (kein Join nötig)
|
||||
- **JSON-Felder** für flexible API-Daten und Services
|
||||
- **Self-Reference** für Retouren über `related_shipment_id`
|
||||
|
||||
### Performance optimiert ✅
|
||||
- **Strategische Indizes** für häufige Abfragen
|
||||
- **Efficient Relationships** mit korrekten Foreign Key Typen
|
||||
- **Scopes** für häufige Filter-Operationen
|
||||
- **Casts** für automatische Datentyp-Konvertierung
|
||||
|
||||
### Developer Experience ✅
|
||||
- **Ausführliche PHPDoc** für IDE-Support
|
||||
- **Helper Methods** für Business Logic
|
||||
- **Konstanten** statt Magic Strings
|
||||
- **Accessors** für formatierte Ausgaben
|
||||
|
||||
## Bugfixes durchgeführt ✅
|
||||
- **Foreign Key Type Mismatch** behoben: `unsignedInteger` statt `unsignedBigInteger` für shopping_order_id
|
||||
- **Migration Konflikt** gelöst: Tabelle manuell entfernt und korrekt migriert
|
||||
|
||||
## Verifikation ✅
|
||||
```bash
|
||||
# Migration erfolgreich
|
||||
php artisan migrate
|
||||
# ✅ 2025_08_19_155158_create_dhl_shipments_table: 78.05ms DONE
|
||||
|
||||
# Model lädt korrekt
|
||||
php artisan tinker --execute="use App\Models\DhlShipment; echo DhlShipment::class;"
|
||||
# ✅ App\Models\DhlShipment
|
||||
|
||||
# Relationships funktionieren
|
||||
php artisan tinker --execute="use App\Models\ShoppingOrder; ShoppingOrder::first()->dhlShipments()->count();"
|
||||
# ✅ 0 (erwartungsgemäß, da noch keine DHL Shipments existieren)
|
||||
```
|
||||
|
||||
## Nächste Schritte
|
||||
- **Schritt 4**: Zentraler `DhlApiService` als Wrapper um das DHL SDK
|
||||
- Integration der christoph-schaeffer/dhl-business-shipping Library
|
||||
- Erste API-Verbindung und Test-Calls
|
||||
|
||||
## Files Created/Modified
|
||||
- ✅ `database/migrations/2025_08_19_155158_create_dhl_shipments_table.php` (neu)
|
||||
- ✅ `app/Models/DhlShipment.php` (neu)
|
||||
- ✅ `app/Models/ShoppingOrder.php` (erweitert)
|
||||
|
||||
## Technical Debt: NONE ✨
|
||||
Alle Optimierungen erfolgreich implementiert, keine bekannten Probleme.
|
||||
2273
dev/2026-05-13-dhl-modul/parcel-de-shipping-v2_2.yaml
Normal file
2273
dev/2026-05-13-dhl-modul/parcel-de-shipping-v2_2.yaml
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue