php - reCaptcha 不工作;它不返回成功

标签 php recaptcha captcha

我的表单需要一个验证码,但我在服务器端集成方面遇到了一些麻烦。

表单接受四种类型的数据:

  1. 姓名
  2. 电子邮件
  3. 评论。

确定没有一个为空后,我要验证验证码。但是,出于某种原因,它总是返回 success == false

有人可以帮我找出我的代码有什么问题吗?

function validate($data)
{
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

$nameMsgErr = $emailErr = $msgSuccess = $error = "";

if(!empty($_POST['name_msg']) && !empty($_POST['email']) && !empty($_POST['subject']) && !empty($_POST['message'])) {

    $url = 'https://www.google.com/recaptcha/api/siteverify';
    $private_key = '------Private Key--------';

    $response = file_get_contents($url . "?secret=" . $private_key . "&response=" . $_HOST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);

    $data = json_decode($response);

    if(isset($data->success) AND $data->success == true) {

        $name = validate($_POST['name_msg']);
        $email = validate($_POST['email']);
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $emailErr = "Wrong email format";
        } else {

            $subject = validate($_POST['subject']);
            $msg = validate($_POST['message']);
            $msg .= "\r\n" . $name;
            $msg = wordwrap($msg, 70, "\r\n");
            $header = "From: " . $email;

            mail("myemail9@gmail.com", $subject, $msg, $header);

            $msgSuccess = "Message successfully sent";

        }
    } else {
        $error = "Error";
    }
}

最佳答案

您使用了错误的 HTTP 方法来验证用户响应。在您的代码中,您使用 file_get_contents 并发送 GET 请求,每次都返回 false。

documentation 中所述,您需要向 google recaptcha api 发送 POST 请求。

参见 this回答使用 file_get_contents

发送 POST 请求

注意:cURL 是更常用的发送 POST 请求的方法,并且可能更容易掌握和实现。我建议使用 cURL 开始。

编辑(添加具体示例,未测试):

$postdata = http_build_query(
    array(
        'secret'    =>  $private_key,
        'response'  =>  $_HOST["g-recaptcha-response"],
        'remoteip'  =>  $_SERVER["REMOTE_ADDR"]
    )
);
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$response = file_get_contents('https://www.google.com/recaptcha/api/siteverify', FALSE, $context); 

关于php - reCaptcha 不工作;它不返回成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082780/

相关文章:

php - NoCaptcha 返回错误 invalid-json

javascript - Angularjs 从普通 JS 函数调用 $scope.function

javascript - 如何完全推迟加载 Google reCaptcha 直到页面完全加载

php - 在 Laravel 框架中实现 php 验证码

php - 调用父类方法

javascript - Php Javasctipt - 未定义的选定选项通过 HTML 从数据库传递给 js

python - 清理验证码图像

captcha - reCAPTCHA 接受二分之一

php - 根据数据透视表返回选中的复选框

php - php 中的多个 mysql 查询