Задать вопрос
vanesxl
@vanesxl

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

Добрый день, сделать SOAP запрос,
Вот адрес сервиса
В документации говорится следующее:
1.2 Синхронный сервис сообщений
Синхронный сервис сообщений предоставляет 1 метод:
1. GetMessage - метод получения сообщения
1.2.1 Метод получения сообщения (GetMessage)
Метод получения сообщения предназначен для синхронной отправки и получения XML-сообщения в соответствии с определенной для конкретного сервиса схемой.
Сигнатура метода выглядит следующим образом:
GetMessageResponse GetMessage(GetMessageRequest request), где
GetMessageRequest – запрос, содержащий единственный элемент Message – сообщение, позволяющее содержать любой xml с обязательным указанием схемы. Например,
<tns:AuthRequest xmlns:tns="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0">
	<tns:AuthAppInfo>
		<tns:MasterToken>MASTER_TOKEN_ISSUED_BY_FNS</tns:MasterToken>
	</tns:AuthAppInfo>
</tns:AuthRequest>

GetMessageResponse – ответ, содержащий единственный элемент Message – сообщение, позволяющее содержать любой xml с обязательным указанием схемы. Например,
<tns:AuthResponse xmlns:tns="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0" >
	<tns:Result>
		<tns:Token>TEMPORARY_TOKEN_ISSUED_BY_FNS</tns:Token>
		<tns:ExpireTime>2001-12-17T09:30:47Z</tns:ExpireTime>
	</tns:Result>
</tns:AuthResponse>

Я написал простой код запроса на PHP:
try{
        $options = array(
        'soap_version' => SOAP_1_1,
        'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
        'encoding' => 'UTF-8',
        'trace' => 1,
        'exceptions' => true,
        'cache_wsdl' => WSDL_CACHE_NONE,
        'features' => SOAP_SINGLE_ELEMENT_ARRAYS
    );
        $service_Url = 'https://openapi.nalog.ru:8090/open-api/AuthService/0.1?wsdl';
        $SoapClient = new SoapClient($service_Url, $options);

        $daraArray = array('Message' => '

            <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">
                <AuthAppInfo>
                    <MasterToken>'.$modx->getOption('MASTER_TOKEN_ISSUED_BY_FNS').'</MasterToken>
                </AuthAppInfo>
            </AuthRequest>
        ');
        
        $result = $SoapClient->GetMessage($daraArray);
    }catch(Exception $e){
        echo($e);
    }

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

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

Что я делаю не так?
  • Вопрос задан
  • 2338 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Hanneman
Ну, факт, что у вас с namespace где-то намудрено или отсутствует составная часть тела запроса:
Постарайтесь сделать так: либо распечатайте весь текст SOAP-запроса, либо перехватите пакеты с помощью, к примеру, Wireshark или smsniff. Рабочий запрос должен выглядеть как-то так:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0">
   <soapenv:Header/>
   <soapenv:Body>
      <ns:GetMessageRequest>
         <ns:Message>
            <AuthRequest xsi:schemaLocation="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0 schema.xsd" xmlns="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
               <AuthAppInfo>
                  <MasterToken>eyJhbGciOiJIUzI1NiIsInR5cCI6...</MasterToken>
               </AuthAppInfo>
            </AuthRequest>
         </ns:Message>
      </ns:GetMessageRequest>
   </soapenv:Body>
</soapenv:Envelope>

Ответ (потому что не из РФ):
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Доступ к сервису для переданного IP, запрещён</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>


Я вот к чему: если у вас пусто, как в примере (или namespace чего-то там не того), то при запросе вида
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0">
   <soapenv:Header/>
   <soapenv:Body>
      <ns:GetMessageRequest>
         <ns:Message>
            <!--You may enter ANY elements at this point-->
         </ns:Message>
      </ns:GetMessageRequest>
   </soapenv:Body>
</soapenv:Envelope>

То получите и ответ, как в вашем примере:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unmarshalling Error: cvc-complex-type.2.4.b: The content of element 'ns:Message' is not complete. One of '{WC[##other:"urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0"]}' is expected.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>
Ответ написан
agoalofalife
@agoalofalife
Team Lead
Может смогу вам сэкономить время этой библиотекой
Там уже реализовано все что нужно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы