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

慰问:

enter image description here

我的recaptcha代码:

<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();
}

还有我的validate-recaptcha.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()功能有问题,但是我不明白解决方案.

推荐答案

Recaptcha v2回调js错误

我也有这个错误,我发现它与recaptcha回调有关(在您的例子中是data-callback="callback").如果删除数据回调属性,则不会出现错误.

控制台错误Uncaught (in promise) null表示回调正在等待promise .以下是使用Promise的reCAPTCHA的基本回调函数:

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中的第一个答案,所以请耐心等待,如果我忘记或错过了什么,请告诉我:)

Php相关问答推荐

PHP FFI—Convert void * to int

PHP如何将ARRAY_MAP与Reset()配合使用

让所有具有相同名称的产品在WooCommerce中更改价格

不包括WooCommerce中单独销售的产品

如何从该字符串中删除这些图标转换的ASCII问号字符?

在php中,方法之间的属性链接是如何工作的

防止 WooCommerce 在前端加载全尺寸图像

在 WooCommerce 中何时何地执行 woocommerce_order_status_completed_notification 挂钩?

Woocommerce 临时购物车税未根据第一个请求正确计算

如何使用 AJAX、PHP 和 MYSQL 在 Select 项目时在文本框中填充数据

将一个表中的行连接为不同表MYSQL中的一列

如何在 PHP laravel 中将图像的透明背景转换为白色?

通过ajax发送数据到下拉列表未完全设置为所选

在 mysql 上的 PDO 中启用自动提交并将自动提交设置为关闭

Woocommerce API 的 PHP Curl 附加参数

PHP 日期格式:ISO8601 与 ISO8601_EXPANDED

php-http/discovery 插件 1.15.1 是否仍在使用自己的模块 destruct Contao 4.13 中的composer 安装?

使用 PHP ImageMagick 库将 pdf 文件的前 n 页转换为单个 png 图像文件

如何在 Laravel 中保存多对多

try 在 Laravel Blade 上显示值时出现未定义的变量 X 问题