Как получить файл get contents () для работы с HTTPS?
Я работаю над настройкой обработки кредитных карт и необходимо использовать обходной путь для CURL. Следующий код работал нормально, когда я использовал тестовый сервер (который не вызывал URL SSL), но теперь, когда я тестирую его на рабочем сервере с 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);
}
11 ответов:
попробуйте следующий скрипт, чтобы узнать, есть ли 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) { [...] }
чтобы разрешить обертку https:
- the
php_openssl
расширение должно существовать и быть включеноallow_url_fopen
должно быть установлено вon
в php.ini файл вы должны добавить эту строку, если она не существует:
extension=php_openssl.dll allow_url_fopen = On
попробуйте следующее.
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; }
Примечание: это отключает проверку SSL, что означает безопасность по HTTPS теряется. Используйте этот код только для тестирования / локального развитие,никогда в интернете или других общедоступных сети. Если этот код работает, это означает, что сертификат SSL не является доверенный или не может быть проверен, который вы должны изучить в качестве исправления отдельный вопрос.
$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
просто добавьте две строки в свой php.ini-файл.
extension=php_openssl.dll
allow_url_include = On
его работа для меня.
у меня была такая же ошибка. Установка
allow_url_include = On
наphp.ini
фиксированная это для меня.
HTTPS поддерживается начиная с PHP 4.3.0, если вы скомпилировали в поддержку OpenSSL. Кроме того, убедитесь, что целевой сервер имеет действительный сертификат, брандмауэр разрешает исходящие соединения и
allow_url_fopen
в php.ini имеет значение true.
в моем случае проблема была связана с WAMP с использованием другого php.ini для CLI, чем Apache, поэтому ваши настройки, сделанные через меню WAMP, не применяются к CLI. Просто измените cli php.ini и все работает.
иногда сервер будет выбирать не отвечать на основе того, что он видит или не видит в заголовках http-запросов (например, соответствующий агент пользователя). Если вы можете подключиться к браузеру, возьмите заголовки, которые он отправляет, и имитируйте их в контексте потока.
ЧТОБЫ ПРОВЕРИТЬ, ЕСЛИ URL-АДРЕС ВВЕРХ ИЛИ НЕТ
код в вашем вопросе можно переписать как в рабочую версию:
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); }