Angular, AWS und Symfony Freelancer

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;
}
}

 


Posted

in

,

by

Tags:

Comments

21 Kommentare zu „DHL Retoure Modul in PHP“

  1. Avatar von Rainer H.
    Rainer H.

    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

    1. Avatar von Sebastian Viereck
      Sebastian Viereck

      danke für den Tipp, hab ich gleich geändert

  2. Avatar von jonas
    jonas

    Gibt es auch eine Möglichkeit die PDF zu speichern? Das sie einfach auf den Server gespeichert wird?

  3. Avatar von Markus
    Markus

    Großartig,

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

    Gruß

  4. Avatar von UweK.
    UweK.

    Super, spart ne Menge Gehversuche, weil es auf Anhieb funktioniert hat.
    Besten Dank!

  5. Avatar von Dennis M.
    Dennis M.

    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!

    1. Avatar von Maho
      Maho

      …. ja, wüsste ich auch gerne, was $deliveryName ist 🙂
      Ein beliebiger Wert als Kundenreferenz?

      1. Avatar von Jenny
        Jenny

        $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.

  6. Avatar von Flyingmana
    Flyingmana

    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);

    1. Avatar von Sebastian Viereck
      Sebastian Viereck

      stimmt, sollte auskommentiert werden

  7. Avatar von Rahel
    Rahel

    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?

  8. Avatar von Sven
    Sven

    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.

  9. Avatar von Shady
    Shady

    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

  10. Avatar von sebastian k.
    sebastian k.

    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

  11. Avatar von Kloso
    Kloso

    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

    1. Avatar von Kloso
      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?

  12. Avatar von Kloso
    Kloso

    It is possible to collect the pdf without PHP, for example with google script or java script? Because I want to use it in my Chrome Extension without PHP

    1. Avatar von Sebastian Viereck
      Sebastian Viereck

      sure, you just need to send xml to the dhl server

      1. Avatar von Kloso
        Kloso

        Will the SOAP code be the same?

      2. Avatar von Kloso
        Kloso

        Would it be a big effort for you to build your code in Google Script, because I am not god in coding, and your code ist just working for me in php, but in Google script I am always getting a lot of errors. Thank you in advance 🙂

        1. Avatar von Kloso
          Kloso

          I tried the following approach in Google Script:
          function myFunction(){
          var xml = ‚……. ……“‘

          var options =
          {
          „method“ : „post“,
          „contentType“ : „text/xml“,
          „payload“ : xml
          };
          var result = UrlFetchApp.fetch(options);
          Logger.log(result)
          }

          But it is not enough apparently

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert