DHL Retoure Modul in PHP


Die Deutsche Post bietet einen Retouren-Soap Webservice an, mit dem man schnell Retoure-Labels für Pakete erzeugen kann. Mit Hilfe der Klasse lassen diese pdf-Files schnell und einfach holen und anzeigen.

Beispiel-Aufruf:

$dhlRetoure = new DhlRetoure();
$pdf  = $dhlRetoure->getRetourePdf($surname, $familyname, $street, $streetNumber, $zip, $city);
if($pdf){
$dhlRetoure->displayPdf($pdf);
}

DHL Retoure-Klasse:

<?php

/**
* DO NOT DELETE
* User: Sebastian Viereck
* www.sebastianviereck.de
* Date: 10.06.13
*/

class DhlRetoure
{
private $username = "xxx";
private $password = "xxx";
private $portalId = "xxx";
private $deliveryName = "xxx";
private $end_point = "https://amsel.dpwn.net/abholportal/gw/lp/SoapConnector";

public function getRetourePdf($surname, $familyname, $street, $streetNumber, $zip, $city)
{
$xmlRequest = $this->getRequestXml($surname, $familyname, $street, $streetNumber, $zip, $city);
$response = $this->curlSoapRequest($xmlRequest);
if($response){
$pdf = $this->getPdfFromResponse($response);
}
return $pdf;
}
public function displayPdf($pdf){
header("Content-type: application/pdf");
echo $pdf;
}

private function getRequestXml($surname, $familyname, $street, $streetNumber, $zip, $city)
{
$request =
"<?xml version='1.0' encoding='UTF-8' ?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:var='https://amsel.dpwn.net/abholportal/gw/lp/schema/1.0/var3bl'>
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand='1' xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
<wsse:UsernameToken>
<wsse:Username>".$this->username."</wsse:Username>
<wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>
".$this->password."
</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<var:BookLabelRequest
portalId='".$this->portalId."'
deliveryName='".$this->deliveryName."'
shipmentReference='Shipment Reference'
customerReference='Customer Reference'
labelFormat='PDF'
senderName1='$surname'
senderName2='$familyname'
senderCareOfName='CareofName'
senderContactPhone=''
senderStreet='$street'
senderStreetNumber='$streetNumber'
senderBoxNumber=''
senderPostalCode='$zip'
senderCity='$city' />
</soapenv:Body>
</soapenv:Envelope>";
return $request;
}

/**
* @param $soap_request
* @return mixed
*/
private function curlSoapRequest($xmlRequest)
{
$header = array(
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Content-length: " . strlen($xmlRequest),
);

$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL, $this->end_point);
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($soap_do, CURLOPT_TIMEOUT, 10);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($soap_do, CURLOPT_POST, true);
curl_setopt($soap_do, CURLOPT_POSTFIELDS, $xmlRequest);
curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($soap_do);

if (!$response) {
$err = 'Curl error: ' . curl_error($soap_do);
}
else {
/* var_dump(htmlentities($response));*/
}
curl_close($soap_do);
return $response;
}

/**
* @param $response
* @return string
*/
private function getPdfFromResponse($response)
{
$xml = simplexml_load_string($response);
$ns = $xml->getNamespaces(true);
$soap = $xml->children($ns['env']);
$pdf = $soap->Body->children($ns['var3bl'])->BookLabelResponse->label;
$pdf = base64_decode($pdf);
return $pdf;
}
}

 

  1. Danke, hat wunderbar funktioniert.

    Kleine Anmerkung zum Beispiel:
    $dhlRetoure = new DhlRetoure();
    $pdf = $dhl->getRetourePdf($su….
    sollte der Variablenname angepasst werden, sonst tut es nicht:
    $pdf = $dhlRetoure->getRetourePdf($su….
    ;)
    Viele Grüße

  2. Großartig,

    genau danach habe ich seit einem Tag gesucht. Die blöden Seiten von DHL sind dabei leider gar keine Hilfe…

    Gruß

  3. Hallo Sebastian, klasse und vielen Dank! Ich habe nur kurz die Frage, was ich eintragen muss?!

    private $username = Ist der Benutzername für das Retourenportal, oder?
    private $portalId = Hier habe ich den Namen des Portals eingetragen, also was auch in der URL steht sonst: amsel.dpwn.net/abholportal/gw/lp/portal/PORTALID/customer
    private $deliveryName = << Was ist das??

    Danke!

      • $deliveryName ist der Name, den DHL für deine Firma bestimmt hat. Sobald Retoure der Variante 3 (hierfür notwendig) freigeschaltet wurde bekommst du eine Email mit allen deliveryName(s) die deine Firma hat. BeispielfirmaSupertoll bekommt so zum beispiel DE_beispiel_supertoll für das Lager in Deutschland und CH_beispiel_supertoll für das in der Schweiz.

        Mir ist bewusst, das die frage vor 2 Jahren gestellt wurde, aber da ich selbst etwas länger suchen musste dachte ich mir, es wäre vielleicht gut, es hier mal festzuschreiben.

  4. Das deaktivieren der ssl überprüfung ist schon recht fahrlässig:

    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);

  5. Bei der Response bekommen ich zu dem BookLabelResponse auch das Attribut “idc” mit übergeben.
    Aber da komm ich nicht ran.
    Kannst du mir sagen, wie ich “$pdf = $soap->Body->children($ns['var3bl'])->BookLabelResponse->label;” modifizieren muss, um dieses Attribut auszulesen?

  6. Vielen Dank für diese Lösung. Super!

    PDF speichern wäre:
    public function savePdf($pdf, $filename)
    {
    $fp = fopen($filename, “wb+”);
    fwrite($fp, $pdf);
    fclose($fp);
    }
    Und dann entsprechend der Aufruf:
    $dhlRetoure->savePdf($pdf, “retoure.pdf”);

    PS: Die übergebenen Parameter für getRetourePdf() müssen UTF8-codiert sein.

  7. Hallo Sebastian, danke für den Code. Leider bekomme ich nur eine weiße Seite und kein PDF wird generiert. Retoure Variante 3 ist aktiv…. hat sich evtl. etwas geändert? Viele Grüße

  8. folgendes bekomme ich als fehlermeldung:

    SimpleXMLElement Object ( [Header] => SimpleXMLElement Object ( ) [Body] => SimpleXMLElement Object ( [@attributes] => Array ( [encodingStyle] => ) [Fault] => SimpleXMLElement Object ( ) ) )
    Notice: Undefined index: var3bl in /www/htdocs/w00fface/buyrec-wp/dhl/retoure.php on line 114

  9. Guten Tag. Nun bin ich auch dabei das mal zu integrieren. Ich arbeite mit Cloud 9 und kam dabei auf folgenden Fehler:

    Fatal error: Call to undefined function curl_init() in /home/ubuntu/workspace/action.php on line 104

    Hat es was mit der curl_unit() und der fehlenden php.ini zu tun? Und weiß jemand auf anhieb wie man das bei Cloud9 integrieren könnte?

    Außerdem würde mich interessieren ob es immer noch funktioniert oder ob DHL da irgendwas geändert hat, bevor ich da ewig Zeit investiere?

    Liebe Grüße,
    Kloso

    • Ok. Habe jetzt zumindest den Fehler beseitigt mithilfe von:
      “sudo apt-get install php5-curl”.

      Nun wird mir kein fehler angezeigt, sondern wie mein Shady bloß eine weiße Seite. Woran kann es unter anderem liegen?

  10. Es ist möglich, die PDF-Datei ohne PHP zu sammeln, zum Beispiel mit Google Script oder Java-script? Weil ich es in meinem Chrome-Erweiterung ohne PHP verwenden möchten

      • Es wäre ein großer Aufwand für Sie, Ihren Code in Google Script zu bauen, denn ich nicht Gott in der Kodierung bin, und Ihr code ist nur für mich arbeiten, in Php, aber in Google Skript bekomme ich immer eine Menge von Fehlern. Vielen Dank im voraus :)

        • Ich habe versucht die folgende Vorgehensweise in Google Script:
          Funktion myFunction(){
          Var Xml = "……. ……”’

          Var Optionen =
          {
          “Methode” : “Bereitstellen”,
          “contentType” : “Text/xml”,
          “Nutzlast” : XML
          };
          Var Ergebnis = UrlFetchApp.fetch(Optionen);
          Logger.log(Ergebnis)
          }

          Aber es ist nicht genug offenbar