web-dev-qa-db-fra.com

Comment faire pour que file_get_contents () fonctionne avec HTTPS?

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);
}
99
James Simpson

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) {
  [...]
}
87
VolkerK

Pour autoriser le wrapper https:

  • l'extension php_openssl doit exister et être activée
  • allow_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
112
hassan

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.

51
Benjamin Crouzier
$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

37
Dushyant Dagar

Cela est probablement dû au fait que votre serveur cible n'a pas de certificat SSL valide.

9
Emil Vikström

Ajoutez simplement deux lignes dans votre fichier php.ini.

extension=php_openssl.dll

allow_url_include = On

ça marche pour moi.

6
Ritesh Chandora

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.

5
Gordon

J'ai eu la même erreur. Régler allow_url_include = On dans php.ini le corrige pour moi.

5
Jim Jones

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.

3
dtbarne

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.

1
GZipp