Google reCaptcha:无法及时验证

Google reCaptcha: Unable to validate in time

REQ_PARAM_NAME::validated-captcha
REQ_PARAM_VALUE::Pair(false,Unable to validate in time. Response is assumed correct. 101781)

为什么我会收到来自 google 的这条消息?

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

** 编辑 **

该网站是一个 wordpress 网站。这是我需要在 header:

中添加的代码
<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>

表单没有什么特别之处,只是提交给了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">

结果消息“...无法及时验证。假定响应正确。101781)”是 Salesforce 支持人员给我的。所以 Salesforce 表单确实收到了 posted 表单并且他们验证了验证码结果。

最后,Salesforce 验证生成的 posted 表单,他们得到 validated-captcha = false,无法及时验证。假定响应是正确的。 101781. 并且他们拒绝 post。所以 Salesforce 支持人员要求我自己检查此验证码错误消息...

tl;dr当访问者的系统时钟滞后时,表单无法通过顺丰验证,可能被认为是延迟提交,因此出现错误Unable to validate in time .


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

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

不难猜到是用来验证的

所以我决定创建一个 SF 帐户,幸运的是有一个 30 天的试用选项。创建帐户后,我创建了一个带有自动回复模板的 web-to-case 表单,上面写着 Case Successfully Created in Salesforce.

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

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

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

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

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

综上所述,这是顺丰必须解决的问题。依赖于客户端的系统时间,这不是验证过程的可靠来源,绝对是一个糟糕的选择。您可能想将此问题告知他们。

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

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

<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>

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

希望对你有所帮助