九阁网趣 九阁网趣
PHPText.Net > 文章 > 技术 > WEB开发

微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘

2015/09/13 21:54
9043人阅读
最近又接触微信支付开发了,遇到了新的问题。。。。

之前搞微信支付,都是EC上面的,而且也都是搞好的插件,问题并不大。但是这次是重头开发所以就遇到了问题了,没想到真是不少官方SDK存在问题的东西,上次就是极光推送(php 极光推送(Push-API-v3)非官方版本 解决多次发送问题)的问题。这次轮到了微信,而且是低级错误。。。。明显SDK都无法通过,一般我们接口只要跑通官方的SDK就可以的了。。。。


不过话说回来,.NET的同事反映是官方的反倒没啥问题。。。。真是无语呀。好了下面来说问题吧,如果你下载官方的微信支付SDK的话,运行就会遇到下面的错误:

Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroot\weixinpaytest\pay\WxPay.JsApiPay.php on line 99

 

Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘ in D:\wwwroot\weixinpaytest\lib\WxPay.Api.php:564 Stack trace: #0 D:\wwwroot\weixinpaytest\lib\WxPay.Api.php(62): 

 

WxPayApi::postXmlCurl(‘<xml><appid><![...‘, ‘https://api.mch...‘, false, 6) #1 D:\wwwroot\weixinpaytest\pay\jsapi.php(36): 

 

WxPayApi::unifiedOrder(Object(WxPayUnifiedOrder)) #2 {main} thrown in D:\wwwroot\weixinpaytest\lib\WxPay.Api.php on line 564

这个看起来相当诡异的问题,为啥SDK会报错,而且排查环境CURL和openssl都是安装的了。那么就只有检查代码了,结果发现。。。真是低级的问题呀。这一段报错其实存在2个问题,我们看第一个。

Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroot\weixinpaytest\pay\WxPay.JsApiPay.php on line 99

按照提示你找到 WxPay.JsApiPay.php 的 99行,你打开文件看。。。

curl_setopt($ch, CURLOP_TIMEOUT, 30);

乍看之下,好像是没啥错误。但是其实你连同下面的代码一起看。你就会发现,有点短。。。。就是因为 CURLOP_TIMEOUT 少了个T应该是 CURLOPT_TIMEOUT。

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

就这个问题导致了第一个错误,你说低级不。。。。好,这样你修改后运行,还有第二个错误。

Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘ in D:\wwwroot\weixinpaytest\lib\WxPay.Api.php:564 Stack trace: #0 D:\wwwroot\weixinpaytest\lib\WxPay.Api.php(62): 

 

WxPayApi::postXmlCurl(‘<xml><appid><![...‘, ‘https://api.mch...‘, false, 6) #1 D:\wwwroot\weixinpaytest\pay\jsapi.php(36): 

 

WxPayApi::unifiedOrder(Object(WxPayUnifiedOrder)) #2 {main} thrown in D:\wwwroot\weixinpaytest\lib\WxPay.Api.php on line 564

这个不能算是初级问题吧,不过也算是一种兼容问题。在代码 WxPay.Api.php 537行处,我们可以看到:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,2);//严格校验

这里代码看上去并未不妥,不过实际还是存在问题,那就是 CURLOPT_SSL_VERIFYHOST 的严格校验,我们来看看 CURLOPT_SSL_VERIFYHOST 是什么意思。

CURLOPT_SSL_VERIFYHOST的值

0:表示不检查证书

1:表示检查证书中是否有CN(common name)字段

2:表示在1的基础上校验当前的域名是否与CN匹配

这里SDK设置2,可以算是安全考虑,不过并不是所有情况都支持,合理还是要改为0。我们要解决这个报错也是如此。只要修改成如下的情况。

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);//严格校验

这样就不会报错了。。。。


唉,微信官方的还是不够负责任,包括一些稳定性,这个相信一直做微信开发的人都知道,经常的官方服务接口来大姨妈。。。

同类推荐

百度地图WEB API报错:APP Referer校验失败百度地图WEB API报错:APP Referer校验失败
微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘
web app iphone4 iphone5 iphone6 响应式布局 适配代码web app iphone4 iphone5 iphone6 响应式布局 适配代码
关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction  和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction 和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback
PHP 判断是蜘蛛(搜索引擎)来访PHP 判断是蜘蛛(搜索引擎)来访
PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型
iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因
jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)
ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明
Discuz 用户整合 免激活 同步登录 解决方法Discuz 用户整合 免激活 同步登录 解决方法