Добрый день, сделать SOAP запрос, Вот адрес сервиса В документации говорится следующее: 1.2 Синхронный сервис сообщений Синхронный сервис сообщений предоставляет 1 метод: 1. GetMessage - метод получения сообщения 1.2.1 Метод получения сообщения (GetMessage) Метод получения сообщения предназначен для синхронной отправки и получения XML-сообщения в соответствии с определенной для конкретного сервиса схемой. Сигнатура метода выглядит следующим образом: GetMessageResponse GetMessage(GetMessageRequest request), где GetMessageRequest – запрос, содержащий единственный элемент Message – сообщение, позволяющее содержать любой xml с обязательным указанием схемы. Например, Код (Text): <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 с обязательным указанием схемы. Например, Код (Text): <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: 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); } В результате получаю ответ: Код (Text): 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 Что я делаю не так?
недавно столкнулсяс SOAP мне помогло анализ __getLastRequest() __getLastResponse() методов. Смотри что ты отправляешь и что получаешь в ответ
Действительно полезные функции, вот какой XML у меня генерируется: Код (Text): <?xml version="1.0" encoding="UTF-8"?> <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"> <SOAP-ENV:Body> <ns1:GetMessageRequest> <ns1:Message/> </ns1:GetMessageRequest> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Тег Message почему то не заполняется, хотя я его заполняю вот так: PHP: $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> ');
Сделаю Акцент на том что я джун и мои советы и попытки обяснить могут быть не верными На сколько я понимаю <AuthRequest xmlns="urn: и все что находится внутри, это wsdl. Wsdl должен формироваться в методе который принимает параметры. В твоем случае GetMessage($daraArray) должен принять параметры (многомерный массив со строками и числами) и там где то на другом языке перемолоть то что ты ему скормил, построить WSDL, и обработать его и вернуть тебе то, что ты ожидаешь. А ты передаешь ему массив в который впихнул wsdl еще и переменные в него запихнул phpшные. ТАм куда улетают эти параметры, там даже не рнр, он не знает что делать с $ ВОЗМОЖНО (но это не точно), нуэно сделать так PHP: $array = [ 'Message' => $modx->getOption('MASTER_TOKEN_ISSUED_BY_FNS') ]; $result = $SoapClient->GetMessage($array);
Не, так точно работать не будет! --- Добавлено --- В общем взял пример тут: https://gist.github.com/reinhurd/bf16877c49140c913b1fae1095f8ca16 Теперь у меня пишет: Код (Text): <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetMessageResponse xmlns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0"> <Message> <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"> <tns:Fault> <tns:Message>Мастер токен не найден.</tns:Message> </tns:Fault> </tns:AuthResponse> </Message> </GetMessageResponse> </soap:Body> </soap:Envelope> Я уже голову сломал с этим
ну так там другой способ работы soap запросов, через curl. Там wsdl передается через curl параметр CURLOPT_POSTFIELDS. а ты в первом примере через инстанс обьекта soap пытался, так вот туда нужно передавать не wsdl а массив, который потом уже превратится в wsdl. так или иначе, у тебя похоже на валдный ответ без ошибок, просто не те параметры ты передаешь наверное.