Laravel 5.8 使用GuzzleHttp请求第三方https接口报错:cURL error 60: SSL certificate problem: unable to get loca...

遇到的问题: Laravel 5.8 使用GuzzleHttp请求第三方https接口报错

错误提示:

GuzzleHttp \ Exception \ RequestException
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)

图片如下:

使用Guzzle Http请求第三方https接口报错

一般普遍人的做法都是打开度娘百度一下

而我也是一样,在百度上可劲找啊,找啊。。。。

方法挺多的,但是最常见的方法是说:
导致该问题的原因在于没有配置curl.cainfo,该配置位于php.ini中。

1、解决方案(个人试了不管用,还是报错):

  1. 下载cacert.pem
    https://curl.haxx.se/ca/cacert.pem

  2. 配置php.ini
    打开你的php.ini 文件 搜索curl.cainfo
    去掉前面的;(分号)
    [curl]
    ; A default value for the CURLOPT_CAINFO option.
    ;This is required to be an absolute path.
    curl.cainfo = 【你的绝对路径】

2、经过研究总结以下方法:
我这里是在Laravel 5.8 框架中安装了GuzzleHttp,然后找到**Client.php **文件,找到下面这个方法
下面是guzzle官方文档
https://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html

private function configureDefaults(array $config)
    {
        $defaults = [
            'allow_redirects' => RedirectMiddleware::$defaultSettings,
            'http_errors'     => true,
            'decode_content'  => true,
            'verify'          => false,
            'cookies'         => false,
            'idn_conversion'  => true,
        ];

        // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.

        // We can only trust the HTTP_PROXY environment variable in a CLI
        // process due to the fact that PHP has no reliable mechanism to
        // get environment variables that start with "HTTP_".
        if (php_sapi_name() === 'cli' && getenv('HTTP_PROXY')) {
            $defaults['proxy']['http'] = getenv('HTTP_PROXY');
        }

        if ($proxy = getenv('HTTPS_PROXY')) {
            $defaults['proxy']['https'] = $proxy;
        }

        if ($noProxy = getenv('NO_PROXY')) {
            $cleanedNoProxy = str_replace(' ', '', $noProxy);
            $defaults['proxy']['no'] = explode(',', $cleanedNoProxy);
        }

        $this->config = $config + $defaults;

        if (!empty($config['cookies']) && $config['cookies'] === true) {
            $this->config['cookies'] = new CookieJar();
        }

        // Add the default user-agent header.
        if (!isset($this->config['headers'])) {
            $this->config['headers'] = ['User-Agent' => default_user_agent()];
        } else {
            // Add the User-Agent header if one was not already set.
            foreach (array_keys($this->config['headers']) as $name) {
                if (strtolower($name) === 'user-agent') {
                    return;
                }
            }
            $this->config['headers']['User-Agent'] = default_user_agent();
        }
    }

然后将$defaults 数组中的verify的值改为false。如下图所示:

image.png

其中这一行意思是配置客户端的默认选项,默认是开启验证。
因为我们是本地配置的虚拟域名,没有https协议,所以在访问的时候才会报SSL证书问题:无法获得本地发布者证书。

解释:因为配置https协议,需要购买SSL证书,所以你需要将verify的值改为false,等后期你配置了https协议,在讲verify的值改为true

以上是个人总结的,希望可以帮到大家,如果有不正确的地方,希望大家能够指出来,谢谢!

你可能感兴趣的:(Laravel 5.8 使用GuzzleHttp请求第三方https接口报错:cURL error 60: SSL certificate problem: unable to get loca...)