如何使用带有 Recaptcha 的 AJAX 发送表单? [拉拉维尔]

Posted

技术标签:

【中文标题】如何使用带有 Recaptcha 的 AJAX 发送表单? [拉拉维尔]【英文标题】:How to Send form using AJAX with Recaptcha? [Laravel] 【发布时间】:2021-12-14 13:24:42 【问题描述】:

如何使用 AJAX 和 recaptcha 发送我的表单?我目前正在使用来自 anhskohbo/no-captcha 的包。

SignupController.php

  public function customRegister(Request $request) 

    $validator = Validator::make($request->all(), [
        'name' => ['required', 'max:52'],
        'phone_number' => ['required', 'unique:users', 'min:11', 'max:11'],
        'password' => ['required', 'confirmed', 
        Password::min(8)
        ->mixedCase()
        ->symbols()
        ->numbers()
        ],
        'g-recaptcha-response' => ['required', 'captcha'],
    ]);

    if(!$validator->passes()) 
        return response()->json(['status' => 0, 'error'=> $validator->errors()->toArray()]);
     else 

        User::create([
        'name' => $request->input('name'),
        'phone_number' => $request->input('phone_number'),
        'password' => Hash::make($request->input('password')),
        'is_verified' => 0,

        ]);

Form.blade

        <form action="/register" id="registerForm" method="POST">
        @csrf
        ... form inputs here
<div class="form-group fxt-transformY-50 fxt-transition-delay-5">
                                    <div class=" $errors->has('g-recaptcha-response') ? ' has-error' : ''  recaptcha-div">
                                        !! NoCaptcha::display() !!
                                        <span class="text-danger error-text g-recaptcha-response_error"></span>
                                    </div>                        
                                </div>
        </form>

我的 Ajax 函数

    $(function()
              
    $("#registerForm").on('submit', function(e)       
        e.preventDefault(); 
        var token = grecaptcha.getResponse();
        $.ajax(
            url:$(this).attr('action'),
            method:$(this).attr('method'),
            data: new FormData(this),
            processData:false,
            dataType:'json',
            contentType:false,
            beforeSend:function()
                $(document).find('span.error-text').text('');
                FormData.append('recaptcha', token);
            ,
            success:function(data)
                if(data.status == 0)                            
                    $.each(data.error, function(prefix, val)
                        $('span.'+prefix+'_error').text(val[0]);
                    );
                else
                    $('#registerForm')[0].reset();
                    alert(data.msg);
                
            
        );
    );
);

我总是收到以下错误“需要验证码”。似乎 formData 没有得到 recaptcha 值。谁能给我建议?谢谢!

【问题讨论】:

你用什么来展示你的recaptcha 你好@bhucho 我正在使用 Anshkobo/no-captcha 包。我更新了上面的代码。非常感谢 为什么要通过ajax发送,不显示recaptcha? 如果你实际上是通过 js 提交表单,那为什么不直接使用 google recaptcha 库,那么不需要后端包 【参考方案1】:

它对我有什么作用

形式

<div class="g-recaptcha" data-sitekey="config('services.recaptcha.key')"></div>

脚本回顾

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

Ajax 函数

$("#registerForm").on('submit', function(e)       
    e.preventDefault(); 
    var gtoken = grecaptcha.getResponse();
    $.ajax(
        ...
        data: 
                g_recaptcha_response: gtoken,
            ,

在验证请求中

'g_recaptcha_response' => 'required|recaptcha'

【讨论】:

以上是关于如何使用带有 Recaptcha 的 AJAX 发送表单? [拉拉维尔]的主要内容,如果未能解决你的问题,请参考以下文章

如何修复谷歌不可见 reCAPTCHA 验证后未提交的 Ajax 表单

如何使用 Selenium 和 Python 绕过带有 buster 扩展的 ReCaptcha

PHP jQuery:使用AJAX验证Recaptcha'

jQuery:使用AJAX验证Recaptcha'

php 使用AJAX将google recaptcha添加到我们的表单中

ReCaptcha 在 iPhone 上无法正常工作