遇到的问题: 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)
图片如下:
一般普遍人的做法都是打开度娘百度一下
而我也是一样,在百度上可劲找啊,找啊。。。。
方法挺多的,但是最常见的方法是说:
导致该问题的原因在于没有配置curl.cainfo,该配置位于php.ini中。
1、解决方案(个人试了不管用,还是报错):
下载cacert.pem
https://curl.haxx.se/ca/cacert.pem配置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。如下图所示:
其中这一行意思是配置客户端的默认选项,默认是开启验证。
因为我们是本地配置的虚拟域名,没有https协议,所以在访问的时候才会报SSL证书问题:无法获得本地发布者证书。
解释:因为配置https协议,需要购买SSL证书,所以你需要将verify的值改为false,等后期你配置了https协议,在讲verify的值改为true。
以上是个人总结的,希望可以帮到大家,如果有不正确的地方,希望大家能够指出来,谢谢!