За последние 24 часа нас посетили 22760 программистов и 1269 роботов. Сейчас ищут 798 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем VaneS, 29 дек 2020.

Метки:
  1. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Добрый день, сделать 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
    Что я делаю не так?
     
  2. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    недавно столкнулсяс SOAP
    мне помогло анализ
    __getLastRequest()
    __getLastResponse()
    методов. Смотри что ты отправляешь и что получаешь в ответ
     
  3. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Действительно полезные функции, вот какой 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.       ');
     
  4. Taktreba

    Taktreba Активный пользователь

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

    На сколько я понимаю <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);
     
  5. VaneS

    VaneS Активный пользователь

    С нами с:
    16 ноя 2011
    Сообщения:
    636
    Симпатии:
    4
    Адрес:
    Россия
    Не, так точно работать не будет!
    --- Добавлено ---
    В общем взял пример тут:
    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>
    Я уже голову сломал с этим
     
  6. Taktreba

    Taktreba Активный пользователь

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