Как заставить file_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);
}
Ответы
Ответ 1
Попробуйте выполнить script, чтобы проверить наличие 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) {
[...]
}
Ответ 2
Чтобы разрешить обертку https:
- расширение
php_openssl
должно существовать и включаться
-
allow_url_fopen
должен быть установлен на on
В файле php.ini вы должны добавить эти строки, если они не существуют:
extension=php_openssl.dll
allow_url_fopen = On
Ответ 3
Попробуйте следующее.
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 не доверяют или не могут быть проверены, что вы должны изучить в качестве отдельный выпуск.
Ответ 4
$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
Ответ 5
Возможно, это связано с тем, что ваш целевой сервер не имеет действительного сертификата SSL.
Ответ 6
Просто добавьте две строки в файл php.ini.
extension=php_openssl.dll
allow_url_include = On
его работа для меня.
Ответ 7
HTTPS поддерживается начиная с PHP 4.3.0, если вы скомпилировали поддержку OpenSSL.
Кроме того, убедитесь, что целевой сервер имеет действительный сертификат, брандмауэр позволяет исходящие соединения и allow_url_fopen
в php.ini установлен в значение true.
Ответ 8
У меня была такая же ошибка. Установка allow_url_include = On
в php.ini
исправила его для меня.
Ответ 9
В моем случае проблема возникла из-за WAMP с использованием другого php.ini для CLI, чем Apache, поэтому ваши настройки, выполненные в меню WAMP, не применяются к CLI. Просто измените CLI php.ini, и он работает.
Ответ 10
Иногда сервер выбирает не отвечать в зависимости от того, что он видит или не видит в заголовках запросов HTTP (например, соответствующего пользовательского агента). Если вы можете подключиться к браузеру, возьмите заголовки, которые он отправит, и имитируйте их в контексте потока.
Ответ 11
ПРОВЕРИТЬ, ЕСЛИ ИСКАТЬ ИЛИ НЕ
Код в вашем вопросе может быть переписан как рабочая версия:
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);
}