Получение нулевого ответа на Recaptcha V3 с помощью ajax - PullRequest
3 голосов
/ 22 мая 2019

У меня проблема с получением проблемы при отправке капчи v3 в ajax.Я получаю нулевой ответ в Google.Я пробовал несколько учебных пособий, но я думаю, что это не исправляет запрос ajax.

Я думаю, что проблема с Google, или мой php, или запрос ajax.Я понимаю свои коды, но я не знаком с использованием кода Google, как эта капча v3.Я использовал Captcha V2 раньше.И теперь я пытаюсь v3, я не могу запустить его с моим кодом.

Вот мой код Ajax и HTML:

// when form is submit
    $('.contact-form').submit(function (event) {
        // we stoped it
        event.preventDefault();
        var url = $(this).prop('action');
        var contact_data = $(this).serialize();
        $('.btn-contact').html('<em class="fas fa-spinner fa-pulse"></em> Sending...');
        $('.alert').fadeOut('slow');
        // needs for recaptacha ready
        grecaptcha.ready(function () {
            // do request for recaptcha token
            // response is promise with passed token
            grecaptcha.execute('6Ldjp6Q[--my site key---]8H5bxI1', { action: 'create_contact' }).then(function (token) {
                // add token to form
                $('.contact-form').prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
                var contact = function () {
                    $.ajax({
                        type: 'POST',
                        url: url,
                        dataType: 'json',
                        data: contact_data, token: token ,
                        success: function (response) {
                            $('.message').html(response.message);
                            $('.btn-contact').html('<em class="fas fa-paper-plane"></em> Send');
                            if (response.error) {
                                $('.status').removeClass('alert-success').addClass('alert-danger').show();
                            }
                            else {
                                $('.status').removeClass('alert-danger').addClass('alert-success').show();
                                $('.contact-form')[0].reset();
                            }
                        }
                    });
                };
                setTimeout(contact, 3000);
            });;
        });
    });
<?=form_open('Contact/Send_Contact', array('class' => 'contact-form'))?>
            <div class="row top-2">
                <div class="col-md-12">
                    <div class="status alert text-center" style="display:none;">
                        <button type="button" class="close clearMsg"><span aria-hidden="true">&times;</span></button>
                        <span class="message"></span>
                    </div>
                </div>
                <div class="form-group col-md-6">
                    <input type="text" placeholder="Your Name" name="name" class="form-control name">
                    <div class="invalid-feedback invalid-name"></div>
                </div>
                <div class="form-group col-md-6">
                    <input type="email" placeholder="Your Email" name="email" class="form-control email">
                    <div class="invalid-feedback invalid-email"></div>
                </div>
                <div class="form-group col-md-12">
                    <input type="text" placeholder="Subject" name="subject" class="form-control subject">
                    <div class="invalid-feedback invalid-subject"></div>
                </div>
                <div class="form-group col-md-12">
                    <textarea placeholder="Message" class="form-control message_text" name="message" rows="4"></textarea>
                    <div class="invalid-feedback invalid-message"></div>
                </div>
                <div class="col-md-12">
                    <button type="submit" class="btn btn-info btn-contact float-right"><em class="fas fa-paper-plane"></em> Send</button>
                </div>
            </div>
            </from>
<script src="https://www.google.com/recaptcha/api.js?render=6Ldj[--My site key--]5bxI1"></script>

И я также скопировал некоторый код PHP, и я не знаю, в чем здесь проблема, потому что я впервые использую CodeIgniter, и у меня тоже нетиспользовал капчу v3 тоже.Пожалуйста, просмотрите мой код PHP здесь:

public function Send_Contact() {
        $output['error'] = true;
        $output['message'] = 'Please fill up the error field(s).';

        $name = $this->input->post('name');
        $email = $this->input->post('email');
        $subject = $this->input->post('subject');
        $message = $this->input->post('message');
        $captcha = $this->input->post('token');

        $this->form_validation->set_rules('name', 'Name', 'required');
        $this->form_validation->set_rules('email', 'Email', 'required');
        $this->form_validation->set_rules('subject', 'Subject', 'required');
        $this->form_validation->set_rules('message', 'Message', 'required');

        if($this->form_validation->run() === false) {
            //some codes here I remove because it has nothing to do with the question.
            die(json_encode($output));
        }

        if(!$captcha){
            $output['message'] = "Invalid catpcha";
            die(json_encode($output));
        }

        $secretKey = "6Ldjp[--My secret key--]YQL_";
        $ip = $_SERVER['REMOTE_ADDR'];

        // post request to server
        $url = 'https://www.google.com/recaptcha/api/siteverify';
        $data = array('secret' => $secretKey, 'response' => $captcha);

        $options = array(
            'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data)
            )
        );

        $context  = stream_context_create($options);
        $response = file_get_contents($url, false, $context);
        $responseKeys = json_decode($response,true);

        if($responseKeys["success"]) {
            if($this->contact_model->create_contact()) {
                $output['error'] = false;
                $output['message'] = 'Thank you for sending message! <em class="far fa-check-circle"></em>';
                echo json_encode($output);
            } else {
                $output['error'] = true;
                $output['message'] = 'Error in database model.';
                echo json_encode($output);
            }
        } else {
            $output['message'] = "Invalid catpcha";
            die(json_encode($output));
        }
    }

Я использую codeigniter 3. и эта общедоступная функция находится в контроллере контактов.

...