Dynamically
Handle Multiple Invisible reCaptcha V2 on Single Page
>
Github Code:
[https://github.com/prathameshsawant7/multiple-invisible-recaptcha]
>
Live Example:
[http://prathameshsawant.com/multiple-invisible-recaptcha/]
Step
1>
Add below 2 Js library on page
<!--
reCaptcha Library -->
<script
type="text/javascript"
src="https://www.google.com/recaptcha/api.js?render=explicit"></script>
<!--
Customized Init for invisible reCaptcha -->
<script
src="js/init_recaptcha.js"
async
defer></script>
Step
2>
Add below div's in respective forms.
<div
id="recaptcha-form-1"
style="display:none;"></div>
<!--for
Form 1-->
<div
id="recaptcha-form-2"
style="display:none;"></div>
<!--for
Form 2-->
<div
id="recaptcha-form-3"
style="display:none;"></div>
<!--for
Form 3-->
Step
3>
Create init_recaptcha.js
* Step 1 -
Initialize reCaptcha Site Key and Widget eg: widget_1 for Form 1
*
Step 2 - In init function add code to create form submit callback
action.
* Step 3 - Call renderInvisibleReCaptcha function by
passing reCaptcha ID and createCallbackFn Response.
"use
strict";
var
PS =
PS ||
{};
var
widget_1;var
widget_2;var
widget_3;
var
recaptcha_site_key =
'RECAPTCHA_SITE_KEY';
if(
typeof
PS.RECAPTCHA
===
'undefined'
)
{
(function
(a,
$)
{
var
retryTime =
300;
var
x =
{
init:
function(){
if(typeof
grecaptcha !=
'undefined'){
//For
Form 1 Initialization
if($('#form1
#recaptcha-form-1').length
>
0){
var
callbackFn =
{
action :
function(){
saveData('1');
//Here
Callback Function
}
}
/*---
'recaptcha-form-1' - reCaptcha div ID | 'form1' - Form ID ---*/
widget_1 =
x.renderInvisibleReCaptcha('recaptcha-form-1',x.createCallbackFn(widget_1,'form1',callbackFn));
}
//For
Form 2 Initialization
if($('#form2
#recaptcha-form-2').length
>
0){
var
callbackFn =
{
action :
function(){
saveData('2');
//Here
Callback Function
}
}
/*---
'recaptcha-form-2' - reCaptcha div ID | 'form2' - Form ID ---*/
widget_2 =
x.renderInvisibleReCaptcha('recaptcha-form-2',x.createCallbackFn(widget_2,'form2',callbackFn));
}
//For
Form 3 Initialization
if($('#form3
#recaptcha-form-3').length
>
0){
var
callbackFn =
{
action :
function(){
saveData('3');
//Here
Callback Function
}
}
/*---
'recaptcha-form-3' - reCaptcha div ID | 'form3' - Form ID ---*/
widget_3 =
x.renderInvisibleReCaptcha('recaptcha-form-3',x.createCallbackFn(widget_3,'form3',callbackFn));
}
}else{
setTimeout(function(){
x.init();}
,
retryTime);
}
},
renderInvisibleReCaptcha:
function(recaptchaID,callbackFunction){
return
grecaptcha.render(recaptchaID,
{
'sitekey'
:
recaptcha_site_key,
"theme"
:
"light",
'size'
:
'invisible',
'badge'
:
'inline',
'callback'
:
callbackFunction
});
},
createCallbackFn:
function
(widget,formID,callbackFn)
{
return
function(token)
{
$('#'+formID+'
.g-recaptcha-response').val(token);
if($.trim(token)
==
''){
grecaptcha.reset(widget);
}else{
callbackFn.action();
}
}
}
}
a.RECAPTCHA
=
x;
})(
PS,
$ );
}
$(window).load(function(){
PS.RECAPTCHA.init();
});
Step
4>
Changes in Form Validation JS -
/*
Execute respective Widget on form submit after form Validations */
function
formSubmit(form){
var
text =
$.trim($('#text'+form).val());
if(text
!=
''){
switch(form){
case
'1'
:
grecaptcha.execute(widget_1);
break;
case
'2'
:
grecaptcha.execute(widget_2);
break;
case
'3'
:
grecaptcha.execute(widget_3);
break;
}
}
}
Step
5>
Validate reCaptcha from Server Side -
<?php
define('RECAPTCHA_SECRET_KEY','KEY');
/**
* @Desc: To Validate invisible
recaptcha from server-side
* @Param:
g-recaptcha-response value
* @Return: True/False
**/
if(!function_exists('check_recaptcha')){
function
check_recaptcha($recaptcha_response){
$test =
array ('secret'
=>
RECAPTCHA_SECRET_KEY,'remoteip'
=>
$_SERVER["REMOTE_ADDR"],'response'
=>
$recaptcha_response);
foreach
($test
as
$key =>
$value)
{
$req
.=
$key .
'='
.
urlencode(stripslashes($value))
.
'&';
}
$req=substr($req,
0,
strlen($req)-1);
$path =
'https://www.google.com/recaptcha/api/siteverify?';
$response =
file_get_contents($path
.
$req);
$responseData =
json_decode($response);
if($responseData->success){
return
true;
}else{
return
false;
}
}
}
//
Validate reCaptcha
if
(isset($_SERVER['REQUEST_METHOD'])
&&
$_SERVER['REQUEST_METHOD']
==
"POST"
&&
!empty($_POST))
{
$checkCapcha =
false;
$recaptcha
=
$_POST['g-recaptcha-response'];
$checkCapcha =
check_recaptcha($recaptcha);
if($checkCapcha){
echo $_POST['textmsg'];
exit;
/**
Perform Actions Here (Add,Update,Delete etc)
**/
}
else{
echo “reCaptcha
Error”;
}
}
echo "failed";exit;
?>
Step
6>
Reset Widget after Server Call -
//
saveData will be automatically get called on grecaptacha.execute
function
saveData(form){
$.ajax(
{
type:
'POST',
url:
$("#form"+form).attr(
'action'
),
data:
$("#form"+form).serialize(),
success:
function(
response )
{
switch(form){
case
'1'
:
grecaptcha.reset(widget_1);
break;
case
'2'
:
grecaptcha.reset(widget_2);
break;
case
'3'
:
grecaptcha.reset(widget_3);
break;
}
}
}
);
}