urls script examples ejemplo php json recaptcha

php - script - response recaptcha



NoCaptcha devolviendo error inválido-json (6)

// Haga la llamada para verificar la respuesta y también pase la dirección IP del usuario

$resp = $recaptcha->verify($recaptcha_response, $this->CI->input->ip_address());

Integré Google Funky ReCaptcha NoCaptcha en un formulario html5 simple. En localhost está funcionando, pero las pruebas en línea siempre devuelven el error ''invalid-json''. Aquí es parte de mi código:

$secret = ''TEHSEHCRET''; $recaptcha = new /ReCaptcha/ReCaptcha($secret); $resp = $recaptcha->verify($_POST[''g-recaptcha-response''], $_SERVER[''REMOTE_ADDR'']); if ($resp->isSuccess()) { // do some } else { print_r($errors = $resp->getErrorCodes()); }

Devuelve la Array ( [0] => invalid-json )

Busqué en Google algo de ayuda pero no encontré nada realmente útil.

Dado que el código en línea y fuera de línea es el mismo, no tengo ni idea de dónde viene el problema. https://developers.google.com/recaptcha/docs/verify no dice nada sobre el código de error. Supongo que la solución es demasiado simple.


Esto me lo resolvió:

//$recaptcha = new /ReCaptcha/ReCaptcha($secret); // If file_get_contents() is locked down on your PHP installation to disallow // its use with URLs, then you can use the alternative request method instead. // This makes use of fsockopen() instead. $recaptcha = new /ReCaptcha/ReCaptcha($secret, new /ReCaptcha/RequestMethod/SocketPost());


La clave de la solución fue simplemente activar los errores de php (lo sé, es embarazoso). Esto entregó el error que me mantuvo luchando y también entregó la solución al mismo tiempo:

PHP tuvo problemas para conectarse a la página de verificación https de google. Eso fue solo por una sola opción en php.ini: allow_url_fopen

Descripción de php.net:

allow_url_fopen boolean

Esta opción habilita las envolturas fopen que reconocen la URL que permiten acceder a objetos URL como archivos. Los envoltorios predeterminados se proporcionan para el acceso de archivos remotos utilizando el protocolo ftp o http, algunas extensiones como zlib pueden registrar envoltorios adicionales.

Cambiar su valor de 0 a 1 resolvió mi problema. Muestra aún más lo importante que es activar los errores de PHP al desarrollar (soy un super noob para la programación de PHP)

Espero que esto ayude a alguien algún tiempo!


La respuesta es un objeto json. Debe decodificarse primero. Soy bastante nuevo en programación / desarrollo web, pero integré con éxito Google Recaptcha en un sitio de prueba de asp.net que no hace nada por ahora, pero estoy seguro de que maneja la respuesta json de la manera que quiero.

Encontré otro, podría ayudar this .


Tuve el mismo problema y lo solucioné utilizando cURL como método de solicitud en lugar de POST.

$recaptcha = new /ReCaptcha/ReCaptcha($secret, new /ReCaptcha/RequestMethod/CurlPost());


use ReCaptcha/ReCaptcha; use ReCaptcha/RequestMethod; use ReCaptcha/RequestParameters; use ReCaptcha/RequestMethod/CurlPost; class NotSSLCurl extends CurlPost implements RequestMethod { public function __construct() { $this->curl = curl_init(self::SITE_VERIFY_URL); curl_setopt($this->curl, CURLINFO_HEADER_OUT, 0); curl_setopt($this->curl, CURLOPT_HEADER, 0); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_BINARYTRANSFER,1); curl_setopt($this->curl, CURLOPT_TIMEOUT, 9999); curl_setopt($this->curl, CURLOPT_USERAGENT, ''Mozilla/5.0''); curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($this->curl, CURLOPT_POST , 1); curl_setopt($this->curl, CURLOPT_HTTPHEADER , array(''Content-Type: application/x-www-form-urlencoded'')); } public function submit(RequestParameters $params) { curl_setopt($this->curl, CURLOPT_POSTFIELDS , $params->toQueryString()); return curl_exec($this->curl); } public function __destruct() { curl_close($this->curl); } } // example validation: $recaptcha = new ReCaptcha(''CLIENT_SECRECT'', new NotSSLCurl()); $resp = $recaptcha->verify(@$_POST[''g-recaptcha-response''],$_SERVER[''REMOTE_ADDR'']); var_dump($resp->isSuccess());