2016-09-28 1 views
1

Я пытаюсь сделать SoapHeader с вложенными параметров, как это показано в примере с портала разработчиков DHL:Создание SoapHeader для DHL

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:cis="http://dhl.de/webservice/cisbase" 
      xmlns:bcs="http://dhl.de/webservices/businesscustomershipping" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soap:Header> 
    <cis:Authentification> 
     <cis:user>2222222222_01</cis:user> 
     <cis:signature>pass</cis:signature> 
    </cis:Authentification> 
</soap:Header> 

так, как я заголовок:

class DhlSoapClient { 
public $apiUrl = 'https://cig.dhl.de/cig-wsdls/com/dpdhl/wsdl/geschaeftskundenversand-api/1.0/geschaeftskundenversand-api-1.0.wsdl'; 
public $dhlSandboxUrl = 'https://cig.dhl.de/services/sandbox/soap'; 
public $soapClient; 
public $credentials; 

public function buildClient($credentials, $sandbox = false) 
{ 
    $this->soapClient = new \SoapClient($this->apiUrl, ['trace' => 1]); 
    $this->credentials = $credentials; 
    $this->buildAuthHeader(); 
    return $this->soapClient; 
} 

public function buildAuthHeader() 
{ 
    $authParams = [ 
     'user' => $this->credentials['user'], 
     'signature' => $this->credentials['signature'], 
     'type' => 0 
    ]; 
    $authvalues = new \SoapVar(new \SoapVar($authParams, SOAP_ENC_OBJECT), SOAP_ENC_OBJECT); 
    $soapHeader = new \SoapHeader($this->dhlSandboxUrl, 'Authentification', $authvalues); 
    $this->soapClient->__setSoapHeaders($soapHeader); 
}} 

Так я получаю этот клиент:

object(SoapClient) { 
trace => (int) 1 
_soap_version => (int) 1 
sdl => resource 
__default_headers => [ 
    (int) 0 => object(SoapHeader) { 
     namespace => 'https://cig.dhl.de/services/sandbox/soap' 
     name => 'Authentification' 
     data => object(SoapVar) { 
      enc_type => (int) 301 
      enc_value => object(SoapVar) { 
       enc_type => (int) 301 
       enc_value => [ 
        'user' => '2222222222_01', 
        'signature' => 'pass' 
       ]}}mustUnderstand => false}]} 

И в результате я получаю этот заголовок:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:ns1="http://dhl.de/webservice/cisbase" 
       xmlns:ns2="http://de.ws.intraship" 
       xmlns:ns3="https://cig.dhl.de/services/sandbox/soap"> 
<SOAP-ENV:Header> 
    <ns3:Authentification> 
     <user>2222222222_01</user> 
     <signature>pass</signature> 
    </ns3:Authentification> 
</SOAP-ENV:Header> 

Как я пытаюсь получить $response = $this->client->CreateShipmentDD($shipmentInfo); я получаю это:

object(SoapFault) { 
faultstring => 'Authorization Required' 
faultcode => 'HTTP' 
[protected] message => 'Authorization Required' 

Может быть, проблема в том, что параметры пользователя и подпись внутри Аутентификация не имеет префикса, как это должно быть, и это вызывает Исключение SoapFault, но они добавляют aut omatically, поэтому я должен сделать вид вложенныеSoapHeader.

ответ

0

У меня была та же проблема. Authorization Required предназначен для HTTP Auth. Вам нужно добавить значения авторизации в массив $options в SoapClient::__construct($wsdlUri, $options).

$this->soapClient = new \SoapClient($this->apiUrl, 
    ['trace' => 1, 
    'login' => <DHL_DEVELOPER_ID>, 
    'password' => <DHL_DEVELOPER_PASSWD>, 
    ] 
); 

Вы можете добавить местоположение, чтобы выбрать песочницу:

$this->soapClient = new \SoapClient($this->apiUrl, 
    ['trace' => 1, 
    'login' => <DHL_DEVELOPER_ID>, 
    'password' => <DHL_DEVELOPER_PASSWD>, 
    'location' => <DHL_SANDBOX_URL>|<DHL_PRODUCTION_URL>, 
    'soap_version' => SOAP_1_1, 
    'encoding' => 'utf-8', 
    ] 
); 

DHL_DEVELOPER_ID не почтовый адрес. Вы найдете его в «Mein Konto» («Моя учетная запись»).

 Смежные вопросы

  • Нет связанных вопросов^_^