За последние 24 часа нас посетили 17879 программистов и 1638 роботов. Сейчас ищут 2110 программистов ...

SOAP ответ в виде строки

Тема в разделе "PHP для профи", создана пользователем Intrerio, 7 янв 2018.

  1. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Добрый день уважаемые. Возник некий трабл. Есть SOAP :
    Код (Text):
    1. <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">
    2.                 <soapenv:Header>
    3.                              <o:Security soapenv:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    4.                                      <o:UsernameToken>
    5.                                              <o:Username>'.Epolis::TOKEN_KEY.'</o:Username>
    6.                                      </o:UsernameToken>
    7.                              </o:Security>
    8.                 </soapenv:Header>
    9.                 <soapenv:Body>
    10.                    <ns:GetSignFromRequest>
    11.                       <ns:digSignRequest>
    12.                          <ns:Contract>
    13.                             <ns:Address>'.$ar['adress'].'</ns:Address>
    14.                             <ns:AutoDescr>'.$ar['marka_name'].' '.$ar['model_name'].'</ns:AutoDescr>
    15.                             <ns:BirthDate>'.$ar['birthday'].'</ns:BirthDate>
    16.                             <ns:DBonusMalusID>'.$ar['bonusMalus'].'</ns:DBonusMalusID>
    17.                             <ns:DCitizenStatusID>'.$ar['rezident'].'</ns:DCitizenStatusID>
    18.                             <ns:DCityID>'.$ar['city'].'</ns:DCityID>
    19.                             <ns:DDiscountID>'.$ar['discount'].'</ns:DDiscountID>
    20.                             <ns:DExpLimitID>'.$ar['stag'].'</ns:DExpLimitID>
    21.                             <ns:DMarkID>'.$ar['marka'].'</ns:DMarkID>
    22.                             <ns:DModelID>'.$ar['model'].'</ns:DModelID>
    23.                             <ns:DPeriodID>'.$ar['strok'].'</ns:DPeriodID>
    24.                             <ns:DPersonStatusID>'.$ar['person'].'</ns:DPersonStatusID>
    25.                             <ns:DPrivelegeID>'.$ar['pilgy'].'</ns:DPrivelegeID>
    26.                             <ns:DSphereUseID>'.$ar['taksi'].'</ns:DSphereUseID>
    27.                             <ns:DVehicleTypeID>'.$ar['type_tz'].'</ns:DVehicleTypeID>
    28.                             <ns:Franchise>'.$ar['franshyza'].'</ns:Franchise>
    29.                             <ns:IdentCode>'.$ar['ipn'].'</ns:IdentCode>
    30.                             <ns:InsPremium>'.$ar['price'].'</ns:InsPremium>
    31.                             <ns:Name>'.$ar['name'].'</ns:Name>
    32.                             <ns:PName>'.$ar['pobatkovi'].'</ns:PName>
    33.                             <ns:ProdYear>'.$ar['year_tz'].'</ns:ProdYear>
    34.                             <ns:RegNo>'.$ar['nomer_tz'].'</ns:RegNo>
    35.                             <ns:StartDate>'.$ar['date_start'].'</ns:StartDate>
    36.                             <ns:Surname>'.$ar['prizv'].'</ns:Surname>
    37.                             <ns:VIN>'.$ar['vin'].'</ns:VIN>
    38.                             <ns:VehicleUsage>111111111111</ns:VehicleUsage>
    39.                             <ns:k1>'.$ar['k1'].'</ns:k1>
    40.                             <ns:k2>'.$ar['k2'].'</ns:k2>
    41.                             <ns:k3>'.$ar['k3'].'</ns:k3>
    42.                             <ns:k4>'.$ar['k4'].'</ns:k4>
    43.                             <ns:k5>'.$ar['k5'].'</ns:k5>
    44.                             <ns:k6>'.$ar['k6'].'</ns:k6>
    45.                             <ns:k7>'.$ar['bonus_c'].'</ns:k7>
    46.                          </ns:Contract>
    47.                          <ns:InputMessageID>testRequest</ns:InputMessageID>
    48.                       </ns:digSignRequest>
    49.                    </ns:GetSignFromRequest>
    50.                 </soapenv:Body>
    51.              </soapenv:Envelope>
    Который я отправляю с помощью:
    PHP:
    1. public static function doRequest($xml,$req){
    2.         $params = array ('encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_2, 'trace' => 1, 'exceptions' => 1, "connection_timeout" => 180 );
    3.         $client = new SoapClient("https://policyrw.mtsbu.ua/v3/ChangeContracts.svc?wsdl",$params);      
    4.         $ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
    5.         $headerbody = array('Security'=>array('UsernameToken' => array('Username'=>'TOKEN')));
    6.         $header = new SOAPHeader($ns, 'Security', $headerbody);
    7.         $client->__setSoapHeaders($header);
    8.  
    9.         $res = $client->__doRequest($xml, 'https://policyrw.mtsbu.ua/v3/ChangeContracts.svc', 'http://kitsoft.kiev.ua/mtsbu/2017/08/22/IDigitalPolicy/GetSignFromRequest', SOAP_1_1);
    10.         return $res;
    11.     }
    В ответ получаю строку вместо xml или еще чего нибудь. Кто подскажет где я лоханулся. Спасибо
     
  2. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Сам задал - сам отвечу).
    Проблема была в неправильном парсинге данных после получения ответа. Все теги они есть в ответе. Сначала через file_put_contents вытянул ответ. Увидел что все четко пришло. Потом через:
    PHP:
    1. $doc = new DOMDocument();
    2.         $doc->loadXML($row);
    3.         echo $doc->getElementsByTagName('Success')->item(0)->nodeValue;
    Вытянул конкретную часть ответа. По аналогии можно распарсить весь ответ.Всем спасибо
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Intrerio, раз уж есть wsdl, используйте SoapClient::__soapCall для обращения к методам.
    И ничего парсить не придется.
     
  4. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    И в php оказывается есть DOM, только явно это ни в какое сравнение что есть в js.
     
  5. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Чесно говоря вариант с парсингом мне вышел проще. Весь код упаковался в 6 строк. Спасибо за ответ
    --- Добавлено ---
    Тяжело сказать так как с js работаю только на уровне "легкой визуализации".
     
  6. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Ну это знаете как все используют гугл а я яху :) ajax наверное актуальнее чем soap.
    getElementsByTagName - явная копирка с js, в php обычно названия через андерскоры: is_int
     
    #6 keren, 10 янв 2018
    Последнее редактирование: 10 янв 2018
  7. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    У меня появилась сейчас более смешная но в то же время загадочная проблема. Получая ответ от сервиса, он почему то в кодировке ASCII хотя разработчики сервиса уверяют что они отдают его в utf-8. Из-за этого у меня куча траблов по поводу проверки данных. СИжу вот думаю как преобразовать данные в utf-8 потому что стандартные ф-ции PHP не конвертируют данные почему то из ASCII в utf-8
     
  8. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Вообще то http передача данных должна кодироваться в спецсимволы.
     
  9. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Отследил кое что глобальней. Это не сервис отдает в ASCII. Почему то массив $_POST с данными из формы на страничке передаеться в обработчик в ASCII формате.А вот сервис реально отдает данные в UTF-8.Ничего не пойму почему этот массив в другой кодировке
     
  10. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Так там и должно кодироваться в спецсимволы, теорию почитайте.
     
  11. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    А декод как сделать этих данных?
    --- Добавлено ---
    Только что создал переменную (для теста) $test = "test"; так mb_detect_encoding мне тоже показало ASCII
     
  12. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Вы разберитесь сначала в разнице языковой кодировки и кодировки передачи данных и потом решайте где проблема.
     
  13. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Уже сутки мучаюсь в поисках зерна рациональности. Страница с формой в кодировке UTF-8, обработчик тоже.Откуда взялось ASCII не понимаю.
     
  14. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    PHP:
    1. <?php
    2. $xml = "test";
    3. echo mb_detect_encoding($xml);
    Выдает ASCII. Это чистая страница в корне системы. Кто подскажет куда копать?
    --- Добавлено ---
    А вот если заменить test на тест то все ок - UTF-8
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Intrerio, не удивительно. Ведь ASCII, фактически - подмножество UTF-8.
    Вот автоопределение и дает на тексте 'test' минимальный подходящий вариант.
    --- Добавлено ---
    Хоть пример приведите искаженных полученных данных...
     
  16. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    В самом php нет DOM. Но у него есть библиотека для работы с DOM.
     
  17. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Все решилось. Как оказалось сами разработчики не знали о том что у них микросервис по ЭЦП работает в UTF-16LE .Перекодировал строку и все работает как часики
     
  18. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Хотел спросить, как в итоге взаимодействуете? А то отправлять в одной кодировке получать в другой затем перекодировать, наверное не лучший вариант.
     
  19. Intrerio

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

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    В моем случае указал на данную проблему разработчикам сервиса к которому посылаю запросы и они изменили кодировку на UTF-8. Но пока этого не было то перекодировал строку через iconv и таким образом выходил из положения.
     
    keren нравится это.