Ich arbeite am Einrichten der Kreditkartenverarbeitung und musste eine Problemumgehung für CURL verwenden. Der folgende Code funktionierte einwandfrei, wenn ich den Testserver verwendete (der keine SSL-URL aufrief), aber jetzt, wenn ich ihn auf dem Arbeitsserver mit HTTPS teste, schlug die Fehlermeldung "Fehler beim Öffnen des Streams" fehl.
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);
}
Probieren Sie das folgende Skript aus, um festzustellen, ob für Ihre PHP-Skripte ein https-Wrapper verfügbar ist.
$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);
die ausgabe sollte so ähnlich sein
openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
[...]
}
So erlauben Sie den https-Wrapper:
php_openssl
Erweiterung muss vorhanden und aktiviert seinallow_url_fopen
muss auf on
gesetzt seinIn der php.ini-Datei sollten Sie diese Zeilen hinzufügen, wenn sie nicht existieren:
extension=php_openssl.dll
allow_url_fopen = On
Versuche Folgendes.
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;
}
Hinweis: Dadurch wird die SSL-Überprüfung deaktiviert, dh die von HTTPS angebotene Sicherheit geht verloren. Verwenden Sie diesen Code nur zum Testen/zur lokalen Entwicklung, niemals im Internet oder für andere öffentlich zugängliche Netzwerke. Wenn dieser Code funktioniert, bedeutet dies, dass das SSL-Zertifikat nicht vertrauenswürdig ist oder nicht überprüft werden kann. Dies sollten Sie als separates Problem untersuchen.
$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));
Auf diese Weise können Sie den Inhalt aus der URL abrufen, unabhängig davon, ob es sich um ein HTTPS handelt
Dies liegt wahrscheinlich daran, dass Ihr Zielserver kein gültiges SSL-Zertifikat hat.
Fügen Sie einfach zwei Zeilen in Ihre php.ini-Datei ein.
extension=php_openssl.dll
allow_url_include = On
es funktioniert für mich.
HTTPS wird ab PHP 4.3.0 unterstützt, sofern Sie OpenSSL unterstützt haben. Stellen Sie außerdem sicher, dass der Zielserver über ein gültiges Zertifikat verfügt, die Firewall ausgehende Verbindungen zulässt und allow_url_fopen
in der php.ini ist auf true gesetzt.
Ich hatte den gleichen fehler Einstellung allow_url_include = On
im php.ini
reparierte es für mich.
In meinem Fall lag das Problem daran, dass WAMP für die CLI eine andere php.ini als Apache verwendet, sodass Ihre über das WAMP-Menü vorgenommenen Einstellungen nicht für die CLI gelten. Ändern Sie einfach die CLI php.ini und es funktioniert.
Manchmal entscheidet sich ein Server dafür, nicht zu antworten, basierend auf dem, was er in den HTTP-Anforderungsheadern sieht oder nicht sieht (z. B. einem geeigneten Benutzeragenten). Wenn Sie eine Verbindung mit einem Browser herstellen können, greifen Sie auf die gesendeten Header zu und ahmen Sie sie in Ihrem Stream-Kontext nach.