【问题标题】:Recaptcha Request is returning NullRecaptcha 请求返回 Null
【发布时间】:2023-03-07 17:48:01
【问题描述】:

我正在尝试将此 Recaptcha 请求实施到我的注册表单中,但是它不起作用。当我在我的网站上成功验证 Recaptcha 时,cURL/JSON 请求返回 null

我尝试在 JSON 请求中的 "error-codes": 上使用 var_dump,它只返回 null;而在this document 中,它表明它显然是要在 JSON 请求中输出两个项目。

在此先感谢,我没有对 JSON/cURL 做太多工作,所以请放轻松。

这是我的代码:

PHP

<?php

    if($_SERVER["REQUEST_METHOD"] == "POST") {
        $recaptcha = $_POST['g-recaptcha-response'];
        if(!empty($recaptcha)) {

            function getCurlData($url) {
                $curl = curl_init();
                curl_setopt($curl, CURLOPT_URL, $url);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($curl, CURLOPT_TIMEOUT, 10);
                curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");
                $curlData = curl_exec($curl);
                curl_close($curl);
                return $curlData;
            }

            $google_url = "https://www.google.com/recaptcha/api/siteverify";
            $secret = 'You will never know >:D';
            $ip = $_SERVER['REMOTE_ADDR'];
            $url = $google_url . "?secret=" . $secret . "&response=" . $recaptcha . "&remoteip=" . $ip;
            $res = getCurlData($url);
            $res = json_decode($res, true);

            // var_dumping returns null
            var_dump($res);

            //reCaptcha success check 
            if($res['success'] == true) {
                echo "Recaptcha was successfully validated";
            } else {
                echo "Recaptcha was not validated, please try again";
            }
        } else {
            echo "You didn't validate the Recaptcha";
        }
    }
?>

HTML

<form action="home.php" method="post">
    <div class="g-recaptcha" data-sitekey="I removed it for this post"></div>
    <input class="btn btn-primary" type="submit" name="submit" value="SIGN UP" />
</form>

【问题讨论】:

    标签: php json curl recaptcha


    【解决方案1】:

    您的问题可能与 SSL 证书有关。 你可以把这一行让 curl 忽略它:

    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)
    

    但是,您可以在本地主机上进行测试,但在上传您的网站时,最好有 SSL 证书并删除此行。

    【讨论】:

    • 这对我有用,我在本地进行测试,在这种情况下 SSL Verifypeer 对我不起作用。
    • 很高兴听到这个消息
    【解决方案2】:

    这是我的代码运行没有问题:

    客户端:

    <div class="g-recaptcha" data-sitekey="PUBLIC_KEY"></div>
    

    服务器端:

    if (isset($_POST['g-recaptcha-response'])) {
        $captcha = $_POST['g-recaptcha-response'];
        $privatekey = "SECRET_KEY";
        $url = 'https://www.google.com/recaptcha/api/siteverify';
        $data = array(
            'secret' => $privatekey,
            'response' => $captcha,
            'remoteip' => $_SERVER['REMOTE_ADDR']
        );
    
        $curlConfig = array(
            CURLOPT_URL => $url,
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => $data
        );
    
        $ch = curl_init();
        curl_setopt_array($ch, $curlConfig);
        $response = curl_exec($ch);
        curl_close($ch);
    }
    
    $jsonResponse = json_decode($response);
    
    if ($jsonResponse->success === true) {
        doSomething();
    }
    else {
        doSomeOtherThing();
    }
    

    工作here! :)

    【讨论】:

    • 'success' 必须是布尔值。
    【解决方案3】:

    Api 说:方法:POST,您正在发送“GET”请求。 检查http://php.net/manual/en/function.curl-setopt.php上的CURLOPT_POSTCURLOPT_POSTFIELDS选项

    编辑: 我刚刚检查了 API,它也可以与 GET 一起使用。我在您的代码中没有看到任何错误。您能否暂时将您的功能更改为:

       function getCurlData($url) {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_TIMEOUT, 10);
            curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16");
            $curlData = curl_exec($curl);
    
            if (!$curlData) {
                throw new \Exception('Curl error: ' . curl_error($curl));
            }
            curl_close($curl);
    
    
            return $curlData;
        }
    

    【讨论】:

    • 它在哪里说我正在使用 GET 请求?我什么时候可以实现'CURLOPT_POSTFIELDS',我对此并不熟悉,所以我真的不知道该怎么做。
    • 默认请求是GET,您没有指定请求类型 => 您正在发出 GET 请求。检查documentationexamples,至少有3种方法可以指定POST字段。
    • 如果您查看我指定 POST 的代码,我看不出我做错了什么。能详细点吗?
    • 你的 curl 请求应该是 POST。 curl_setopt($curl, CURLOPT_POST, 1);.And 也发布选项curl_setopt($curl, CURLOPT_POSTFIELDS, {{your post data here}});
    • 谢谢,但我仍然不知道该放在哪里。您可以发布一个突出显示您放置位置的答案吗? :)
    猜你喜欢
    • 2019-08-26
    • 2017-03-12
    • 2016-03-31
    • 1970-01-01
    • 2020-12-12
    • 2015-08-17
    • 2022-01-04
    • 2017-01-21
    • 2018-02-23
    相关资源
    最近更新 更多