2017-04-05 6 views
4

私は2つの目に見えないrecaptcha divを追加しましたが、inspect要素のコードを見たときに、1つのページには目に見えないrecaptchaが1つしか追加されませんでした。 私のコードは次のとおりです。複数の目に見えないrecaptchaを1ページに追加するには?

<div id="captcha1" class="g-recaptcha" 
     data-sitekey="your_site_key" 
     data-callback="onSubmit" 
     data-size="invisible"></div> 
<div id="captcha2" class="g-recaptcha" 
     data-sitekey="your_site_key" 
     data-callback="onSubmit" 
    ></div> 

Programmatically invoke recaptcha

からの参照を取得します、あなたは私が私が間違って何をやって助けることができますか?

答えて

2

あなたが明示的にそれぞれの上にレンダリングを行う必要があり、ボタン

<form> 
    <button id="captcha1" class="g-recaptcha invisible-recaptcha">submit form 1</button> 
</form> 

<form> 
    <button id="captcha2" class="g-recaptcha invisible-recaptcha">submit form 2</button> 
</form> 

<script> 
    function verifyCaptcha(token){ 
     console.log('success!'); 
    }; 

    var onloadCallback = function() { 
     $(".invisible-recaptcha").each(function() { 
      grecaptcha.render($(this).attr('id'), { 
       'sitekey' : $key, 
       'callback' : verifyCaptcha 
      }); 
     }); 
    }; 
</script> 

<script src='https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit' async defer></script> 
+0

Invisible recapchaにはOnLoadとRenderの利用可能なパラメータがないため、実際のサンプルではありません。 – Shmalex

+1

@Shmalex確かにそうです。 –

2

は同じ問題を抱えていた提出します。困惑した後、私はそれを働かせました。

アレッサンドロが提供したアイデアを使用して、自動的にフォームが自動的に提出されるようにしました。

<script type="text/javascript"> 
    var onloadCallback = function() { 
     $(".g-recaptcha").each(function() { 
      var el = $(this); 
      grecaptcha.render($(el).attr("id"), { 
       "sitekey" : SITE_KEY, 
       "callback" : function(token) { 
        $(el).parent().find(".g-recaptcha-response").val(token); 
        $(el).parent().submit(); 
       } 
      }); 
     }); 
    }; 
</script> 

<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script> 
5

ピーターとアレッサンドロにとってより信頼できる解決方法は、要素を入れ子にするときです。

<script> 
$(".g-recaptcha").each(function() { 
    var object = $(this); 
    grecaptcha.render(object.attr("id"), { 
     "sitekey" : "6LdwRC0UAAAAAK0hjA8O4y1tViGPk9ypXEH_LU22", 
     "callback" : function(token) { 
      object.parents('form').find(".g-recaptcha-response").val(token); 
      object.parents('form').submit(); 
     } 
    }); 
}); 
</script> 

<form> 
    <input type="text" name="example"/> 
    <button id="captcha1" class="g-recaptcha">submit form 1</button> 
</form> 

<form> 
    <input type="text" name="example"/> 
    <button id="captcha2" class="g-recaptcha">submit form 2</button> 
</form> 

<script src='https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit' async defer></script> 
+1

reCAPTCHA api.js URLのonload = onloadCallbackと一致するように、最初のスクリプトを関数onloadCallback(){...}でラップする必要はありませんか?私はそれをしなければならなくなった。それ以外は、これは美しく働いた。ありがとう! – Bemisawa

0

単一ページを動的に

Githubのコード上の複数の見えないreCAPTCHAのV2: https://github.com/prathameshsawant7/multiple-invisible-recaptcha

ステップ1>

ページに2のJSライブラリの下に追加します。

<!-- 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> 

ステップ2>

は、それぞれの形でのdivの下に追加します。

<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--> 

ステップ3>

init_recaptcha.js

  • 作成ステップ1 - reCAPTCHAのサイトキーとウィジェットを初期化する例:フォーム1
  • ステップ2のためのwidget_1 - でinit関数は、フォーム提出コールバックアクションを作成するコードを追加します。
  • ステップ3 - reCaptcha IDとcreateCallbackFn Responseを渡して、renderInvisibleReCaptcha関数を呼び出します。

    "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(); 
    }); 
    

ステップ4>フォーム検証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; 
     } 
    } 
} 

ステップ5> 検証reCAPTCHAのサーバー側から -

<?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; 
?> 

ステップ6> は、サーバーのコールの後にウィジェットをリセット -

// 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; 
      } 
     } 
    }); 
} 
0

あなたは目に見えないreCAPTCHAのを使用することができます。あなたのボタンで、 "formname = 'rcaptchaformname'"のようなタグを使用して、どのフォームを送信するかを指定し、送信フォーム入力を非表示にします。

これにより、html5フォームの検証はそのままで、1つのrecaptchaではなく複数のボタンインターフェイスを維持できます。 recaptchaによって生成されたトークンキーの "captcha"入力値をキャプチャするだけです。

<script src="https://www.google.com/recaptcha/api.js" async defer ></script> 

<div class="g-recaptcha" data-sitekey="yours" data-callback="onSubmit" data-size="invisible"></div> 
<script> 

$('button').on('click', function() { formname = '#'+$(this).attr('formname'); 
    if ($(formname)[0].checkValidity() == true) { grecaptcha.execute(); } 
    else { $(formname).find('input[type="submit"]').click() } 
    }); 

var onSubmit = function(token) { 
    $(formname).append("<input type='hidden' name='captcha' value='"+token+"' />"); 
    $(formname).find('input[type="submit"]').click() 
    }; 
</script> 
関連する問題