src/Service/RecaptchaService.php line 20

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use Buzz\Browser;
  4. use Buzz\Client\FileGetContents;
  5. use Nyholm\Psr7\Factory\Psr17Factory;
  6. use Psr\Log\LoggerInterface;
  7. use Psr\Http\Message\ResponseInterface;
  8. class RecaptchaService
  9. {
  10. public function __construct(
  11. private LoggerInterface $logger,
  12. private $recaptchaUrl,
  13. private $recaptchaSecret,
  14. private $recaptchaRetries
  15. ) {
  16. $client = new FileGetContents(new Psr17Factory());
  17. $this->browser = new Browser($client, new Psr17Factory());
  18. }
  19. // Login route
  20. const ROUTE_VERIFY = '/recaptcha/api/siteverify';
  21. public function verifyToken($token)
  22. {
  23. $this->logger->debug('***** Verifying token for recaptcha');
  24. $response = null;
  25. for ($i = 0; $response == null && $i < $this->recaptchaRetries; $i ++) {
  26. try {
  27. $url = sprintf('%s%s?secret=%s&response=%s', $this->recaptchaUrl, self::ROUTE_VERIFY, $this->recaptchaSecret, $token);
  28. /** @var ResponseInterface $response **/
  29. $response = $this->browser->get($url);
  30. } catch (\Exception $ex) {
  31. $this->logger->debug('***** Error verifying token: ' . $ex->getMessage());
  32. $response = null;
  33. }
  34. }
  35. if ($response == null) {
  36. throw new \Exception("Could Not Verify Token");
  37. }
  38. $this->logger->debug('***** Token was verified');
  39. $responseString = $response->getBody()->getContents();
  40. $this->logger->debug('***** Full verification results: '. $responseString);
  41. $responseObject = json_decode($responseString, true);
  42. $result = (isset($responseObject['success']) && $responseObject['success']);
  43. $this->logger->debug('***** Recaptcha pass results: ' . ($result ? 'Pass' : 'Fail'));
  44. return $result;
  45. }
  46. }