私はreCaptcha v2を使用していますが、開発コンソールの応答ではUncaught (in promise) null
のいずれの場合でも(および.reset()
関数の移動)
コンソール:
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();
}
およびmyvalidate-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コールバックに関連していることがわかりました(あなたの場合はdata-callback="callback"
)。データコールバック属性を削除しても、エラーは発生しません。
コンソールエラーUncaught (in promise) null
は、コールバックがプロミスを待っていることを示します。 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での最初の回答です。しばらくお待ちください。何かを忘れたり見逃した場合はお知らせください。
私を悩ませたこのエラーの別のトリガーは、フォームに「submit」という名前の属性を持つボタンがあったことです。 reCaptchaドキュメントの自動バインディングのサンプルコード を使用する場合、「form.submit」はフォーム自体のsubmit()関数ではなくボタンを参照するため、これは失敗します。ドッ!
<html>
<head>
<title>reCAPTCHA demo: Simple page</title>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<script>
function onSubmit(token) {
document.getElementById("demo-form").submit();
}
</script>
</head>
<body>
<form id='demo-form' action="?" method="POST">
<!-- Oops.... avoid the name="submit" below -->
<button name="submit" class="g-recaptcha" data-sitekey="your_site_key" data-callback='onSubmit'>Submit</button>
<br/>
</form>
</body>
</html>
@ChristianŽagarskasはコメントでそれを指摘しました:
Turns out it also occurs when a site is not "registered" in the Google recaptcha/admin Domains area.
開発キーから本番キーに切り替えたときにこのエラーが発生しました。本番キーには、localhostのエントリがありませんでした。
プロキシリダイレクトの背後に座るようにAPI応答を構成しました。そのため、この一般的なエラーの原因となったGoogle管理コンソールで設定されていないローカルホスト環境で検証が機能していました。
検証がプロキシリダイレクトの背後に設定されている場合のエラーを解決する手順:
localhost 127.0.0.1
私の場合、コールバックは存在しない変数を参照しただけで、同じエラーが発生しました。非常に単純なものの非常に奇妙なエラー!
偶然に変数名の後に.
を残したときにも同じエラーが発生しました。これはfix the code in your callback!
を意味する非常に一般的なエラーのようです。
私の場合、jquery.3.4.1.slim.js
を使用していましたが、jquery.3.4.1.min.js
に変更するとエラーが消えました。私はASP.NET WebForms
にいます。
John Rixの問題/解決策に似ています。 submit要素のidが「submit」の場合にもエラーが発生しました。
<!-- Avoid id="submit" below -->
<input type="submit" id="submit" value="submit">```