Hemos estado integrando recientemente una extensión en Magento que permite el uso de reCaptcha en los formularios de una tienda Magento.
En nuestro caso lo estamos integrando en un formulario a medida, pero nos parecía útil tener una base para desarrollar más rápido.
El utilizar una extensión de un tercero siempre tiene el problema de que supone encontrarse con un error o un funcionamiento que no es adecuado a lo que se busca, porque modificar la extensión suele ser costoso, y en el caso de extensiones sencillas como esta, a menudo, más incluso que desarrollarla uno mismo.
En este caso, nos encontramos con el error «Could not open socket» al comprobar el catpcha contra los servidores de Google.
La solución no ha sido sencilla y hemos tenido varios puntos a revisar.
Activar la función fsockopen
En primer lugar, la librería de Google utiliza la función fsockopen de PHP, y no todos los hostings permiten su uso por motivos de seguridad.
En este proyecto utilizamos un servidor dedicado, así que únicamente había que comprobar que está habilitado en el archivo php.ini.
allow_url_fopen = On
Si en vuestro php.ini tenéis deshabilitada esta opción, es el primer paso para solucionar el problema. En nuestro caso, no fue así, y tuvimos que seguir investigando.
Error en la librería de Google recaptchalib.php
Después de mucho investigar, decidí ‘remangarme’ y entrar en el código.
El error se producía en la función fsockopen, en concreto al intentar conectar con los servidores de Google para validar el captcha.
if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { die ('Could not open socket'); }
Examinando los parámetros que se pasaban a la función, todo parecía correcto, pero en el parámetro $errstr se retornaba un error de timeout: ‘Connection timed out’.
Después de mucho investigar, resultó que la librería no está actualizada para utilizarse con la última versión de PHP y que hay que realizar una pequeña modificación:
// Añadimos getbyhostname para que el parámetro pasado sea correcto if( false == ( $fs = @fsockopen(gethostbyname($host), $port, $errno, $errstr, 10) ) ) { die ('Could not open socket'); }
Excelente solución, muchas gracias
Hola, tengo el error mencionado en mi reCaptcha (‘Could not open socket’), puse la solución que mencionas pero sigue dando el mismo resultado, mi servidor web esta localizado detrás de un proxy, será esto el problema real?
Gracias por tu tiempo
Gracias, me ayudo tu solución…
gracias me sirvió. saludos
En 2016 y todavía sirve :)
Muchas gracias :)
Leon Hunter
Muchas gracias me funciono!!