项目需要使用微信接口,发生过几次透过php的curl_exec访问接口返回false的情况,
做了许多尝试,爬了各种解决办法,总结下解决方案,首先为了简化问题写了简单的调用代码如下,
<?php
echo "</pre>";
$url="https://api.weixin.qq.com/sns/jscode2session?appid=xxxxxxxx&js_code=xxxxx&grant_type=authorization_code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$tmp = curl_exec($ch);
//$tmp返回false
if(!$tmp)
{
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
var_dump(curl_getinfo($ch));
}
$app_user = json_decode($tmp,true);
curl_close($ch);
var_dump($tmp);
var_dump($app_user);
echo "</pre>";die;
?>
因为Centos默认使用nss的ssl协议,可能会遇到证书问题(例如windows访问某些https地址会出现不安全的警告),因此加上不验证https的网址安全性,
另外也爬到有网友说要加上协议版本 curl_setopt($ch, CURLOPT_SSLVERSION, 3);
<?php
echo "</pre>";
$url="https://api.weixin.qq.com/sns/jscode2session?appid=xxxxxxxx&js_code=xxxxx&grant_type=authorization_code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//-----增加下面代码------
//关闭SSL证书验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
//指定HTTL协议版本,因为访问的是htts所以应该没有任何作用
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
//指定SSL的协议版本,但是因为我后面替换成Openssl之后,会出问题因此仅记录下
//curl_setopt($ch, CURLOPT_SSLVERSION, 3);
//----------------------
$tmp = curl_exec($ch);
if(!$tmp)
{
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
var_dump(curl_getinfo($ch));
}
$app_user = json_decode($tmp,true);
curl_close($ch);
var_dump($tmp);
var_dump($app_user);
echo "</pre>";die;
?>
当然也尝试各种更新
$ yum upgrade nss
如此一度解决,这两天又发现不好使了,系统中使用curl命令执行正常,但是使用php的curl_exec返回就是false
最终定位问题还是出在php的curl扩展上,默认情况下curl使用的是nss
尝试替换成与CURL命令一样使用Openssl
首先需要准备环境,因为我的PHP是懒惰使用yum安装,因此只想单独找一个版本相同的源码,只编译curl扩展来替代
$ yum groupinstall development
$ yum install php-devel
//首先先备份原来的CURL
$ cd /usr/lib64/php/modules
$ cp curl.so curl.so.bak
//查看目前的curl版本
$ curl -V
先去官网查找下载同版本的源码 https://curl.se/download/
$ wget https://curl.se/download/curl-7.52.1.tar.gz
$ ./configure --prefix=/usr/local/curl/ --without-nss --with-ssl
$ make && make install
phpinfo()查看PHP版本,
到官网找该版本的下载地址 https://www.php.net/releases/
//下载源码
$ wget https://www.php.net/distributions/php-5.4.45.tar.gz
$ tar zxvf php-5.4.45.tar.gz
$ cd php-5.4.45/ext/curl
//如果没有phpize命令是因为没有装php-devel组件,可以yum安装一下
$ phpize
//仅编译curl扩展即可
$ ./configure --with-curl=/usr/local/curl
//注意 make install 会覆盖 /usr/lib64/php/modules/curl.so记得提前备份
$ make & make install
//重启 httpd 服务即可
$ service httpd restart
查看下
并且再次测试,
恢复正常