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

Что я делаю не так?
  • Вопрос задан
  • 2004 просмотра
Пригласить эксперта
Ответы на вопрос 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
Может смогу вам сэкономить время этой библиотекой
Там уже реализовано все что нужно
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы