Ниже представлен XML-запрос.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://schemas.navitaire.com/WebServices/ISessionManager/Logon</Action> <h:ContractVersion xmlns:h="http://schemas.navitaire.com/WebServices">330</h:ContractVersion> </s:Header> <s:Body> <LogonRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/SessionService"> <logonRequestData xmlns:d4p1="http://schemas.navitaire.com/WebServices/DataContracts/Session" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <d4p1:DomainCode>WWW</d4p1:DomainCode> <d4p1:AgentName>API****</d4p1:AgentName> <d4p1:Password>********</d4p1:Password> <d4p1:LocationCode i:nil="true" /> <d4p1:RoleCode>APIB</d4p1:RoleCode> <d4p1:TerminalInfo i:nil="true" /> </logonRequestData> </LogonRequest> </s:Body> </s:Envelope>
И вот мой PHP-код.
$test->DomainCode = 'WWW'; $test->AgentName = 'AGENT'; $test->Password = 'PASS'; $test->RoleCode = 'ROLE'; $wsdl = "https://trtestr3xapi.navitaire.com/sessionmanager.svc?wsdl"; $client = new SoapClient($wsdl, array('trace' => 1)); $header = new SoapHeader('h','ContractVersion','330', '1'); $client->__setSoapHeaders($header);
…
Для приведенного выше кода я получаю следующую ошибку.
SoapFault exception: [s:MustUnderstand] The header 'ContractVersion' from the namespace 'h' was not understood by the recipient of this message, causing the message to not be processed. This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process. Please ensure that the configuration of the client's binding is consistent with the service's binding.
Как исправить эту проблему? Поскольку WSDL можно получить только из определенного IP, я дал ссылку ниже
WSDL: http://pastie.org/9263788
Синтаксис, согласно документации SOAPHeader , должен быть:
SoapHeader ( string $namespace , string $name , mixed $data , bool $mustunderstand )
В вашем коде вы разместили префикс пространства имен, в котором должно быть пространство имен:
$header = new SoapHeader('h','ContractVersion','330', '1');
Измените эту строку на:
$header = new SoapHeader('http://schemas.navitaire.com/WebServices','ContractVersion','330', 'true');