I have integrated recaptcha in search form but the issue is when user directly hit the search url like catalogsearch/result/?q=ring, there also i have integrate recaptcha. Please suggest some method. I have integrated it but when i search for the first time, it refreshes and redirect to homepage. Rest in second time it is working
Code of my form.mini.phtml
<?php
$helper = $this->helper('MagentoSearchHelperData');
$objectManager = MagentoFrameworkAppObjectManager::getInstance();
$scopeConfig = $objectManager->get(MagentoFrameworkAppConfigScopeConfigInterface::class);
$siteKey = $scopeConfig->getValue(
'recaptcha_frontend/type_recaptcha_v3/public_key',
MagentoStoreModelScopeInterface::SCOPE_STORE
);
?>
<i id="searchIcon" class="search-icon icon-search "></i>
<div id="screen" class="search-screen">
<div class="container">
<form class="form minisearch" id="search_mini_form2" action="<?php echo $helper->getResultUrl() ?>" method="get">
<div class="field search">
<div class="search-input">
<input id="search2"
data-mage-init='{"quickSearch":{
"formSelector":"#search_mini_form2",
"url":"<?php echo $block->getUrl('search/ajax/suggest'); ?>",
"destinationSelector":"#search_autocomplete"}
}'
type="text"
name="<?php echo $helper->getQueryParamName() ?>"
value="<?php echo $helper->getEscapedQueryText() ?>"
placeholder="<?php echo __('Search'); ?>"
class="search-box input-text"
aria-labelledby="search_autocomplete"
maxlength="<?php echo $helper->getMaxQueryLength();?>"
role="combobox"
aria-haspopup="false"
aria-autocomplete="both"
autocomplete="off"/>
<div id="search_autocomplete" class="search-autocomplete"></div>
</div>
<!-- hidden field for v3 token -->
<input type="hidden" name="g-recaptcha-response" id="recaptchaResponseSearch" />
<div class="search-button">
<button type="submit"
class="action search"
value="submit"
style="display: none;">
<span><p style="display: none;">Search</p></span>
</button>
</div>
</div>
</form>
<!-- reCAPTCHA v3 API -->
<script src="https://www.google.com/recaptcha/api.js?render=<?php echo $siteKey ?>"></script>
<script>
require(['jquery'], function($) {
$(document).ready(function() {
var $form = $('#search_mini_form2');
var $input = $('#recaptchaResponseSearch');
if (!$form.length || !$input.length) return;
// Hook into quickSearch before AJAX request
$form.on('submit', function(e) {
e.preventDefault();
// Generate reCAPTCHA token
grecaptcha.ready(function() {
grecaptcha.execute('<?php echo $siteKey ?>', {action: 'search'}).then(function(token) {
$input.val(token);
// Now manually trigger quickSearch AJAX
if ($form.data('mage-init')) {
$form.trigger('search'); // triggers quickSearch submit
} else {
// fallback to normal submit
$form.off('submit'); // prevent loop
$form.submit();
}
});
});
});
});
});
</script>
<span class="close-icon"><i id="closeIcon" class="icon-close"></i></span>
</div>
</div>
//Code of plugin is
namespace CustomSearchCaptchaPlugin;
use MagentoFrameworkAppActionAction;
use MagentoFrameworkAppRequestInterface;
use MagentoFrameworkAppObjectManager;
use MagentoFrameworkControllerResultFactory;
use MagentoStoreModelScopeInterface;
class SearchDispatchPlugin
{
public function aroundDispatch(Action $subject, Closure $proceed, RequestInterface $request)
{
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
// Only for catalogsearch/result/index
if ($module === 'catalogsearch' && $controller === 'result' && $action === 'index') {
$token = $request->getParam('g-recaptcha-response');
// Load dependencies only when needed
$objectManager = ObjectManager::getInstance();
$scopeConfig = $objectManager->get(MagentoFrameworkAppConfigScopeConfigInterface::class);
$messageManager = $objectManager->get(MagentoFrameworkMessageManagerInterface::class);
$resultFactory = $objectManager->get(ResultFactory::class);
if (!$token) {
$siteKey = $scopeConfig->getValue(
'recaptcha_frontend/type_recaptcha_v3/public_key',
ScopeInterface::SCOPE_STORE
);
echo '<html><head><script src="https://www.google.com/recaptcha/api.js?render=' . $siteKey . '"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute("' . $siteKey . '", {action: "search"}).then(function(token) {
let url = window.location.href;
if(url.indexOf("g-recaptcha-response") === -1) {
if(url.indexOf("?") > -1) {
url += "&g-recaptcha-response=" + token;
} else {
url += "?g-recaptcha-response=" + token;
}
window.location.href = url;
}
});
});
</script></head><body>Please wait... validating search...</body></html>';
exit;
}
// If token exists, verify
if (!$this->verifyRecaptcha($token, $scopeConfig)) {
$messageManager->addErrorMessage(__('CAPTCHA verification failed. Please try again.'));
$resultRedirect = $resultFactory->create(ResultFactory::TYPE_REDIRECT);
$resultRedirect->setPath('/');
return $resultRedirect;
}
}
return $proceed($request);
}
protected function verifyRecaptcha($token, $scopeConfig)
{
$secret = $scopeConfig->getValue(
'recaptcha_frontend/type_recaptcha_v3/private_key',
MagentoStoreModelScopeInterface::SCOPE_STORE
);
$verifyUrl = 'https://www.google.com/recaptcha/api/siteverify';
$response = file_get_contents($verifyUrl . '?secret=' . $secret . '&response=' . $token);
$result = json_decode($response, true);
return isset($result['success'], $result['score'], $result['action']) &&
$result['success'] === true &&
$result['score'] >= 0.5 &&
$result['action'] === 'search';
}
}