PHP微信支付开发遇到Curl错误,返回错误60

2017-03-24 11:40:41
PHP Curl 60错误的正确解决方法
今天在个人电脑上开发微信支付功能的时候,遇到了一个错误,返回如下错误信息:

Fatal error
Uncaught exception 'WxPayException' with message 'curl出错,错误码:60' in WxPay.Api.php:537
本人的开发环境为 Win7 64位、XAMPP套装WEB开发环境,于是查看了相关的代码,这个方法是通过Curl调用微信API的,是一个公共方法,每一个微信Api都要通过这个方法调用。



看了一下报错的地方,大致判断是由于SSL协议引起的,微信官方也给出了这样的说明,https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&key=1414562353&version=11&lang=zh_CN

由于微信接口是HTTPS协议的,而低版本的SSL协议有一些安全隐患,因此他要求客户端所使用的SSL证书必须是受信任机构颁发的,自己生成的SSL证书是不行的。

而在PHP中, 如果我们指定了启用SSL,但是没有指定受信任的SSL证书的话,那么就会报curl 60错误。

知道了产生问题之所在,那么自然也就有了相应的解决方案:

1、CURL不使用SSL连接,代码如下,将 CURLOPT_SSL_VERIFYPEER 选项设置为false,这样CURL就不会使用SSL连接服务器。但是这样就没有了安全性,所有的信息都是明文在网络中传输的。
如果只是在个人电脑做开发的话,可以临时使用这种解决方案

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

2、正确的解决方案就是设置一个受信任的ca证书
如果你也是用XAMPP开发的话,XAMPP自身是带了一个ca root证书的,位置是在 \xampp\perl\vendor\lib\Mozilla\CA\cacert.pem ,如果你使用其他开发环境的话,可以在CURL官方网站上下载一个受信任的证书,网址是 https://curl.haxx.se/ca/cacert.pem

有了ca证书,还需要在php.ini中配置一下,这样以后调用curl的时候,就会使用这个证书,打开php.ini文件,配置好curl.cainfo项。 如果你的php.ini中没有这一项, 就在末尾加上就可以。

[curl]
curl.cainfo = "D:\xampp\perl\vendor\lib\Mozilla\CA\cacert.pem"


重启Apache,问题就解决了。

由以上可见,这并不是微信支付的问题,其他的一些开放平台也可能出现类似的问题。