Создание 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'

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

0

Решение

У меня такая же проблема. Authorization Required для проверки подлинности HTTP. Вам необходимо добавить значения авторизации в $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» (Моя учетная запись).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]