Есть API, которое имеет устаревший SSL-сертификат 3 версии и не открывается нигде кроме IE6: https://icrs.demo.nbki.ru/products/B2BRequestServlet Передо мной поставили задачу законтачить его с PHP. Первое что я попробовал это конечно file_get_contents(): Код (PHP): $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => $xml, ), ); $context = stream_context_create($options); $result = file_get_contents('https://icrs.demo.nbki.ru/products/B2BRequestServlet', false, $context); $result = json_decode($result, true); echo '<pre>'; var_export($result); echo '</pre>'; // отладка На что получил: Код (Text): Warning: file_get_contents() [function.file-get-contents]: Failed to enable crypto Стал гуглить, нагуглил что тут надо юзать cURL. Попробовал так: Код (PHP): function getSSLPage($url, $p=null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSLVERSION,3); if ($p) { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $p); } $result = curl_exec($ch); curl_close($ch); return $result; } $result = getSSLPage("https://icrs.demo.nbki.ru/products/B2BRequestServlet", $xml); echo '<pre>'; var_export($result); echo '</pre>'; // отладка Возвращает false. Есть ещё способы как можно попытаться приконтачиться к этому API, или оно вообще не будет работать с PHP? Если что, переменная $xml которую нужно отправить содержит вот такой текст. Можете сами попробовать поотправлять. Код (Text): <?xml version="1.0" encoding="Windows-1251" ?> <product> <prequest> <req> <AddressReq> <street>Горького</street> <houseNumber>1</houseNumber> <apartment>38</apartment> <city>Магадан</city> <postal>685000</postal> <addressType>1</addressType> </AddressReq> <AddressReq> <street>Цветочная</street> <houseNumber>5</houseNumber> <apartment>143</apartment> <city>Магадан</city> <postal>685000</postal> <addressType>2</addressType> </AddressReq> <IdReq> <idNum>123456</idNum> <idType>21</idType> <seriesNumber>1234</seriesNumber> <issueCountry>г. Магадан</issueCountry> <issueDate>2006-03-18</issueDate> <issueAuthority>ОВД Центральное, к/п 255</issueAuthority> </IdReq> <InquiryReq> <inqPurpose>01</inqPurpose> <inqAmount>10000</inqAmount> <currencyCode>USD</currencyCode> </InquiryReq> <PersonReq> <name1>Кустов</name1> <first>Георгий</first> <paternal>Георгиевич</paternal> <gender>1</gender> <birthDt>1946-07-06</birthDt> <placeOfBirth>Москва</placeOfBirth> </PersonReq> <RequestorReq> <MemberCode>0001BB000000</MemberCode> <UserID>0001BB000001</UserID> <Password>password</Password> </RequestorReq> <RefReq> <product>CHST</product> </RefReq> <IOType>B2B</IOType> <OutputFormat>XML</OutputFormat> <lang>ru</lang> </req> </prequest> </product>
Может в cURL просто отключить проверку сертификата? CURLOPT_SSL_VERIFYPEER FALSE CURLOPT_SSL_VERIFYHOST FALSE Или попробовать настроить нормально cURL.
Не прокатило. =( Ссылка для запроса - это тестовое API есичо, оно доступно ещё по http. Вот если туда послать запрос, то ответ есть: Код (Text): 002 General System Error: java.lang.NullPointerException Какой-никакой, но ответ. Надо чтобы тоже самое пришло с https. А это что за набор функций? http://php.ru/manual/function.stream-socket-enable-crypto.html Никогда не юзал. Может ими можно отправить POST?