【问题标题】:I call a function with cURL and get a response but when i call the exact same function with soapclient i get a fault我用 cURL 调用一个函数并得到一个响应,但是当我用 soapclient 调用完全相同的函数时,我得到了一个错误
【发布时间】:2014-06-23 08:56:03
【问题描述】:

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

我想达到什么目的: 我正在尝试从 WSDL 调用函数,并从操作中获得响应。

我的经验是什么: 我可以使用 cURL 语句调用操作 storeOrders succesfull,我也得到了响应。 但是对于给定的响应,我猜是一个字符串。我无法从中提取数据。 所以我尝试从服务器请求相同的操作,然后使用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。如果有人能看一下就太好了。

【问题讨论】:

    标签: php arrays curl soap wsdl


    【解决方案1】:

    两个可能的问题:

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

      "mpsCompleteDelivery" => "$mpsCompleteDelivery"

    到:

    "mpsCompleteDelivery" => $mpsCompleteDelivery
    

    这是一个完整的示例,包括登录和输出为 PDF 的 DPD 标签:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多