3

キャプチャ v3 を ajax に送信するときに問題が発生するという問題があります。Google から null の応答が返ってきました。複数のチュートリアルを試しましたが、ajax リクエストには対応していないと思います。

問題は、Google または私の php、または ajax リクエストにあると思います。コードは理解できますが、このキャプチャ v3 のような Google のコードの使用には慣れていません。以前に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 を使用するのはこれが初めてであり、captcha 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 を使用しています。このパブリック関数は連絡先コントローラーにあります。

4

0 に答える 0