Skip to content

Instantly share code, notes, and snippets.

@mitrallex
Created August 6, 2018 12:14
Show Gist options
  • Save mitrallex/e0af00c0f92f8ad5be27cb2ea98e696d to your computer and use it in GitHub Desktop.
Save mitrallex/e0af00c0f92f8ad5be27cb2ea98e696d to your computer and use it in GitHub Desktop.
laravel-google-recaptcha
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use GuzzleHttp\Client;
class ValidRecaptcha implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
// Validate ReCaptcha
$client = new Client([
'base_uri' => 'https://google.com/recaptcha/api/'
]);
$response = $client->post('siteverify', [
'query' => [
'secret' => env('GOOGLE_RECAPTCHA_SECRET'),
'response' => $value
]
]);
return json_decode($response->getBody())->success;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'ReCaptcha verification failed.';
}
}
@assghard
Copy link

assghard commented Apr 4, 2021

Hello.
Thank you for this Rule. It's very helpful.
I would like to add a few fixes to this: try catch because of external HTTP request to Google which can fail and verify SSL rule for Guzzle post request (if no default cert provided). The changes are below:

    $client = new Client([
        'base_uri' => 'https://google.com/recaptcha/api/',
        'verify' => (env('APP_ENV') == 'production') ? true : false // for CURL post request if no default cert provided
    ]);
 try {
    $client = new Client([
        'base_uri' => 'https://google.com/recaptcha/api/',
        'verify' => (env('APP_ENV') == 'production') ? true : false
    ]);
    
    $response = $client->post('siteverify', [
        'query' => [
            'secret' => env('GOOGLE_RECAPTCHA_SECRET'),
            'response' => $value
        ]
   ]);
    
    return json_decode($response->getBody())->success; // true or false
} catch (\Throwable $th) { // if something went wrong return false ("ReCaptcha verification failed.")
    return false;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment