<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Invisible reCaptcha in Liferay webforms 7.2</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=118102282" />
  <subtitle>Invisible reCaptcha in Liferay webforms 7.2</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=118102282</id>
  <updated>2026-04-05T16:19:00Z</updated>
  <dc:date>2026-04-05T16:19:00Z</dc:date>
  <entry>
    <title>RE: Invisible reCaptcha in Liferay webforms 7.2</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118636624" />
    <author>
      <name>Shubhankit Roy</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118636624</id>
    <updated>2020-03-03T06:26:29Z</updated>
    <published>2020-03-03T06:26:29Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Hi Shruti&lt;br&gt;Here is a snippet from what I implemented in order to make invisible recaptcha working:&lt;br&gt;&lt;pre&gt;&lt;code&gt;
&amp;lt;c:if test="&amp;lt;%= captchaEnabled %&amp;gt;"&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;script src="&amp;lt;%= PropsValues.CAPTCHA_ENGINE_RECAPTCHA_URL_SCRIPT %&amp;gt;?hl=&amp;lt;%= locale.getLanguage() %&amp;gt;&amp;amp;amp;onload=&amp;lt;portlet:namespace /&amp;gt;onloadCallback&amp;amp;amp;render=explicit" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/c:if&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;div class="g-recaptcha" id="&amp;lt;portlet:namespace /&amp;gt;recaptcha"&amp;gt;&amp;lt;/div&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&lt;/code&gt;&lt;noscript&gt;&lt;code&gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;div style="height: 525px; width: 302px;"&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;div style="height: 525px; position: relative; width: 302px;"&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;div style="height: 525px; position: absolute; width: 302px;"&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;iframe frameborder="0" scrolling="no" src="&amp;lt;%= PropsValues.CAPTCHA_ENGINE_RECAPTCHA_URL_NOSCRIPT %&amp;gt;&amp;lt;%= PrefsPropsUtil.getString(PropsKeys.CAPTCHA_ENGINE_RECAPTCHA_KEY_PUBLIC, PropsValues.CAPTCHA_ENGINE_RECAPTCHA_KEY_PUBLIC) %&amp;gt;" style="border-style: none; height: 525px; width: 302px;"&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/noscript&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;div style="background: #F9F9F9; border-radius: 3px; border: 1px solid #C1C1C1; bottom: 25px; height: 60px; left: 0; margin: 0; padding: 0; position: absolute; right: 25px; width: 300px;"&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;textarea class="g-recaptcha-response" id="g-recaptcha-response" name="g-recaptcha-response" style="border: 1px solid #C1C1C1; height: 40px; margin: 10px 25px; padding: 0; resize: none; width: 250px;"&amp;gt;&amp;lt;/textarea&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;/div&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;lt;aui:script&amp;gt;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;var &amp;lt;portlet:namespace /&amp;gt;onloadCallback = function() {
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;var delay = 0;&amp;lt;/aui:script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;if (Liferay.Browser.isIe()) {
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;delay = 3000;
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;}&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;setTimeout(
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;function() {
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;grecaptcha.render(
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;'&amp;lt;portlet:namespace /&amp;gt;recaptcha',
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;{
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;'sitekey' : '&amp;amp;lt;%= HtmlUtil.escapeJS(PrefsPropsUtil.getString(PropsKeys.CAPTCHA_ENGINE_RECAPTCHA_KEY_PUBLIC, PropsValues.CAPTCHA_ENGINE_RECAPTCHA_KEY_PUBLIC)) %&amp;amp;gt;'
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;}
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;);
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;},
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;delay
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;);
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;};
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;
&lt;/code&gt;&lt;/pre&gt;&lt;br&gt;If you have a callback function, the &lt;pre&gt;&lt;code&gt;g-recaptcha-response&lt;/code&gt;&lt;/pre&gt; token is passed to your callback  when the user submits a successful response. Can you check if you are missing this in your fragement's jsp?&lt;br&gt;Also, note that things might have changed a bit in liferay 7.2 and some additional changes might be needed as well. Unfortunately I have not checked things with 7.2 till now.&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>Shubhankit Roy</dc:creator>
    <dc:date>2020-03-03T06:26:29Z</dc:date>
  </entry>
  <entry>
    <title>Invisible reCaptcha in Liferay webforms 7.2</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118102281" />
    <author>
      <name>Shruti Mishra</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118102281</id>
    <updated>2019-12-17T12:39:43Z</updated>
    <published>2019-12-17T12:39:43Z</published>
    <summary type="html">Hi,&lt;br /&gt;Liferay version 7.2.0 GA1&lt;br /&gt;I am trying to implement Invisible reCaptcha in Liferay web forms.&lt;br /&gt;Found     h&lt;a href="https://liferay.dev/forums/-/message_boards/message/111175055"&gt;ttps://liferay.dev/forums/-/message_boards/message/111175055 &lt;/a&gt;    this post on forum.&lt;br /&gt;I have created a module fragment to override recaptcha.jsp and added data-size invisible&lt;br /&gt;&lt;br /&gt;    &amp;lt;div id=&amp;#39;recaptcha&amp;#39; class=&amp;#34;g-recaptcha&amp;#34; &lt;br /&gt;	 data-sitekey=&amp;#34;&amp;lt;%= HtmlUtil.escapeAttribute(captchaConfiguration.reCaptchaPublicKey()) %&amp;gt;&amp;#34;&lt;br /&gt;	 data-callback=&amp;#34;_onSubmitForm&amp;#34;&lt;br /&gt;	 data-size=&amp;#34;invisible&amp;#34;&lt;br /&gt;	 &amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, Override form.jsp of &amp;#39;dynamic data mapping form renderer&amp;#39; to make a call to grecaptcha.execute() &lt;br /&gt;&lt;br /&gt;    instance.validate(&lt;br /&gt;							function(hasErrors) {&lt;br /&gt;								if (!hasErrors) {&lt;br /&gt;									var formNode = instance.getFormNode();&lt;br /&gt;&lt;br /&gt;									var currentPageInput = formNode.one(&amp;#39;#&amp;#39; + instance.get(&amp;#39;portletNamespace&amp;#39;) + &amp;#39;currentPage&amp;#39;);&lt;br /&gt;&lt;br /&gt;									if (currentPageInput) {&lt;br /&gt;										currentPageInput.set(&amp;#39;value&amp;#39;, instance.getCurrentPage());&lt;br /&gt;									}&lt;br /&gt;&lt;br /&gt;									instance.showLoadingFeedback();&lt;br /&gt;									&lt;br /&gt;									Liferay.fire(&lt;br /&gt;										&amp;#39;ddmFormSubmit&amp;#39;,&lt;br /&gt;										{&lt;br /&gt;											formId: instance.getFormId()&lt;br /&gt;										}&lt;br /&gt;									);&lt;br /&gt;									&lt;br /&gt;									Liferay.Util.submitForm(formNode);&lt;br /&gt;								}else{&lt;br /&gt;									grecaptcha.execute();&lt;br /&gt;								}&lt;br /&gt;							}&lt;br /&gt;						);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Now, when I am trying to submit the form, on Page its giving &amp;#34;Text Verification Failed&amp;#34; error. and on Logs I get &lt;br /&gt;&lt;br /&gt;    ERROR [http-nio-8080-exec-28][ReCaptchaImpl:121] CAPTCHA text is null. User null may be trying to circumvent the CAPTCHA.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When I checked ReCaptchaImpl.java , it searches for field &amp;#34;g-recaptcha-response&amp;#34;&lt;br /&gt;&lt;br /&gt;    String reCaptchaResponse = ParamUtil.getString(&lt;br /&gt;			httpServletRequest, &amp;#34;g-recaptcha-response&amp;#34;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Is there something that needs to be added to make sure Invisible reCaptcha works smooth?&lt;br /&gt;Any Suggestions Please.&lt;br /&gt;&lt;br /&gt;Thank You.</summary>
    <dc:creator>Shruti Mishra</dc:creator>
    <dc:date>2019-12-17T12:39:43Z</dc:date>
  </entry>
</feed>
