VaneS
Добрый день, сделать 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{ ‘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); <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Что я делаю не так?
Taktreba
недавно столкнулсяс SOAP
мне помогло анализ
__getLastRequest()
__getLastResponse()
методов. Смотри что ты отправляешь и что получаешь в ответ
VaneS
Действительно полезные функции, вот какой 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:
<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> ‘);
Taktreba
Сделаю Акцент на том что я джун и мои советы и попытки обяснить могут быть не верными
На сколько я понимаю <AuthRequest xmlns=»urn: и все что находится внутри, это wsdl. Wsdl должен формироваться в методе который принимает параметры. В твоем случае GetMessage($daraArray) должен принять параметры (многомерный массив со строками и числами) и там где то на другом языке перемолоть то что ты ему скормил, построить WSDL, и обработать его и вернуть тебе то, что ты ожидаешь. А ты передаешь ему массив в который впихнул wsdl еще и переменные в него запихнул phpшные. ТАм куда улетают эти параметры, там даже не рнр, он не знает что делать с $ВОЗМОЖНО (но это не точно), нуэно сделать так
PHP:
$array = [ ‘Message’ => $modx->getOption(‘MASTER_TOKEN_ISSUED_BY_FNS’) ]; $result = $SoapClient->GetMessage($array);
VaneS
Не, так точно работать не будет!
— Добавлено —
В общем взял пример тут:
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>Я уже голову сломал с этим
Taktreba
ну так там другой способ работы soap запросов, через curl. Там wsdl передается через curl параметр CURLOPT_POSTFIELDS.
а ты в первом примере через инстанс обьекта soap пытался, так вот туда нужно передавать не wsdl а массив, который потом уже превратится в wsdl.
так или иначе, у тебя похоже на валдный ответ без ошибок, просто не те параметры ты передаешь наверное.
Похожие записи:
- Функции, которые находят токены, заменяют токены и извлекают значения свойств из словарей
- Гиперссылка не работает в HTML-коде, связанном с JS-кодом [closed]
- Java — строка общего назначения для парсера LocalDateTime
- Многопоточный обратный вызов C ++, может отменить регистрацию
- Параметры командной строки