Facebook 第三方登陆访问接口出现 curl: (7) 443

环境: win10 php5.6
工具:curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL postman
问题描述:

  1. facebook 第三方登陆时请求获取用户信息时,使用 postman 发送请求时,可以获得正确的用户数据,如图所示:

Facebook  第三方登陆访问接口出现  curl: (7) Failed to connect to graph.facebook.com port 443: Timed out

  1. 在本地 cmd 中使用curl -X GET 请求时,出现 curl: (7) Failed to connect to graph.facebook.com port 443: Timed out 错误,如图所示:

Facebook  第三方登陆访问接口出现  curl: (7) Failed to connect to graph.facebook.com port 443: Timed out

  1. 在PHP 代码中使用 curl 请求报 出现 false,使用 guzzle 访问 报第2步同样的错误

Facebook  第三方登陆访问接口出现  curl: (7) Failed to connect to graph.facebook.com port 443: Timed out

Facebook  第三方登陆访问接口出现  curl: (7) Failed to connect to graph.facebook.com port 443: Timed out

自己尝试解决:在 hosts 文件中加入 百度查询的 facebook.com 的 对应的IP,但是问题始终出现
求助:希望又遇到同样问题的小伙伴伸出援助之手,万分感谢:heartbeat::heartbeat:

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

你要是使用guzzle的话直接添加一个http代理就行,guzzle的版本必须是5.*的,否则会报错。

$guzzesettion = [
            'defaults' => [
                'proxy'           => '127.0.0.1:1087' //本地http代理
            ],
        ];

        $guzzleclient = new Client($guzzesettion);
        $guzzlech = new FacebookGuzzleHttpClient($guzzleclient);

        $this->fb = new Facebook([
            'default_graph_version' => 'v9.0',
            'http_client_handler' => $guzzlech
        ]);

你如果使用curl的话你就需要改一下源码。 /vendor/facebook/graph-sdk/src/Facebook/HttpClients/FacebookCurlHttpClient.php

 /**
     * Opens a new curl connection.
     *
     * @param string $url     The endpoint to send the request to.
     * @param string $method  The request method.
     * @param string $body    The body of the request.
     * @param array  $headers The request headers.
     * @param int    $timeOut The timeout in seconds for the request.
     */
    public function openConnection($url, $method, $body, array $headers, $timeOut)
    {
        $options = [
            CURLOPT_CUSTOMREQUEST => $method,
            CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers),
            CURLOPT_URL => $url,
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_TIMEOUT => $timeOut,
            CURLOPT_RETURNTRANSFER => true, // Return response as string
            CURLOPT_HEADER => true, // Enable header processing
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem',
            CURLOPT_PROXYPORT      => '1087',  //这行是代理端口
            CURLOPT_PROXY          => '127.0.0.1', //这行是ip
        ];

        if ($method !== "GET") {
            $options[CURLOPT_POSTFIELDS] = $body;
        }

        $this->facebookCurl->init();
        $this->facebookCurl->setoptArray($options);
    }

然后请求的时候直接指定一下curl

  $this->fb = new Facebook([
            'default_graph_version' => 'v9.0',
            'http_client_handler' => 'curl'  //使用curl
        ]);
1个月前 评论
小彭友 (楼主) 1个月前
讨论数量: 7

因为访问那个地址 需要爬墙。。postman可以调用系统代理 但是代码里不能直接调用 可以尝试设置curl设置代理 或者把代码配置到外网服务器上做测试

1个月前 评论

@syskey 本地使用了 ngrok 内网穿透了,Facebook 官网文档都访问的很流畅的,本地代码能收到回调拿到 code, 但是用 code post 请求拿 access_token 的时候就出现 curl(7) 443了

1个月前 评论

你要是使用guzzle的话直接添加一个http代理就行,guzzle的版本必须是5.*的,否则会报错。

$guzzesettion = [
            'defaults' => [
                'proxy'           => '127.0.0.1:1087' //本地http代理
            ],
        ];

        $guzzleclient = new Client($guzzesettion);
        $guzzlech = new FacebookGuzzleHttpClient($guzzleclient);

        $this->fb = new Facebook([
            'default_graph_version' => 'v9.0',
            'http_client_handler' => $guzzlech
        ]);

你如果使用curl的话你就需要改一下源码。 /vendor/facebook/graph-sdk/src/Facebook/HttpClients/FacebookCurlHttpClient.php

 /**
     * Opens a new curl connection.
     *
     * @param string $url     The endpoint to send the request to.
     * @param string $method  The request method.
     * @param string $body    The body of the request.
     * @param array  $headers The request headers.
     * @param int    $timeOut The timeout in seconds for the request.
     */
    public function openConnection($url, $method, $body, array $headers, $timeOut)
    {
        $options = [
            CURLOPT_CUSTOMREQUEST => $method,
            CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers),
            CURLOPT_URL => $url,
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_TIMEOUT => $timeOut,
            CURLOPT_RETURNTRANSFER => true, // Return response as string
            CURLOPT_HEADER => true, // Enable header processing
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem',
            CURLOPT_PROXYPORT      => '1087',  //这行是代理端口
            CURLOPT_PROXY          => '127.0.0.1', //这行是ip
        ];

        if ($method !== "GET") {
            $options[CURLOPT_POSTFIELDS] = $body;
        }

        $this->facebookCurl->init();
        $this->facebookCurl->setoptArray($options);
    }

然后请求的时候直接指定一下curl

  $this->fb = new Facebook([
            'default_graph_version' => 'v9.0',
            'http_client_handler' => 'curl'  //使用curl
        ]);
1个月前 评论
小彭友 (楼主) 1个月前

你要是使用socialite的话只需要在配置文件services.php中添加一行

'facebook' => [
        'client_id' => env('FACEBOOK_APP_ID'),
        'client_secret' => env('FACEBOOK_APP_SECRET'),
        'redirect' => '回调url',
        'guzzle' => ['proxy' => env('HTTP_PROXY')]  //增加这行
    ],

但需要注意的是socialite的guzzle的版本必须是6以上,如果和facebook的sdk同时使用也会出现兼容问题。建议二者选其一

1个月前 评论
$guzzesettion = [
            'proxy'  => 'tcp://localhost:1080', //本地http代理
            'verify' => false
        ];
        $client       = new \GuzzleHttp\Client($guzzesettion);

curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1"); //代理服务器地址
curl_setopt($ch, CURLOPT_PROXYPORT, 1080); //代理服务器端口
1个月前 评论

@marcello 现在是在 TP5 上开发接口,准备按照官方文档接口来,不准备接入 sdk,做好异常处理应该差不多

1个月前 评论

超时 会不会是单纯的需要翻。墙 :joy:其实代码本身没问题

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!