Google reCaptcha 响应“Uncaught (in promise) null”

2022-08-30 08:26:58

我使用reCaptcha v2,但在任何情况下在开发控制台响应中(并移动函数)Uncaught (in promise) null.reset()

安慰:

enter image description here

我的代码用于验证码:

<div class="text-xs-center" style="text-align: center; height:150px;">
    <p style="color: black;"> Complete the verification: </p>
    <div style="display: inline-block;" class="g-recaptcha" data-sitekey="xxxxxxxxxxx" data-callback="callback"></div>
</div>

我的回调函数:

function callback() {
    if (grecaptcha === undefined) {
        alert('Recaptcha non definito'); 
        return; 
    }

    var response = grecaptcha.getResponse();
    console.log(response);

    if (!response) {
        alert('Coud not get recaptcha response'); 
        return; 
    }

    $.ajax({
    'url' : 'validate-recaptcha.php',
    'type' : 'POST',
    'data' : {
        'response' : response   
    },
    'success' : function(data) {              
        alert('Data: '+data);
    },
    'error' : function(request,error)
    {
        alert("Request: "+JSON.stringify(request));
    }
    });
    grecaptcha.reset();
}

和我的验证验证.php

<?php
//debug
$fp = fopen('debug.txt', 'a');
fwrite($fp, print_r($_POST, TRUE));
fclose($fp);
//enddebug

if (empty($_POST['recaptcha'])) {
    exit('Please set recaptcha variable');
}
// validate recaptcha
$response = $_POST['recaptcha'];
$post = http_build_query(
    array (
        'response' => $response,
        'secret' => 'yoursecretkey',
        'remoteip' => $_SERVER['REMOTE_ADDR']
    )
);
$opts = array('http' => 
    array (
        'method' => 'POST',
        'header' => 'application/x-www-form-urlencoded',
        'content' => $post
    )
);
$context = stream_context_create($opts);
$serverResponse = @file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, $context);
if (!$serverResponse) {
    exit('Failed to validate Recaptcha');
}
$result = json_decode($serverResponse);
if (!$result -> success) {
    exit('Invalid Recaptcha');
}
exit('Recaptcha Validated');

在互联网上搜索,可能问题是功能,但我不明白解决方案。.reset()


答案 1

事实证明,当网站未在Google验证码/管理域区域中“注册”时,也会发生这种情况。

解决方案:在验证码管理区域中添加域:

  1. 登录您的 Google 帐号,并在其中注册了您的验证码密钥
  2. 输入谷歌“谷歌recpatch管理控制台”
  3. 转到(生产)密钥的设置
  4. 在“域”中,添加以下两个条目:
localhost
127.0.0.1
  1. 保存它并测试您的验证码。

当我从开发密钥切换到生产密钥时,我犯了这个错误。生产密钥没有任何本地主机的条目。

我将API响应配置为位于代理重定向后面。因此,验证是在未在Google管理控制台中配置的本地主机环境中进行的,这导致了此一般错误。

感谢@Christian Žagarskas,他在评论中指出了这一点。


答案 2

Recaptcha v2 callback js error

我也遇到了这个错误,我发现它与recaptcha回调有关(在你的情况下)。如果删除数据回调属性,则不会出现错误。data-callback="callback"

控制台错误指示回调正在等待承诺。以下是使用 promise 进行 recaptcha 的基本回调函数:Uncaught (in promise) null

function callback() {
    return new Promise(function(resolve, reject) { 

    //Your code logic goes here

    //Instead of using 'return false', use reject()
    //Instead of using 'return' / 'return true', use resolve()
    resolve();

  }); //end promise
};

在你的情况下,你需要将代码调整为如下:

function callback() {
  return new Promise(function(resolve, reject) {  

    if (grecaptcha === undefined) {
        alert('Recaptcha non definito'); 
        //return;
        reject();
    }

    var response = grecaptcha.getResponse();
    console.log(response);

    if (!response) {
        alert('Coud not get recaptcha response'); 
        //return;
        reject();
    }

    $.ajax({
    'url' : 'validate-recaptcha.php',
    'type' : 'POST',
    'data' : {
        'response' : response   
    },
    'success' : function(data) {              
        alert('Data: '+data);
        resolve();
    },
    'error' : function(request,error)
    {
        alert("Request: "+JSON.stringify(request));
        reject();   
    }
    });
    grecaptcha.reset();

  }); //end promise
}

这是我在SO中的第一个答案,所以请耐心等待,如果我忘记或错过了一些:)