Je travaille sur la configuration du traitement des cartes de crédit et je devais utiliser une solution de contournement pour CURL. Le code suivant fonctionnait bien lorsque j'utilisais le serveur de test (qui n'appelait pas d'URL SSL), mais maintenant, lorsque je le teste sur le serveur de travail avec HTTPS, il échoue avec le message d'erreur "Fail to open stream".
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);
}
Essayez le script suivant pour voir s’il existe un wrapper https disponible pour vos scripts 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);
la sortie devrait être quelque chose comme
openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
[...]
}
Pour autoriser le wrapper https:
php_openssl
doit exister et être activéeallow_url_fopen
doit être réglé sur on
Dans le fichier php.ini, vous devriez ajouter ces lignes s'il n'en existe pas:
extension=php_openssl.dll
allow_url_fopen = On
Essayez ce qui suit.
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;
}
Remarque: Ceci désactive la vérification SSL, ce qui signifie la sécurité offerte par HTTPS est perdue. Utilisez ce code uniquement pour les tests/le développement local, jamais sur Internet ou d’autres réseaux destinés au public. Si ce code fonctionne, cela signifie que le certificat SSL n'est pas approuvé ou ne peut pas être vérifié, ce que vous devriez envisager de résoudre en tant que problème distinct.
$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));
Cela vous permettra d'obtenir le contenu de l'URL, que ce soit un HTTPS
Cela est probablement dû au fait que votre serveur cible n'a pas de certificat SSL valide.
Ajoutez simplement deux lignes dans votre fichier php.ini.
extension=php_openssl.dll
allow_url_include = On
ça marche pour moi.
HTTPS est supporté à partir de PHP 4.3.0, si vous avez compilé en support pour OpenSSL. Assurez-vous également que le serveur cible dispose d'un certificat valide, que le pare-feu autorise les connexions sortantes et que allow_url_fopen
dans php.ini est défini sur true.
J'ai eu la même erreur. Régler allow_url_include = On
dans php.ini
le corrige pour moi.
Dans mon cas, le problème était dû au fait que WAMP utilisait un php.ini différent de celui d’Apache pour la CLI. Par conséquent, vos paramètres définis dans le menu WAMP ne s’appliquent pas à la CLI. Il suffit de modifier le fichier php.ini de la CLI et cela fonctionne.
Parfois, un serveur choisit de ne pas répondre en fonction de ce qu'il voit ou ne voit pas dans les en-têtes de la requête http (tel qu'un agent d'utilisateur approprié). Si vous pouvez vous connecter avec un navigateur, récupérez les en-têtes qu'il envoie et imitez-les dans le contexte de votre flux.