Google reCaptcha:无法及时验证

Phi*_*ppe 1 salesforce recaptcha

REQ_PARAM_NAME::validated-captcha
REQ_PARAM_VALUE::Pair(false,无法及时验证。假设响应正确。101781)

为什么我从谷歌收到这条消息?

v2 reCaptcha 复选框在提交表单之前被选中,但服务器验证返回上述结果并被拒绝(Salesforce 表单拒绝它)。

** 编辑 **

该网站是一个 wordpress 网站。这是我需要在标题中添加的代码:

<script src="https://www.google.com/recaptcha/api.js"></script> 
<script> function timestamp() {   var response = document.getElementById("g-recaptcha-response"); if (response == null || response.value.trim() == "") {var elems = JSON.parse(document.getElementsByName("captcha_settings")[0].value);elems["ts"] = JSON.stringify(new Date().getTime());document.getElementsByName("captcha_settings")[0].value = JSON.stringify(elems); } } setInterval(timestamp, 500); 
</script>
Run Code Online (Sandbox Code Playgroud)

该表单没有什么特别之处,但已提交给 Salesforce,因此我自己不验证验证码:

<form action="https://webto.salesforce.com/servlet/servlet..." method=POST">
<input  id="email" maxlength="80" name="email" size="20" type="text" />
<input type=hidden name='captcha_settings' value='{"keyname":"LOGIS_CO","fallback":"true","orgId":"00YXZ000000XYZ","ts":""}'>
<!-- some other fields -->
<div class="g-recaptcha" data-sitekey="xyz..."></div>
<br><input type="submit" name="submit">
Run Code Online (Sandbox Code Playgroud)

结果消息“...无法及时验证。假设响应正确。101781 )”是由 Salesforce 支持提供给我的。所以 Salesforce 表单确实收到了发布的表单,并且他们验证了验证码结果。

最后,Salesforce 验证生成的发布表单,他们得到了validated-captcha = false,无法及时验证。假设响应正确。101781.他们拒绝了这个帖子。所以 Salesforce 支持要求我自己检查这个验证码错误消息......

Kul*_*gin 5

tl;dr当访问者的系统时钟滞后时,SF 无法验证表单,可能被视为延迟提交,因此Unable to validate in time发生错误。


当我填写并提交表单时,虽然我没有设置 SF,但我可以使用浏览器的开发人员工具检查发送到 SF 服务器的内容。

除了通常的字段,还有一个额外的信息被发送到ts在字段内命名的 SF 服务器,captcha_settings这是一个使用 JavaScript 计算的时间戳,使用客户端的系统日期。

时间戳

不难猜测它正在用于验证。

所以我决定创建一个 SF 账户,幸运的是有 30 天的试用选项。创建帐户后,我创建了一个带有自动响应模板的网络案例表单,上面写着Case Successfully Created in Salesforce

为我的测试域获取了一个 reCAPTCHA v2 令牌并将表单的 HTML 标记放在那里并开始测试。

我提交了 9-10 次表单,没有任何问题。创建了所有案例,我收到了每个案例的电子邮件。

然后我把系统时钟调回了两个小时,提交了2-3次表格。表单和之前一样成功发送,但这次什么也没发生。我没有收到任何电子邮件。

然后我将系统时钟调整回正确的时间,一切又开始正常工作。

您可以通过将计算机的系统时钟设置回几个小时来重现该问题。

总之,这是SF必须解决的问题。依赖客户端的系统时间,这不是验证过程的可靠来源,绝对是一个糟糕的选择。您可能希望将此问题告知他们。

在 SF 做某事之前,作为一种解决方法,我认为依赖 3rd 方时间戳服务是可以的。

如果您考虑到这一点,您可以使用以下内容替换标头中的脚本标记。

<script src="https://www.google.com/recaptcha/api.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 
<script>
    var currentTimestamp;

    $.getJSON( "http://icanhazepoch.com/", function( data ) {
        currentTimestamp = data * 1000;

        setInterval(timestamp, 500);
    });

    function timestamp() {
        currentTimestamp += 500;

        var response = document.getElementById("g-recaptcha-response");
        if (response == null || response.value.trim() == "") {
            var elems = JSON.parse(document.getElementsByName("captcha_settings")[0].value);
            elems["ts"] = JSON.stringify(currentTimestamp);
            document.getElementsByName("captcha_settings")[0].value = JSON.stringify(elems);
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

这样,从服务获得的时间戳将被使用,而不是客户端的系统时钟,每 500 毫秒递增一次。

我希望它能帮助你。