:::: MENU ::::

Solucionar error reCaptcha ‘Could not open socket’

4.50 avg. rating (87% score) - 8 votes

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



6 Comments

Hey! Qué opinas sobre el artículo?