我用cURL调用一个函数并得到一个响应但是当我用soapclient调用完全相同的函数时我得到了一个错误

时间:2014-06-23 08:56:03

标签: php arrays curl soap wsdl

我需要什么: 我需要一些帮助来计算从使用soapclient调用WSDL文件中的函数时收到的错误。或者我想帮助从cURL响应中提取数据。

我想要达到的目的是什么: 我试图通过WSDL调用函数,并从操作中获得响应。

我的经历是什么: 我可以使用cURL语句调用storeOrders成功的动作,我也会得到响应。 但是对于给定的响应,我猜一个字符串。我无法从中提取数据。 所以我尝试从服务器请求相同的操作,然后使用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);

现在肥皂自称:

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 个答案:

答案 0 :(得分:0)

两个可能的问题:

  1. 您需要在调用DPD ShipmentService时进行身份验证。请参阅下面的工作示例。
  2. 确保参数mpsCompleteDelivery以整数(0)传递,而不是字符串“false”。考虑更改此行:

    “mpsCompleteDelivery”=&gt; “$ mpsCompleteDelivery”

  3. 为:

    "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/