2015-05-07 16 views
16

Ich integrierte Googles funky ReCaptcha NoCaptcha in eine einfache HTML5 Form. Auf localhost funktioniert es, aber online testet es immer den Fehler 'Invalid-Json'. Hier ist ein Teil meines Code:NoCaptcha Rückgabe Fehler Invalid-JSON

$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()); 
} 

Returns Array ([0] => invalid-json)

ich für etwas Hilfe gegoogelt aber nichts gefunden sehr hilfreich sein.

Da der Code on- und offline gleich ist, bin ich wirklich ahnungslos, wo das Problem herkommt. https://developers.google.com/recaptcha/docs/verify sagt nichts über den Fehlercode. Raten Sie, die Lösung ist zu einfach.

+0

, wenn Sie mehr Code benötigen nur schreien und Ich werde liefern! :) – Tonsenson

Antwort

5

Der Schlüssel zur Lösung war, einfach die PHP-Fehler einzuschalten (ich weiß, es ist peinlich). Dies lieferte den Fehler, der mich zu kämpfen und lieferte auch die Lösung zur gleichen Zeit:

PHP hatte Probleme beim Verbinden mit der https Seite von Google überprüfen. Das war nur wegen einer einzigen Option in der php.ini: allow_url_fopen

php.net Beschreibung:

allow_url_fopen boolean

dieser Option werden die URL-aware fopen-Wrapper ermöglicht die URL ermöglichen den Zugriff auf Objekt wie Dateien. Standard Wrapper sind für den Zugriff von Remote-Dateien mit dem FTP-oder HTTP-Protokoll zur Verfügung gestellt, einige Erweiterungen wie zlib möglicherweise zusätzliche Wrapper registrieren.

Die Änderung von 0 auf 1 löste mein Problem. Zeigt noch mehr, wie wichtig es ist, PHP-Fehler bei der Entwicklung zu aktivieren (ich bin ein super Noob zu PHP-Programmierung)

Hoffe das hilft jemand irgendwann!

+2

Danke Mann. Es half mir zu erkennen, was eigentlich falsch ist. Ich habe https://github.com/google/recaptcha mit der Socket-Methode verwendet. Nochmals vielen Dank – tomexx

0

Die Antwort ist ein JSON-Objekt. Es sollte zuerst dekodiert werden. Ich bin ziemlich neu in Web-Programmierung/Entwicklung, aber ich erfolgreich Google Recaptcha auf einer asp.net-Test-Website, die nichts für jetzt, aber ich bin sicher, dass es behandelt die JSON-Antwort genau so, wie ich es will ..

gefunden, könnte this helfen.

+0

danke, werde ich heute Abend einen Blick darauf werfen – Tonsenson

+0

Also habe ich es letzte Nacht endlich versucht. Ich nehme an, dass diese Version eine etwas ältere Version von ReCaptcha verwendet. Ich dachte, ich könnte es trotzdem geben. Es hat immer noch nicht funktioniert; Ich habe nicht einmal Fehler bekommen. puh – Tonsenson

+0

sorry, die codes, die ich für meinen test verwendet habe, waren in asp.net und C# am back end, ich weiß nicht wie auf ajax ..aber ich denke, dass Sie das JSON-Objekt deserialisieren müssen .. und dann die resultierende Schnurantwort analysieren. –

41

Ich hatte das gleiche Problem und behoben es mit cURL als Anfrage Methode statt POST.

$recaptcha = new \ReCaptcha\ReCaptcha($secret, new \ReCaptcha\RequestMethod\CurlPost()); 
+2

Es muss sein $ recaptcha = new \ ReCaptcha \ ReCaptcha ($ geheim, new \ ReCaptcha \ RequestMethod \ CurlPost()); ' – Jaec

+1

Ich kann das überprüfen, es muss' CurlPost' sein. Außerdem hat es das Problem auch für mich gelöst. –

+1

Ich versuche dieses Update zu verstehen. Auf meinem Entwicklungssystem funktioniert der OPs Code, aber auf dem System meines Klienten brauche ich den CurlPost. Was ist das Problem, das er korrigiert? Korrekturen ohne Erklärungen machen mich nervös. –

1

Dieses es für mich gelöst:

//$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()); 
0

// den Anruf tätigen um die Antwort zu überprüfen und auch die IP-Benutzer übergeben die Adresse

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