Я вызываю функцию с помощью cURL и получаю ответ, но когда я вызываю точно такую же функцию с помощью soapclient, я получаю ошибку

#php #arrays #curl #soap #wsdl

#php #массивы #curl #soap #wsdl

Вопрос:

Что мне нужно: мне нужна помощь в выяснении ошибки, которую я получаю при вызове функции из файла WSDL с помощью soapclient. Или я хотел бы получить некоторую помощь в извлечении данных из ответа cURL.

Чего я пытаюсь достичь: я пытаюсь достичь вызова функции из WSDL и получить ответ от действия.

Каковы мои впечатления: я могу успешно вызвать действия storeOrders с помощью оператора cURL, я также получаю ответ. Но с данным ответом я угадываю строку. Я не могу извлечь из нее данные. Поэтому я попытался запросить то же действие с сервера, но затем с помощью soapclient, но я продолжаю получать сообщение об ошибке.

Что я уже пробовал: я пытался сделать ответ cURL новым SimpleXMLElement, но он всегда возвращает объект emty. Также, когда я пытаюсь связаться с одним из дочерних элементов. Я попытался заставить ответ cURL возвращаться в виде массива и выполнить цикл через него с помощью foreach , также здесь я получил пустой объект. Я попытался взорвать ответ cURL, но и там у меня возникли некоторые проблемы с возвратом неправильных данных. Я пытался вызвать ее с помощью SoapClient, но я продолжаю получать эту ошибку.

Поэтому я хотел бы получить некоторую помощь в извлечении данных из cURL или обработке запроса с помощью SoapClient.

Мой запрос cURL (с ответом, все переменные задаются с правильными данными):

 function storeOrderAndGetLabel($delisId, $auth_token, $messageLanguage, $printerLanguage, $paperFormat, $identificationNumber,
$sendingDepot, $product, $mpsCompleteDelivery, $send_name, $send_street, $send_country, $send_zipcode, $send_city,
$send_customerNumber, $rec_name, $rec_street, $rec_state, $rec_country, $rec_zipcode, $rec_city, $parcelLabelNumber,
$orderType) 
{
    $xml = '
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://dpd.com/common/service/types/Authentication/2.0" xmlns:ns1="http://dpd.com/common/service/types/ShipmentService/3.1"> 
    <soapenv:Header> 
        <ns:authentication> 
            <delisId>'.$delisId.'</delisId> 
            <authToken>'.$auth_token.'</authToken> 
            <messageLanguage>'.$messageLanguage.'</messageLanguage> 
        </ns:authentication> 
    </soapenv:Header> 
    <soapenv:Body> 
        <ns1:storeOrders> 
            <printOptions> 
                <printerLanguage>'.$printerLanguage.'</printerLanguage> 
                <paperFormat>'.$paperFormat.'</paperFormat> 
            </printOptions> 
            <order> 
                <generalShipmentData> 
                    <identificationNumber>'.$identificationNumber.'</identificationNumber> 
                    <sendingDepot>'.$sendingDepot.'</sendingDepot> 
                    <product>'.$product.'</product> 
                    <mpsCompleteDelivery>'.$mpsCompleteDelivery.'</mpsCompleteDelivery> 
                    <sender> 
                        <name1>'.$send_name.'</name1> 
                        <street>'.$send_street.'</street> 
                        <country>'.$send_country.'</country> 
                        <zipCode>'.$send_zipcode.'</zipCode> 
                        <city>'.$send_city.'</city> 
                        <customerNumber>'.$send_customerNumber.'</customerNumber> 
                    </sender> 
                    <recipient> 
                        <name1>'.$rec_name.'</name1> 
                        <street>'.$rec_street.'</street> 
                        <state>'.$rec_state.'</state> 
                        <country>'.$rec_country.'</country> 
                        <zipCode>'.$rec_zipcode.'</zipCode> 
                        <city>'.$rec_city.'</city> 
                    </recipient> 
                </generalShipmentData> 
                <parcels> 
                    <parcelLabelNumber>'.$parcelLabelNumber.'</parcelLabelNumber> 
                </parcels> 
                <productAndServiceData> 
                    <orderType>'.$orderType.'</orderType> 
                </productAndServiceData> 
            </order> 
        </ns1:storeOrders> 
    </soapenv:Body> 
</soapenv:Envelope>
    ';

    $headers = array(
        "POST  HTTP/1.1",
        "Content-type: application/soap xml; charset="utf-8"",
        "SOAPAction: "http://dpd.com/common/service/ShipmentService/3.1/storeOrders"",
        "Content-length: ".strlen($xml)
    );

    $cl = curl_init('https://public-ws-stage.dpd.com/services/ShipmentService/V3_1/');
    curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($cl, CURLOPT_POST, 1);
    curl_setopt($cl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($cl, CURLOPT_POSTFIELDS, "$xml");
    curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);

    $output_cl = json_decode(trim(json_encode(curl_exec($cl))), TRUE);

    return $output_cl;


    //return $output_cl;
}
 

И из этого кода я получаю ответ, я предполагаю, что это строка, но я не знаю наверняка:

 <soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:body>
        <ns2:storeordersresponse xmlns:ns2="http://dpd.com/common/service/types/ShipmentService/3.1">
            <orderresult>
                <parcellabelspdf>pdfkey</parcellabelspdf>
                <shipmentresponses>
                    <identificationnumber>identificationnumber</identificationnumber>
                    <mpsid>mpsid</mpsid>
                    <parcelinformation>
                        <parcellabelnumber>labelnr</parcellabelnumber>
                    </parcelinformation>
                </shipmentresponses>
            </orderresult>
        </ns2:storeordersresponse>
    </soap:body>
</soap:envelope>
 

Теперь моя функция вызывает функцию SoapClient:

 $label = storeOrderAndGetLabel($delisId, $auth_token, $messageLanguage, $printerLanguage, $paperFormat, $identificationNumber,
            $sedingDepot, $product, $mpsCompleteDelivery, $send_name, $send_street, $send_country, $send_zipcode, $send_city,
            $send_customerNumber, $rec_name, $rec_street, $rec_state, $rec_country, $rec_zipcode, $rec_city, $parcelLabelNumber,
            $orderType);
print_r($label);
 

теперь сам вызов soap:

 function storeOrderAndGetLabel($delisId, $auth_token, $messageLanguage, $printerLanguage, $paperFormat, $identificationNumber,
$sendingDepot, $product, $mpsCompleteDelivery, $send_name, $send_street, $send_country, $send_zipcode, $send_city,
$send_customerNumber, $rec_name, $rec_street, $rec_state, $rec_country, $rec_zipcode, $rec_city, $parcelLabelNumber,
$orderType)
{
    $client = new SoapClient('https://public-ws-stage.dpd.com/services/ShipmentService/V3_1?WSDL');


    $label = $client->storeOrders
    (array
        (
            "printOptions" => array
            (
                "printerLanguage" => "$printerLanguage",
                "paperFormat" => "$paperFormat"
            ),
            "order" => array
            (
                "generalShipmentData" => array
                (
                    "identificationNumber" => "$identificationNumber",
                    "sendingDepot" => "$sendingDepot",
                    "product" => "$product",
                    "mpsCompleteDelivery" => "$mpsCompleteDelivery",
                    "sender" => array
                    (
                        "name1" => "$send_name",
                        "street" => "$send_street",
                        "country" => "$send_country",
                        "zipCode" => "$send_zipcode",
                        "city" => "$send_city",
                        "customerNumber" => "$send_customerNumber"
                    ),
                    "recipient" => array
                    (
                        "name1" => "$rec_name",
                        "street" => "$rec_street",
                        "state" => "$rec_state",
                        "country" => "$rec_country",
                        "zipCode" => "$rec_zipcode",
                        "city" => "$rec_city"
                    )
                ),
                "parcels" => array
                (
                    "parcelLabelNumber" => "$parcelLabelNumber"
                ),
                "productAndServiceData" => array
                (
                    "orderType" => "$orderType"
                )
            )
        )
    );

    return $label;

}
 

Ошибка, которую я получаю от soapcall:

 Fatal error: Uncaught SoapFault exception: [soap:Server] Fault occurred while processing. in getLabel.php:107 Stack trace: #0 getLabel.php(107): SoapClient->__call('storeOrders', Array) #1 getLabel.php(107): SoapClient->storeOrders(Array) #2 getLabel.php(38): storeOrderAndGetLabel('username', 'password...', 'nl_NL', 'PDF', 'A4', '77777', '0163', 'CL', '0', 'uname', 'straat', 'NL', 'zipcode', 'City', '341546246451...', 'Test-Empfaenger', 'Test-Strasse', 'BY', 'DE', '123451', 'ahahaha', '16231545', 'consignment') #3 {main} thrown in getLabel.php on line 107
 

Я хотел бы извлечь ключ parcellabelspdf и mpsid из ответа. Было бы очень приятно, если бы кто-нибудь мог взглянуть на это.

Ответ №1:

Две возможные проблемы:

  1. Вам необходимо пройти аутентификацию при вызове DPD ShipmentService. Рабочий пример см. Ниже.
  2. Убедитесь, что параметр mpsCompleteDelivery передается как целое число (0), а не как строка «false». Рассмотрите возможность изменения этой строки:

    «mpsCompleteDelivery» => «$mpsCompleteDelivery»

Для:

 "mpsCompleteDelivery" => $mpsCompleteDelivery
 

Вот полный пример, включающий логин и вывод DPD-метки в формате PDF:

 // Let's log in first...

$c = new SoapClient('https://public-ws-stage.dpd.com/services/LoginService/V2_0?wsdl');

$res = $c->getAuth(array(
    'delisId'           => 'your-Id',
    'password'          => 'your-Password',
    'messageLanguage'   => 'de_DE'
));

// ...and remember the token.
$auth = $res->return;


// ...and then generate a label

$c = new SoapClient('https://public-ws-stage.dpd.com/services/ShipmentService/V3_1?wsdl');

$token = array(
    'delisId'           => $auth->delisId,
    'authToken'         => $auth->authToken,
    'messageLanguage'   => 'de_DE'
);

// Set the header with the authentication token
$header = new SOAPHeader('http://dpd.com/common/service/types/Authentication/2.0', 'authentication', $token);
$c->__setSoapHeaders($header);

try {
    $res = $c->storeOrders( array
        (
            "printOptions" => array(
                "paperFormat" => "A4",
                "printerLanguage" => "PDF"
            ),
            "order" => array(
                "generalShipmentData" => array(
                    "sendingDepot" => $auth->depot,
                    "product" => "CL",
                    "mpsCompleteDelivery" => false,
                    "sender" => array(
                        "name1" => "Sender Name",
                        "street" => "Sender Street 2",
                        "country" => "DE",
                        "zipCode" => "65189",
                        "city" => "Wiesbaden",
                        "customerNumber" => "123456789"
                    ),
                    "recipient" => array(
                        "name1" => "John Malone",
                        "street" => "Johns Street 34",
                        "country" => "DE",
                        "zipCode" => "65201",
                        "city" => "Wiesbaden"
                    )
                ),
                "parcels" => array(
                    "parcelLabelNumber" => "09123829120"
                ),
                "productAndServiceData" => array(
                    "orderType" => "consignment"
                )
            )
        )
    );
} catch (SoapFault $exception) {
    echo $exception->getMessage();
    die();
}

// Et voilà!

header('Content-type: application/pdf');
echo $res->orderResult->parcellabelsPDF;
 

Проверьте здесь для получения дополнительной информации:

http://labor.99grad.de/2014/10/05/deutscher-paket-dienst-dpd-soap-schnittstelle-mit-php-nutzen-um-versandetikett-als-pdf-zu-generieren/