Single File ReCaptcha 2 PHP Client
leading captcha system, curl, php, json-response
Today, a web-form without a proven captcha system generates a lot of spam entries and data-trash in your database. One of the best is ReCaptcha (even the latest v2).
Google provides an easy to use ReCaptcha PHP Client – but it’s a bit over engineered! You need a bunch of PHP files and a composer based environment to use it out of the box. This can cause some trouble in highly customized/optimized projects.
Therefore, here is a “one-file” solution which works without any configuration overhead:
Usage#
require('ReCaptcha.php');
// register your secret
ReCaptcha::setSecret('<your-secret>');
// some code ...
// check user form
if (ReCaptcha::isValid()){ ...
One-File Solution#
// Developer Guide: https://developers.google.com/recaptcha/docs/verify
class ReCaptcha{
// ReCaptcha API Endpoint
const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
// the last result
private static $_result = null;
// client secret
private static $_secret = null;
// validate
public static function isValid(){
// token available ?
if (!isset($_POST['g-recaptcha-response'])){
return false;
}
// extract token
$token = trim($_POST['g-recaptcha-response']);
// generate url
$params = http_build_query(array(
'secret' => self::$_secret,
'response' => $token,
'remoteIp' => $_SERVER['REMOTE_ADDR']
), '', '&');
// create curl based post request
$handle = curl_init(self::SITE_VERIFY_URL);
$options = array(
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/x-www-form-urlencoded'
),
CURLINFO_HEADER_OUT => false,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => true
);
curl_setopt_array($handle, $options);
$response = curl_exec($handle);
curl_close($handle);
// decode response
self::$_result = json_decode($response, true);
// check
return (self::$_result['success'] === true);
}
// error occurred ?
public static function isError(){
return (self::$_result['success'] === false);
}
// get error message from last request
public static function getErrorMessages(){
return self::$_result['error-codes'];
}
// set client secret
public static function setSecret($s){
self::$_secret = $s;
}
}