Добрый день уважаемые. Возник некий трабл. Есть SOAP : Код (Text): <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://kitsoft.kiev.ua/mtsbu/2017/08/22" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <soapenv:Header> <o:Security soapenv:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <o:UsernameToken> <o:Username>'.Epolis::TOKEN_KEY.'</o:Username> </o:UsernameToken> </o:Security> </soapenv:Header> <soapenv:Body> <ns:GetSignFromRequest> <ns:digSignRequest> <ns:Contract> <ns:Address>'.$ar['adress'].'</ns:Address> <ns:AutoDescr>'.$ar['marka_name'].' '.$ar['model_name'].'</ns:AutoDescr> <ns:BirthDate>'.$ar['birthday'].'</ns:BirthDate> <ns:DBonusMalusID>'.$ar['bonusMalus'].'</ns:DBonusMalusID> <ns:DCitizenStatusID>'.$ar['rezident'].'</ns:DCitizenStatusID> <ns:DCityID>'.$ar['city'].'</ns:DCityID> <ns:DDiscountID>'.$ar['discount'].'</ns:DDiscountID> <ns:DExpLimitID>'.$ar['stag'].'</ns:DExpLimitID> <ns:DMarkID>'.$ar['marka'].'</ns:DMarkID> <ns:DModelID>'.$ar['model'].'</ns:DModelID> <ns:DPeriodID>'.$ar['strok'].'</ns:DPeriodID> <ns:DPersonStatusID>'.$ar['person'].'</ns:DPersonStatusID> <ns:DPrivelegeID>'.$ar['pilgy'].'</ns:DPrivelegeID> <ns:DSphereUseID>'.$ar['taksi'].'</ns:DSphereUseID> <ns:DVehicleTypeID>'.$ar['type_tz'].'</ns:DVehicleTypeID> <ns:Franchise>'.$ar['franshyza'].'</ns:Franchise> <ns:IdentCode>'.$ar['ipn'].'</ns:IdentCode> <ns:InsPremium>'.$ar['price'].'</ns:InsPremium> <ns:Name>'.$ar['name'].'</ns:Name> <ns:PName>'.$ar['pobatkovi'].'</ns:PName> <ns:ProdYear>'.$ar['year_tz'].'</ns:ProdYear> <ns:RegNo>'.$ar['nomer_tz'].'</ns:RegNo> <ns:StartDate>'.$ar['date_start'].'</ns:StartDate> <ns:Surname>'.$ar['prizv'].'</ns:Surname> <ns:VIN>'.$ar['vin'].'</ns:VIN> <ns:VehicleUsage>111111111111</ns:VehicleUsage> <ns:k1>'.$ar['k1'].'</ns:k1> <ns:k2>'.$ar['k2'].'</ns:k2> <ns:k3>'.$ar['k3'].'</ns:k3> <ns:k4>'.$ar['k4'].'</ns:k4> <ns:k5>'.$ar['k5'].'</ns:k5> <ns:k6>'.$ar['k6'].'</ns:k6> <ns:k7>'.$ar['bonus_c'].'</ns:k7> </ns:Contract> <ns:InputMessageID>testRequest</ns:InputMessageID> </ns:digSignRequest> </ns:GetSignFromRequest> </soapenv:Body> </soapenv:Envelope> Который я отправляю с помощью: PHP: public static function doRequest($xml,$req){ $params = array ('encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_2, 'trace' => 1, 'exceptions' => 1, "connection_timeout" => 180 ); $client = new SoapClient("https://policyrw.mtsbu.ua/v3/ChangeContracts.svc?wsdl",$params); $ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; $headerbody = array('Security'=>array('UsernameToken' => array('Username'=>'TOKEN'))); $header = new SOAPHeader($ns, 'Security', $headerbody); $client->__setSoapHeaders($header); $res = $client->__doRequest($xml, 'https://policyrw.mtsbu.ua/v3/ChangeContracts.svc', 'http://kitsoft.kiev.ua/mtsbu/2017/08/22/IDigitalPolicy/GetSignFromRequest', SOAP_1_1); return $res; } В ответ получаю строку вместо xml или еще чего нибудь. Кто подскажет где я лоханулся. Спасибо
Сам задал - сам отвечу). Проблема была в неправильном парсинге данных после получения ответа. Все теги они есть в ответе. Сначала через file_put_contents вытянул ответ. Увидел что все четко пришло. Потом через: PHP: $doc = new DOMDocument(); $doc->loadXML($row); echo $doc->getElementsByTagName('Success')->item(0)->nodeValue; Вытянул конкретную часть ответа. По аналогии можно распарсить весь ответ.Всем спасибо
@Intrerio, раз уж есть wsdl, используйте SoapClient::__soapCall для обращения к методам. И ничего парсить не придется.
Чесно говоря вариант с парсингом мне вышел проще. Весь код упаковался в 6 строк. Спасибо за ответ --- Добавлено --- Тяжело сказать так как с js работаю только на уровне "легкой визуализации".
Ну это знаете как все используют гугл а я яху ajax наверное актуальнее чем soap. getElementsByTagName - явная копирка с js, в php обычно названия через андерскоры: is_int
У меня появилась сейчас более смешная но в то же время загадочная проблема. Получая ответ от сервиса, он почему то в кодировке ASCII хотя разработчики сервиса уверяют что они отдают его в utf-8. Из-за этого у меня куча траблов по поводу проверки данных. СИжу вот думаю как преобразовать данные в utf-8 потому что стандартные ф-ции PHP не конвертируют данные почему то из ASCII в utf-8
Отследил кое что глобальней. Это не сервис отдает в ASCII. Почему то массив $_POST с данными из формы на страничке передаеться в обработчик в ASCII формате.А вот сервис реально отдает данные в UTF-8.Ничего не пойму почему этот массив в другой кодировке
А декод как сделать этих данных? --- Добавлено --- Только что создал переменную (для теста) $test = "test"; так mb_detect_encoding мне тоже показало ASCII
Вы разберитесь сначала в разнице языковой кодировки и кодировки передачи данных и потом решайте где проблема.
Уже сутки мучаюсь в поисках зерна рациональности. Страница с формой в кодировке UTF-8, обработчик тоже.Откуда взялось ASCII не понимаю.
PHP: <?php $xml = "test"; echo mb_detect_encoding($xml); Выдает ASCII. Это чистая страница в корне системы. Кто подскажет куда копать? --- Добавлено --- А вот если заменить test на тест то все ок - UTF-8
@Intrerio, не удивительно. Ведь ASCII, фактически - подмножество UTF-8. Вот автоопределение и дает на тексте 'test' минимальный подходящий вариант. --- Добавлено --- Хоть пример приведите искаженных полученных данных...
Все решилось. Как оказалось сами разработчики не знали о том что у них микросервис по ЭЦП работает в UTF-16LE .Перекодировал строку и все работает как часики
Хотел спросить, как в итоге взаимодействуете? А то отправлять в одной кодировке получать в другой затем перекодировать, наверное не лучший вариант.
В моем случае указал на данную проблему разработчикам сервиса к которому посылаю запросы и они изменили кодировку на UTF-8. Но пока этого не было то перекодировал строку через iconv и таким образом выходил из положения.