首页 文章

如何在单页中添加多个不可见的recaptcha?

提问于
浏览
7

我添加了两个不可见的recaptcha div,但是当我在inspect元素中看到代码时,我的单页中只添加了一个不可见的recaptcha . 我的代码是:

<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获取参考

你能帮我解决我做错的事吗?

5 回答

  • 9

    下面是一个更可靠的解决方案,彼得和亚历山德罗在嵌套元素时回答 .

    <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

    有同样的问题 . 经过一番困惑,我得到了它的工作 .

    使用了亚历山德罗提供的想法,并使其成功地自动提交表格 .

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

    Multiple Invisible reCaptcha V2 on Single Page Dynamically

    Github代码:https://github.com/prathameshsawant7/multiple-invisible-recaptcha

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

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

    Step 3>

    创建 init_recaptcha.js

    • 步骤1 - 初始化reCaptcha站点密钥和窗口小部件,例如:窗体1的widget_1

    • 步骤2 - 在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();
    });
    

    Step 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;
            }
        }
    }
    

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

    Step 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;
                }
            }
        } );
    }
    
  • 3

    你可以使用隐形的recaptcha . 在您的按钮上使用“formname ='rcaptchaformname'”之类的标记来指定要提交的表单并隐藏提交表单输入 .

    这允许您保持html5表单验证完整,一个重新签名,但多个按钮接口 . 只需捕获recaptcha生成的令牌密钥的“验证码”输入值 .

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

相关问题