Permalink
<?php | |
/** | |
* This is a PHP library that handles calling reCAPTCHA. | |
* - Documentation and latest version | |
* https://developers.google.com/recaptcha/docs/php | |
* - Get a reCAPTCHA API Key | |
* https://www.google.com/recaptcha/admin/create | |
* - Discussion group | |
* http://groups.google.com/group/recaptcha | |
* | |
* @copyright Copyright (c) 2014, Google Inc. | |
* @link http://www.google.com/recaptcha | |
* | |
* Permission is hereby granted, free of charge, to any person obtaining a copy | |
* of this software and associated documentation files (the "Software"), to deal | |
* in the Software without restriction, including without limitation the rights | |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
* copies of the Software, and to permit persons to whom the Software is | |
* furnished to do so, subject to the following conditions: | |
* | |
* The above copyright notice and this permission notice shall be included in | |
* all copies or substantial portions of the Software. | |
* | |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
* THE SOFTWARE. | |
*/ | |
/** | |
* A ReCaptchaResponse is returned from checkAnswer(). | |
*/ | |
class ReCaptchaResponse | |
{ | |
public $success; | |
public $errorCodes; | |
} | |
class ReCaptcha | |
{ | |
private static $_signupUrl = "https://www.google.com/recaptcha/admin"; | |
private static $_siteVerifyUrl = | |
"https://www.google.com/recaptcha/api/siteverify?"; | |
private $_secret; | |
private static $_version = "php_1.0"; | |
/** | |
* Constructor. | |
* | |
* @param string $secret shared secret between site and ReCAPTCHA server. | |
*/ | |
function ReCaptcha($secret) | |
{ | |
if ($secret == null || $secret == "") { | |
die("To use reCAPTCHA you must get an API key from <a href='" | |
. self::$_signupUrl . "'>" . self::$_signupUrl . "</a>"); | |
} | |
$this->_secret=$secret; | |
} | |
/** | |
* Encodes the given data into a query string format. | |
* | |
* @param array $data array of string elements to be encoded. | |
* | |
* @return string - encoded request. | |
*/ | |
private function _encodeQS($data) | |
{ | |
$req = ""; | |
foreach ($data as $key => $value) { | |
$req .= $key . '=' . urlencode(stripslashes($value)) . '&'; | |
} | |
// Cut the last '&' | |
$req=substr($req, 0, strlen($req)-1); | |
return $req; | |
} | |
/** | |
* Submits an HTTP GET to a reCAPTCHA server. | |
* | |
* @param string $path url path to recaptcha server. | |
* @param array $data array of parameters to be sent. | |
* | |
* @return array response | |
*/ | |
private function _submitHTTPGet($path, $data) | |
{ | |
$req = $this->_encodeQS($data); | |
$response = file_get_contents($path . $req); | |
return $response; | |
} | |
/** | |
* Calls the reCAPTCHA siteverify API to verify whether the user passes | |
* CAPTCHA test. | |
* | |
* @param string $remoteIp IP address of end user. | |
* @param string $response response string from recaptcha verification. | |
* | |
* @return ReCaptchaResponse | |
*/ | |
public function verifyResponse($remoteIp, $response) | |
{ | |
// Discard empty solution submissions | |
if ($response == null || strlen($response) == 0) { | |
$recaptchaResponse = new ReCaptchaResponse(); | |
$recaptchaResponse->success = false; | |
$recaptchaResponse->errorCodes = 'missing-input'; | |
return $recaptchaResponse; | |
} | |
$getResponse = $this->_submitHttpGet( | |
self::$_siteVerifyUrl, | |
array ( | |
'secret' => $this->_secret, | |
'remoteip' => $remoteIp, | |
'v' => self::$_version, | |
'response' => $response | |
) | |
); | |
$answers = json_decode($getResponse, true); | |
$recaptchaResponse = new ReCaptchaResponse(); | |
if (trim($answers ['success']) == true) { | |
$recaptchaResponse->success = true; | |
} else { | |
$recaptchaResponse->success = false; | |
$recaptchaResponse->errorCodes = $answers [error-codes]; | |
} | |
return $recaptchaResponse; | |
} | |
} | |
?> |