113 votes

Comment faire fonctionner file_get_contents() avec HTTPS ?

Je travaille à la mise en place du traitement des cartes de crédit et j'ai dû utiliser une solution de rechange pour CURL. Le code suivant fonctionnait bien lorsque j'utilisais le serveur de test (qui n'appelait pas d'URL SSL), mais maintenant que je le teste sur le serveur de travail avec HTTPS, il échoue avec le message d'erreur "failed 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);
}

120voto

hassan Points 579

Pour autoriser le wrapper https :

  • le site php_openssl l'extension doit exister et être activée
  • allow_url_fopen doit être réglé sur on

Dans le fichier php.ini, vous devez ajouter ces lignes si elles n'existent pas :

extension=php_openssl.dll

allow_url_fopen = On

0 votes

Les deux sont activés dans mon installation mais je reçois toujours l'erreur SSL "Warning : file_get_contents() : SSL : Handshake timed out in".

94voto

VolkerK Points 54118

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);

le résultat devrait être quelque chose comme

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

0 votes

@volker C'est pourquoi j'ai demandé à ce que l'on permette l'ouverture de l'url.

0 votes

Ce qui est étrange, c'est qu'il est dit qu'openssl est désactivé, mais selon phpinfo() il est compilé avec, à moins que je ne le voie mal.

0 votes

Phpinfo() vous le dit dans la ligne de configuration ou y a-t-il une section entière appelée "OpenSSL" ?

57voto

pinouchon Points 7706

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;
}

Note : Ceci désactive la vérification SSL, ce qui signifie la sécurité offerte par par HTTPS est perdue . N'utilisez ce code que pour les tests / le développement développement local, jamais sur internet ou d'autres réseaux publics. Si ce code fonctionne, cela signifie que le certificat SSL n'est pas fiable ou ne peut pas être vérifié. certificat SSL n'est pas fiable ou ne peut pas être vérifié. problème séparé.

30 votes

Pourquoi désactiver la vérification SSL lorsqu'il s'agit du traitement des cartes de crédit ?

0 votes

Merci, l'astuce est ici : curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE) ;

10voto

Emil Vikström Points 42251

Cela est probablement dû au fait que votre serveur cible ne dispose pas d'un certificat SSL valide.

0 votes

Le serveur demandeur ne doit pas nécessairement disposer d'un certificat SSL.

16 votes

Je n'ai pas dit le serveur demandeur, j'ai dit le serveur cible.

2 votes

Ça m'apprendra à écrémer. Heh ! S'il vous plaît accepter mes excuses et upvote.

6voto

Ritesh Chandora Points 884

Il suffit d'ajouter deux lignes dans votre fichier php.ini.

extension=php_openssl.dll

allow_url_include = On

cela fonctionne pour moi.

1 votes

Vous voulez probablement dire allow_url_fopen puisque la question concerne l'ouverture de l'url, et non l'inclusion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X