首页 文章

Invisible recaptcha以编程方式调用挑战grecaptcha.getResponse()在页面刷新时始终为空

提问于
浏览
2

我在我的jsp页面中呈现google recaptcha小部件,并在提交表单时以编程方式调用我的java脚本中的挑战 .

<script type="text/javascript" id="recaptcha-response">    
     var siteKey = $('#recaptchasitekey').first().text();     
         var onloadCallback = function() {          
            grecaptcha.render('recaptcha_element', {
              'sitekey' : siteKey,
              'callback' : correctCaptcha,
              'data-bind' : "qoActionTemplate"
            },true);            
          };
         var correctCaptcha = function(response) {           
            return response;
         };

    </script>   
      <div class="g-recaptcha" id="recaptcha_element" data-size="invisible" ></div>     
       <script src="http://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>       
   <script type="text/template" id="recaptchaUrl">

这是我调用挑战的java脚本代码 .

executeRecaptcha : function() {
            grecaptcha.execute();
            captcha.token = grecaptcha.getResponse();
            if (captcha.token == null || captcha.token == '') {
                grecaptcha.reset();
                grecaptcha.execute();
            }
            return captcha.token;
        },

    validateRecaptcha : function(response,checkToken) {
            captcha.executeRecaptcha();
            if (captcha.token) {
                var captchaUrl = $('#recaptchaUrl').first().text();
                captcha.userSIDVerify = $('#captcha_token').val();
                $.ajax({
                    type : 'POST',          
                    url : captchaUrl,
                    data : {
                        response : captcha.token
                    },
                    success : captcha.checkToken,
                    error : function() {
                        alert("failed")
                        return;
                    }
                });
            }
        }

我的 grecaptcha.getResponse() 在我的第一次表单提交时总是空的,然后我第二次提交我收到回复 .

1 回答

  • 1

    我'm not 100% sure but I think this is because you'在 grecaptcha.execute() 之后直接以同步的方式调用 grecaptcha.getResponse() ,这不是使用不可见的reCaptcha的预期方式 . grecaptcha.execute() 需要时间工作(我假设)并且设计为异步返回到 data-callback 方法 . 完成后,您可以随时使用 grecaptcha.getResponse() (在调用 grecaptcha.reset() 之前)获取响应令牌 . 我认为这是 grecaptcha.getResponse() 背后的想法 . 我'm assuming it works the second time because it'有时间处理看不见的reCaptcha . 我认为 grecaptcha.getResponse() 也更适合常规的reCaptcha而不是隐形 . 因为普通的reCaptcha得到"completed"的用户,其中隐形reCaptcha是"completed"在表单提交,因此需要回调让我们知道它已经完成 .

相关问题