2009-12-29 6 views
86

Я работаю над настройкой обработки кредитных карт и должен использовать обходной путь для CURL. Следующий код работал нормально, когда я использовал тестовый сервер (который не вызывал URL-адрес SSL), но теперь, когда я тестирую его на рабочем сервере с HTTPS, он не работает с сообщением об ошибке «не удалось открыть поток».Как получить файл_get_contents() для работы с HTTPS?

function send($packet, $url) { 
    $ctx = stream_context_create(
    array(
     'http'=>array(
     'header'=>"Content-type: application/x-www-form-urlencoded", 
     'method'=>'POST', 
     'content'=>$packet 
    ) 
    ) 
); 
    return file_get_contents($url, 0, $ctx); 
} 

ответ

80

Попробуйте выполнить следующий скрипт, чтобы узнать, есть ли https-обертка для ваших php-скриптов.

$w = stream_get_wrappers(); 
echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n"; 
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n"; 
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n"; 
echo 'wrappers: ', var_export($w); 

выход должен быть чем-то вроде

openssl: yes 
http wrapper: yes 
https wrapper: yes 
wrappers: array(11) { 
    [...] 
} 
+0

Это говорит о том, что нет обертки https. –

+0

@volker Вот почему я попросил allow_url_fopen – Gordon

+0

Хорошо, что странно, что он говорит, что openssl выключен, но согласно phpinfo() он скомпилирован с ним, если только я не вижу его неправильно. –

8

Возможно, это связано с тем, что ваш целевой сервер не имеет действительного сертификата SSL.

+0

Для запрашивающего сервера не должно быть сертификата SSL. – ceejayoz

+12

Я не сказал запрашивающий сервер, я сказал целевого сервера. –

+0

Это научит меня скучать. Хех! Примите мои извинения и возвышение. – ceejayoz

5

HTTPS поддерживается начиная с PHP 4.3.0, если вы скомпилировали в поддержку OpenSSL. Кроме того, убедитесь, что целевой сервер имеет действительный сертификат, брандмауэр позволяет исходящие подключения и allow_url_fopen в php.ini установлен в значение true.

+0

У меня PHP 5.2.8 с поддержкой OpenSSL. Я получаю ту же ошибку с этим, и целевой сервер имеет действительный сертификат. –

+2

- это брандмауэр, настроенный для разрешения исходящих соединений https? Обычно веб-сервер, запускающий https, не запускается на порту 80. есть ли что-либо еще в ошибке, кроме «не удалось открыть поток»? – Gordon

+0

Насколько я знаю, в этом вся ошибка: Предупреждение: fopen (https: // ...) [function.fopen]: не удалось открыть поток: нет такого файла или каталога в/home/user /public_html/test.php в строке 993 –

1

Иногда сервер не отвечать на основе того, что он видит или не видит в запросе HTTP заголовках (например, как соответствующий агент пользователя). Если вы можете подключиться к браузеру, возьмите заголовки, которые он отправит, и имитируйте их в контексте потока.

5

У меня была такая же ошибка. Установка allow_url_include = On в php.ini исправила это для меня.

106

Чтобы разрешить HTTPS обертку:

  • расширение php_openssl должна существовать и быть включен
  • allow_url_fopen должен быть установлен в on

В файле php.ini вы должны добавить эти строки, если не существует:

extension=php_openssl.dll 

allow_url_fopen = On 
+4

allow_url_fopen должен быть включен – Raffael

+3

Включение расширения openssl - большое спасибо! – Luc

+2

Это должен быть правильный ответ – OZZIE

43

Попробуйте следующее.

function getSslPage($url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_REFERER, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $result = curl_exec($ch); 
    curl_close($ch); 
    return $result; 
} 

Note: This disables SSL verification, meaning the security offered by HTTPS is lost. Only use this code for testing/local development, never on the internet or other public-facing networks. If this code works, it means the SSL certificate isn't trusted or can't be verified, which you should look into fixing as a separate issue.

+0

Очень полезно, спасибо! – dotancohen

+26

Зачем вам отключать проверку ssl при работе с обработкой кредитной карты? – Peter

+0

Спасибо, трюк здесь: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE); –

3

В моем случае проблема была из-за WAMP с использованием другого php.ini для CLI, чем Apache, так что ваши настройки, сделанные через меню WAMP не применяются к CLI. Просто измените CLI php.ini, и он работает.

6

Просто добавьте две строки в файл php.ini.

extension=php_openssl.dll

allow_url_include = On

его работы для меня.

+1

Вероятно, вы имеете в виду 'allow_url_fopen', поскольку вопрос касается открытия URL-адреса, не считая. –

27
$url= 'https://example.com'; 

$arrContextOptions=array(
     "ssl"=>array(
      "verify_peer"=>false, 
      "verify_peer_name"=>false, 
     ), 
    ); 

$response = file_get_contents($url, false, stream_context_create($arrContextOptions)); 

Это позволит вам получить содержание от URL, будь то HTTPS

+0

Спасибо! Это сработало с моей стороны. Был попыткой вызвать FB Open Graph API :) – decodingpanda

+0

Я пытался получить доступ к домену my с недействительным сертификатом только для целей тестирования, и даже несмотря на то, что это отключает проверку SSL, это было то, что мне нужно. – carla

-1

проверить, если URL IS UP ИЛИ НЕ

код в ваш вопрос можно переписать в отношении рабочей версии:

function send($packet=NULL, $url) { 
// Do whatever you wanted to do with $packet 
// The below two lines of code will let you know if https url is up or not 
$command = 'curl -k '.$url; 
return exec($command, $output, $retValue); 
} 
Смежные вопросы