2009-12-29 17 views
86

Estoy trabajando en la configuración del procesamiento de la tarjeta de crédito y necesitaba usar una solución temporal para CURL. El siguiente código funcionaba bien cuando estaba usando el servidor de prueba (que no llamaba a una URL SSL), pero ahora cuando lo estoy probando en el servidor en funcionamiento con HTTPS, está fallando con el mensaje de error "no se pudo abrir la transmisión".¿Cómo hacer que file_get_contents() funcione con 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); 
} 

Respuesta

80

Pruebe la siguiente secuencia de comandos para ver si hay un contenedor https disponible para sus 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 salida debería ser algo así como

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

Eso dice que no hay envoltorio https. –

+0

@volker Es por eso que pedí allow_url_fopen – Gordon

+0

Bueno, lo que es extraño es que dice que openssl está desactivado, pero de acuerdo con phpinfo() se compila con él, a menos que lo esté viendo mal. –

8

Esto probablemente se deba a que su servidor de destino no tiene un certificado SSL válido.

+0

El servidor solicitante no necesita tener un certificado SSL. – ceejayoz

+12

No dije el servidor solicitante, dije el servidor de destino. –

+0

Eso me enseñará a desnatar. ¡Heh! Por favor acepte mis disculpas y voto positivo. – ceejayoz

5

HTTPS es compatible a partir de PHP 4.3.0, si ha compilado en soporte para OpenSSL. Además, asegúrese de que el servidor de destino tenga un certificado válido, el servidor de seguridad permite las conexiones salientes y allow_url_fopen en php.ini está establecido en verdadero.

+0

Tengo PHP 5.2.8 con soporte OpenSSL. Estoy obteniendo el mismo error con esto, y el servidor de destino tiene un certificado válido. –

+2

es el servidor de seguridad configurado para permitir conexiones https de salida? Por lo general, el servidor web que ejecuta https no se ejecuta en el puerto 80. ¿Hay algo más en el error aparte de "no se pudo abrir el flujo"? – Gordon

+0

Hasta donde yo sé, este es el error completo: Advertencia: fopen (https: // ...) [function.fopen]: no se pudo abrir la secuencia: No existe ningún archivo o directorio en/home/user /public_html/test.php en la línea 993 –

1

A veces un servidor elegirá a no responder en base a lo que se ve o no ve en las cabeceras de petición HTTP (tal como un agente de usuario adecuado) Si puede conectarse con un navegador, tome los encabezados que envía y métalos en el contexto de su secuencia.

5

Tuve el mismo error. El ajuste allow_url_include = On en php.ini lo arregló para mí.

106

Para permitir https envoltorio:

  • la extensión php_openssl debe existir y estar habilitado
  • allow_url_fopen se debe establecer en on

En el archivo php.ini se debe añadir estas líneas si no existe:

extension=php_openssl.dll 

allow_url_fopen = On 
+4

allow_url_fopen tiene que estar activado – Raffael

+3

Habilitar la extensión de openssl funcionó - ¡muchas gracias! – Luc

+2

esta debería ser la respuesta correcta – OZZIE

43

Pruebe lo siguiente.

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: This disables SSL verification, meaning the security offered by HTTPS is lost. Only use this code for testing/local development, never on the internet or other public-facing networks. If this code works, it means the SSL certificate isn't trusted or can't be verified, which you should look into fixing as a separate issue.

+0

¡Muy útil, gracias! – dotancohen

+26

¿Por qué desactivaría la verificación SSL al tratar con el procesamiento de tarjetas de crédito? – Peter

+0

Gracias, el truco está aquí: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE); –

3

En mi caso, el problema se debió a WAMP utilizando un php.ini diferente para CLI de Apache, por lo que sus ajustes realizados a través del menú WAMP no se aplican a la CLI. Simplemente modifique el CLI php.ini y funciona.

6

Simplemente agregue dos líneas en su archivo php.ini.

extension=php_openssl.dll

allow_url_include = On

su trabajo para mí.

+1

Probablemente quiera decir 'allow_url_fopen' ya que la pregunta se refiere a la apertura de la url, sin incluir. –

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

Esto le permitirá obtener el contenido de la URL si es un HTTPS

+0

¡Gracias! Esto funcionó en mi lado. He intentado llamar a la API de FB Open Graph :) – decodingpanda

+0

Estaba intentando acceder a un dominio mío con certificado no válido solo para fines de prueba y, aunque esto deshabilita la validación de SSL, era lo que necesitaba. – carla

-1

para comprobar si una URL está arriba o NO

El código en tu pregunta puede ser reescrita en cuanto a una versión de trabajo:

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); 
} 
Cuestiones relacionadas