невидимая рекапча - вызов не появляется - PullRequest
0 голосов
/ 26 октября 2018

Реализация невидимого reCAPTCHA в наших динамически генерируемых формах.Наш механизм from получает список полей из базы данных и динамически заполняет DOM полями формы, отображает его и обрабатывает сообщение.Чтобы использовать Invisible reCAPTCHA:

Я загружаю API-код Google, когда моя страница завершает загрузку:

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

Когда моя форма загружается из БД, я добавляю div recaptchaв мой список полей:

form.fields.push( { html: '<div id="g-recaptcha-div" class="g-recaptcha" data-sitekey="<my site key>" data-badge="inline" data-size="invisible"></div>',
                    type: 'html'
                  } );

Позже я добавляю форму в DOM (jQuery 'appendTo'), и сразу после этого я отображаю reCAPTCHA:

recaptcha_id = grecaptcha.render("g-recaptcha-div", 
                   { 
                     'data-callback': _settings.form.submit,
                     'sitekey'      : <my site key>
                   }, true 
                 );

и форма появляется с значком reCAPTCHA / защищенным значком.Глядя на инспектора DOM, я могу увидеть DIV recaptcha с текстовой областью g-recaptcha-response, но она невидима.Как и следовало ожидать.

Затем в моей функции отправки после выполнения некоторой проверки формы я выполняю recaptcha:

grecaptcha.execute(recaptcha_id);

В этот момент я ожидаю, что вызов всплывет.,Но это не так.Ну, это было один раз.И моя форма отправляется в мой PHP-бэкэнд, где есть параметр для g-recaptcha-response, но он пуст.Однажды, когда появился вызов, в g-recaptcha-response было значение.

Всегда ли вызов должен появляться при вызове функции execute?Если нет, то как мы должны обрабатывать пустое значение ответа?

спасибо, Энди

1 Ответ

0 голосов
/ 29 октября 2018

Хорошо, для тех, кто следует дома:

1) да, вы можете указать имя функции обратного вызова в вызове grecaptcha.render.Глядя глубже, я заметил на этой странице (https://developers.google.com/recaptcha/docs/invisible#js_api), что мне нужно было указать имя функции следующим образом:

recaptcha_id = grecaptcha.render("g-recaptcha-div", 
                                  { 
                                    'sitekey'  : <my site key>,
                                    'callback' : <callback>
                                  }, true 
                                );

Я пытался использовать «обратный вызов данных», которыйкак указать его в HTML. Дох! И чтобы ответить на мой другой вопрос, как только вы сделаете это правильно, обратный вызов вызывается с токеном независимо от того, визуализируется ли вызов.

...