За последние 24 часа нас посетили 22030 программистов и 1148 роботов. Сейчас ищут 390 программистов ...

API не работает с PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем Freakmeister, 24 июн 2015.

  1. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Есть API, которое имеет устаревший SSL-сертификат 3 версии и не открывается нигде кроме IE6:
    https://icrs.demo.nbki.ru/products/B2BRequestServlet
    Передо мной поставили задачу законтачить его с PHP.
    Первое что я попробовал это конечно file_get_contents():

    Код (PHP):
    1. $options = array(
    2.     'http' => array(
    3.         'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
    4.         'method'  => 'POST',
    5.         'content' => $xml,
    6.     ),
    7. );
    8.  
    9. $context  = stream_context_create($options);
    10. $result = file_get_contents('https://icrs.demo.nbki.ru/products/B2BRequestServlet', false, $context);
    11. $result = json_decode($result, true);
    12. echo '<pre>'; var_export($result); echo '</pre>'; // отладка             
    На что получил:
    Код (Text):
    1. Warning: file_get_contents() [function.file-get-contents]: Failed to enable crypto
    Стал гуглить, нагуглил что тут надо юзать cURL. Попробовал так:

    Код (PHP):
    1. function getSSLPage($url, $p=null) {
    2.     $ch = curl_init();
    3.     curl_setopt($ch, CURLOPT_HEADER, false);
    4.     curl_setopt($ch, CURLOPT_URL, $url);
    5.     curl_setopt($ch, CURLOPT_SSLVERSION,3);  
    6.     if ($p) {
    7.         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    8.         curl_setopt($ch, CURLOPT_POST, 1);
    9.         curl_setopt($ch, CURLOPT_POSTFIELDS, $p);
    10.     }
    11.     $result =  curl_exec($ch);
    12.     curl_close($ch);
    13.     return $result;
    14. }
    15.  
    16. $result = getSSLPage("https://icrs.demo.nbki.ru/products/B2BRequestServlet", $xml);
    17. echo '<pre>'; var_export($result); echo '</pre>'; // отладка   
    Возвращает false. Есть ещё способы как можно попытаться приконтачиться к этому API, или оно вообще не будет работать с PHP? Если что, переменная $xml которую нужно отправить содержит вот такой текст. Можете сами попробовать поотправлять.

    Код (Text):
    1. <?xml version="1.0" encoding="Windows-1251" ?>
    2. <product>
    3. <prequest>
    4. <req>
    5. <AddressReq>
    6. <street>Горького</street>
    7. <houseNumber>1</houseNumber>
    8. <apartment>38</apartment>
    9. <city>Магадан</city>
    10. <postal>685000</postal>
    11. <addressType>1</addressType>
    12. </AddressReq>
    13. <AddressReq>
    14. <street>Цветочная</street>
    15. <houseNumber>5</houseNumber>
    16. <apartment>143</apartment>
    17. <city>Магадан</city>
    18. <postal>685000</postal>
    19. <addressType>2</addressType>
    20. </AddressReq>
    21. <IdReq>
    22. <idNum>123456</idNum>
    23. <idType>21</idType>
    24. <seriesNumber>1234</seriesNumber>
    25. <issueCountry>г. Магадан</issueCountry>
    26. <issueDate>2006-03-18</issueDate>
    27. <issueAuthority>ОВД Центральное, к/п 255</issueAuthority>
    28. </IdReq>
    29. <InquiryReq>
    30. <inqPurpose>01</inqPurpose>
    31. <inqAmount>10000</inqAmount>
    32. <currencyCode>USD</currencyCode>
    33. </InquiryReq>
    34. <PersonReq>
    35. <name1>Кустов</name1>
    36. <first>Георгий</first>
    37. <paternal>Георгиевич</paternal>
    38. <gender>1</gender>
    39. <birthDt>1946-07-06</birthDt>
    40. <placeOfBirth>Москва</placeOfBirth>
    41. </PersonReq>
    42. <RequestorReq>
    43. <MemberCode>0001BB000000</MemberCode>
    44. <UserID>0001BB000001</UserID>
    45. <Password>password</Password>
    46. </RequestorReq>
    47. <RefReq>
    48. <product>CHST</product>
    49. </RefReq>
    50. <IOType>B2B</IOType>
    51. <OutputFormat>XML</OutputFormat>
    52. <lang>ru</lang>
    53. </req>
    54. </prequest>
    55. </product>
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Может в cURL просто отключить проверку сертификата?
    CURLOPT_SSL_VERIFYPEER FALSE
    CURLOPT_SSL_VERIFYHOST FALSE
    Или попробовать настроить нормально cURL.
     
  3. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Не прокатило. =( Ссылка для запроса - это тестовое API есичо, оно доступно ещё по http. Вот если туда послать запрос, то ответ есть:

    Код (Text):
    1.  002 General System Error: java.lang.NullPointerException
    Какой-никакой, но ответ. Надо чтобы тоже самое пришло с https.

    А это что за набор функций? http://php.ru/manual/function.stream-socket-enable-crypto.html
    Никогда не юзал. Может ими можно отправить POST?
     
  4. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Чем все закончилось?

    Мне вот тоже «посчастливилось» писать взаимодействие с НБКИ