【问题标题】:Sending reCaptcha token to PHP using Ajax使用 Ajax 将 reCaptcha 令牌发送到 PHP
【发布时间】:2019-06-20 19:27:43
【问题描述】:

我想将 reCaptcha V3 添加到表单中。

这是表格:

<form action="mail.php" method="POST">
    <!-- This hidden input will contain the token -->
    <input type="hidden" name="token" id="token" />
    <input type="text" name="name" />
    <input type="text" name="email" />
    <textarea name="message"></textarea>
    <input type="submit" name="submit" value="Send" />
</form>

现在我正在尝试将token 值发送到mail.php,所以有一个名为jquery.form 的插件我用它来发送Ajax 请求。

这里是 Javascript/Jquery 代码:

$('form').ajaxForm({

    beforeSubmit: function() {

        //Captcha part
        grecaptcha.ready(function() {

                grecaptcha.execute('My_website_key', {action: 'form'}).then(function(token) {

                    //Set token value to the hidden element
                    $('#token').val(token);

                });

        });//reCaptcha ready    

    },//Before submit function
    success: function(msg) {

        if(msg == 'Message has been sent.'){
            console.log('success!');
        }else{
            console.log(msg);
        }

    },//success function
    complete: function(xhr) {

        console.log(xhr.responseText);  

    }//complete function

});//End Ajax

当我提交表单时,然后我查看控制台,我看到token 为空,并且似乎执行了success 函数,在token 隐藏元素获取令牌之前。

在页面加载或任何其他操作时我无法添加令牌,因为它会在 2 分钟后过期,所以我需要获取一个令牌并将其发送到 PHP 文件。

【问题讨论】:

  • 1.为验证码创建创建一个新的单独函数。 2.提交前执行。 3. 检查是否 $('#token').val();不为空,则提交

标签: javascript php jquery ajax recaptcha


【解决方案1】:

您需要在 recaptcha 处理程序中移动您的 ajax 请求,因为 beforeAjax 不会等待其内容被解析,请按如下方式更改您的代码:

// Fake grecaptcha method !!! you should delete this
// Form URL was changed as well to satisfy the example
let grecaptcha = {
  ready: function(cb) {
    cb();
  },
  execute: function(key, options) {
    return Promise.resolve('recaptchatoken');
  }
};

let formElem = $('form');

formElem.submit(function(e) {
  e.preventDefault();

  let thisForm = $(this);

  grecaptcha.ready(function() {
    grecaptcha.execute('My_website_key', {
      action: 'form'
    }).then(function(token) {

      $('#token').val(token);

      thisForm.ajaxSubmit({
        success: function(msg) {

          if (msg == 'Message has been sent.') {
            console.log('success!');
          } else {
            console.log(msg);
          }

        },
        complete: function(xhr) {

          console.log(xhr.responseText);

        }

      });


    });

  });

  return false; // false = prevent submit 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://malsup.github.io/min/jquery.form.min.js"></script>
<form action="//reqres.in/api/users" method="POST">
  <!-- This hidden input will contain the token -->
  <input type="hidden" name="token" id="token" />
  <input type="text" name="name" />
  <input type="text" name="email" />
  <textarea name="message"></textarea>
  <input type="submit" name="submit" value="Send" />
</form>

【讨论】:

  • 我认为在这种情况下表单将被提交,当recaptcha准备好时,不是当用户点击提交时,对吧?
  • 不应该,因为ajaxForm 是由点击处理程序触发的,但如果结果不是这样,请告诉我。
  • 正如我提到的,令牌会在 2 分钟后过期,所以如果我在填写表格时等待超过 2 分钟,它将不起作用
  • 我需要在提交时获得新的
  • 我已经更新了我的代码。提交时,我们会阻止浏览器实际提交表单,然后我们加载recaptcha,它将设置令牌,然后我们准备表单(ajaxForm),然后执行ajaxSubmit提交表单。
猜你喜欢
  • 2020-10-31
  • 2012-06-12
  • 2023-01-27
  • 2019-01-06
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2015-03-26
相关资源
最近更新 更多