月度归档:2011年05月

新浪微博php sdk中$o->getRequestToken()返回值为空的解决方案

从新浪微博下载的官方php sdk,跑在本地服务器没问题,上载到虚拟主机上就出现如题所述的index.php页面里$o->getRequestToken()返回值为空。跟踪getRequestToken函数中

1
$request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);

发现$request还是为空,继续查看oAuthRequest函数,oAuthRequest函数主要调用一个http()方法,该方法用于向新浪微博的授权中心发一个http请求,如果请求成功,会返回一个oauth_token。新浪微博的php sdk采用curl库抓取网页获得所需的返回值。用echo在http方法的前前后后打印了不少变量值,对比本地服务器的输出信息,很容易将问题定位在

1
$response = curl_exec($ci);

本地执行完这一句$response是有值返回的,而在虚拟主机上是没有值返回的。用var_dump(curl_error($ci))打印curl_exec()的错误信息。提示不能连接host,问题已经明确,只要确保虚拟主机能连接到request的请求地址

1
http://api.t.sina.com.cn/oauth/request_token

那么就能得到oauth_token,从而完成oAuth认证的第一步。

以上是$keys = $o->getRequestToken()返回空值的根本原因。而我去网上找过资料以后反而走了不少弯路。
首先,有人说碰到这个原因是虚拟主机上无法解析地址http://api.t.sina.com.cn/oauth/request_token。于是我将weibooauth.php中所有api.t.sina.com.cn都换成了它的ip地址(通过ping得到)。现在想想,其实这个方法是错误的,虽然ping能得到api.t.sina.com.cn的IP地址,但是却不能保证请求授权的地址就是http://IP地址/oauth/request_token。改后发现仍然调用失败,于是只能看weibooauth.php中的源代码,才有了之前的分析,把问题定位在curl_exec()函数,因为这个函数权限比较大,安全系数低,通常虚拟主机提供商会将它初始化为disable_functions,在服务器端用phpinfo()查了一下,果然curl_exec()在它的禁止函数列表中,于是找到客服,请求能不能放开这个函数,客服态度很好,几分钟就放开了curl_exec()执行权限。事实上,只要到了这一步,如果我当初没把api.t.sina.com.cn改成ip地址,那么所有问题就都解决了。

给出问题的解决方案:
1.确保主机能访问得到http://api.t.sina.com.cn/oauth/request_token。
2.确保主机上有curl_exec()的执行权限。

--EOF--