Почему не работает SOAP запрос?

VaneS

Добрый день, сделать SOAP запрос,
Вот адрес сервиса
В документации говорится следующее:
1.2 Синхронный сервис сообщений
Синхронный сервис сообщений предоставляет 1 метод:
1. GetMessage — метод получения сообщения
1.2.1 Метод получения сообщения (GetMessage)
Метод получения сообщения предназначен для синхронной отправки и получения XML-сообщения в соответствии с определенной для конкретного сервиса схемой.
Сигнатура метода выглядит следующим образом:
GetMessageResponse GetMessage(GetMessageRequest request), где
GetMessageRequest – запрос, содержащий единственный элемент Message – сообщение, позволяющее содержать любой xml с обязательным указанием схемы. Например,

Код (Text):
  1. <tns:AuthRequest xmlns:tns=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0″>
  2.   <tns:AuthAppInfo>
  3.     <tns:MasterToken>MASTER_TOKEN_ISSUED_BY_FNS</tns:MasterToken>
  4.   </tns:AuthAppInfo>
  5. </tns:AuthRequest>

GetMessageResponse – ответ, содержащий единственный элемент Message – сообщение, позволяющее содержать любой xml с обязательным указанием схемы. Например,

Код (Text):
  1. <tns:AuthResponse xmlns:tns=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0″ >
  2.   <tns:Result>
  3.     <tns:Token>TEMPORARY_TOKEN_ISSUED_BY_FNS</tns:Token>
  4.     <tns:ExpireTime>2001-12-17T09:30:47Z</tns:ExpireTime>
  5.   </tns:Result>
  6. </tns:AuthResponse>

Я написал простой код запроса на PHP:

PHP:
  1. try{
  2.         $options = array(
  3.         ‘soap_version’ => SOAP_1_1,
  4.         ‘compression’ => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
  5.         ‘encoding’ => ‘UTF-8’,
  6.         ‘trace’ => 1,
  7.         ‘exceptions’ => true,
  8.         ‘cache_wsdl’ => WSDL_CACHE_NONE,
  9.         ‘features’ => SOAP_SINGLE_ELEMENT_ARRAYS
  10.     );
  11.         $service_Url = ‘https://openapi.nalog.ru:8090/open-api/AuthService/0.1?wsdl’;
  12.         $SoapClient = new SoapClient($service_Url, $options);
  13.  
  14.         $daraArray = array(‘Message’ =>
  15.  
  16.            <AuthRequest xmlns=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0″ xsi:schemaLocation=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0 schema.xsd» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»>
  17.                <AuthAppInfo>
  18.                    <MasterToken>’.$modx->getOption(‘MASTER_TOKEN_ISSUED_BY_FNS’).‘</MasterToken>
  19.                </AuthAppInfo>
  20.            </AuthRequest>
  21.        ‘);
  22.        
  23.         $result = $SoapClient->GetMessage($daraArray);
  24.     }catch(Exception $e){
  25.         echo($e);
  26.     }

В результате получаю ответ:

Код (Text):
  1. SoapFault exception: [soap:Client] Unmarshalling Error: cvc-complex-type.2.4.b: The content of element ‘ns1:Message’ is not complete. One of ‘{WC[##other:»urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0″]}’ is expected.  in

Что я делаю не так?

 

Taktreba

недавно столкнулсяс SOAP
мне помогло анализ
__getLastRequest()
__getLastResponse()
методов. Смотри что ты отправляешь и что получаешь в ответ

 

VaneS

Действительно полезные функции, вот какой XML у меня генерируется:

Код (Text):
  1. <?xml version=»1.0″ encoding=»UTF-8″?>
  2. <SOAP-ENV:Envelope xmlns:SOAP-ENV=»http://schemas.xmlsoap.org/soap/envelope/» xmlns:ns1=»urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0″>
  3.     <SOAP-ENV:Body>
  4.         <ns1:GetMessageRequest>
  5.             <ns1:Message/>
  6.         </ns1:GetMessageRequest>
  7.     </SOAP-ENV:Body>
  8. </SOAP-ENV:Envelope>

Тег Message почему то не заполняется, хотя я его заполняю вот так:

PHP:
  1. $daraArray = array(‘Message’ =>
  2.           <AuthRequest xmlns=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0″ xsi:schemaLocation=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0 schema.xsd» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»>
  3.               <AuthAppInfo>
  4.                   <MasterToken>’.$modx->getOption(‘MASTER_TOKEN_ISSUED_BY_FNS’).‘</MasterToken>
  5.               </AuthAppInfo>
  6.           </AuthRequest>
  7.       ‘);
 

Taktreba

Сделаю Акцент на том что я джун и мои советы и попытки обяснить могут быть не верными

На сколько я понимаю <AuthRequest xmlns=»urn: и все что находится внутри, это wsdl. Wsdl должен формироваться в методе который принимает параметры. В твоем случае GetMessage($daraArray) должен принять параметры (многомерный массив со строками и числами) и там где то на другом языке перемолоть то что ты ему скормил, построить WSDL, и обработать его и вернуть тебе то, что ты ожидаешь. А ты передаешь ему массив в который впихнул wsdl еще и переменные в него запихнул phpшные. ТАм куда улетают эти параметры, там даже не рнр, он не знает что делать с $

ВОЗМОЖНО (но это не точно), нуэно сделать так

PHP:
  1. $array = [
  2.     ‘Message’ => $modx->getOption(‘MASTER_TOKEN_ISSUED_BY_FNS’)
  3. ];
  4.    
  5. $result = $SoapClient->GetMessage($array);
 

VaneS

Не, так точно работать не будет!
— Добавлено —
В общем взял пример тут:
https://gist.github.com/reinhurd/bf16877c49140c913b1fae1095f8ca16
Теперь у меня пишет:

Код (Text):
  1. <soap:Envelope xmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/»>
  2.     <soap:Body>
  3.         <GetMessageResponse xmlns=»urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0″>
  4.             <Message>
  5.                 <tns:AuthResponse xmlns:soapenv=»http://schemas.xmlsoap.org/soap/envelope/» xmlns:ns=»urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiAsyncMessageProviderService/types/1.0″ xmlns:tns=»urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0″>
  6.                     <tns:Fault>
  7.                         <tns:Message>Мастер токен не найден.</tns:Message>
  8.                     </tns:Fault>
  9.                 </tns:AuthResponse>
  10.             </Message>
  11.         </GetMessageResponse>
  12.     </soap:Body>
  13. </soap:Envelope>

Я уже голову сломал с этим

 

Taktreba

ну так там другой способ работы soap запросов, через curl. Там wsdl передается через curl параметр CURLOPT_POSTFIELDS.
а ты в первом примере через инстанс обьекта soap пытался, так вот туда нужно передавать не wsdl а массив, который потом уже превратится в wsdl.
так или иначе, у тебя похоже на валдный ответ без ошибок, просто не те параметры ты передаешь наверное.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *