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


I call a function with cURL and get a response but when i call the exact same function with soapclient i get a fault

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

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

我的经历是什么?我可以用cURL语句成功地调用操作storeOrders,我也会得到一个响应。但与给定的响应,我猜一个字符串。我无法从中提取数据。因此,我试图从服务器请求相同的操作,但随后使用soapclient,但我一直得到一个错误。

我已经试过了:我试图使cURL响应成为一个新的SimpleXMLElement,但它总是返回一个空对象。当我试图联系其中一个孩子的时候。我试图使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. 您需要在调用DPD ShipmentService时进行身份验证。下面是一个工作示例:
  2. 确保参数mpsCompleteDelivery作为整数(0)传递,而不是字符串"false"。考虑修改这一行:

    "mpsCompleteDelivery" => "$mpsCompleteDelivery"

:

"mpsCompleteDelivery" => $mpsCompleteDelivery

下面是一个完整的示例,包括登录和输出PDF格式的DPD-label:

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