Tag Archives: PECL

腾讯微博开放平台的PECL的OAuth封装

这是腾讯微博开放平台使用 PECL OAuth 扩展例子,我在“微博擂台”中已经使用的。现在抽取出来作为一个独立的库。

Token 的存储提供了 Session 和 Memcache 两种方式。Session 方式是默认方式,也就是说不进行任何设置默认使用 Session 存储 OAuth 的 Token。

如果想用后台进程,例如 Gearman 之类的异步调用腾讯的 API ,建议使用 Memcache。当然,也可以自己扩展存储接口,实现 Mysql 之类的存储方式。

下载代码

使用 PECL 的 OAuth 库访问 QQ 微博 API

大势所趋,QQ 也在自家门上开了个小洞让诸位看客过过瘾。不过 API 文档不给力,疏漏多、讲得粗,没有 SDK,没有 Step by step,关键细节交代不清……幸而,摸索两日,总算是探得一个靠谱的办法——PECL 的 OAuth 库访问。

特别记录于此,供众玩家观赏。
Continue reading 使用 PECL 的 OAuth 库访问 QQ 微博 API

使用 PECL 的 OAuth 访问腾讯微薄 API 的一点麻烦

尝试用 PECL 的 OAuth 访问腾讯微薄,到 Access Token 那步总是有问题。 5% 的成功率。在 Request Token 的时候,也总有不成功的情况发生。

捕捉到异常:“Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)”,服务器返回“Invalid / expired Token”。

奇怪的是同样的代码,那 5% 的成功率是哪里来的。上 Q 一问,腾讯某大牛提示检查检查 nonce 或者 timestamp 是不是正确。于是乎,检查了一下 OAuth 的代码

<br />
	if (soo-&gt;nonce) {<br />
		nonce = estrdup(soo-&gt;nonce);<br />
	} else {<br />
		struct timeval tv;<br />
		int sec, usec;<br />
		/* XXX maybe find a better way to generate a nonce... */<br />
		gettimeofday((struct timeval *) &amp;tv, (struct timezone *) NULL);<br />
		sec = (int) tv.tv_sec;<br />
		usec = (int) (tv.tv_usec % 0x100000);<br />
		spprintf(&amp;nonce, 0, &quot;%ld%08x%05x%.8f&quot;, php_rand(TSRMLS_C), sec, usec, php_combined_lcg(TSRMLS_C) * 10);<br />
	}<br />

看到“spprintf(&nonce, 0, “%ld%08x%05x%.8f”, php_rand(TSRMLS_C), sec, usec, php_combined_lcg(TSRMLS_C) * 10);”了吗?!悲剧啊!

现在明白腾讯文档上那句“随机串(32个字符长度)”是什么意思了,RFC 5849 完全没提 nonce 需要 32 字符长度。腾讯自己说自己复合 OAuth 1.0a 标准,然后在标准上搞出了小标准⋯⋯

我比较懒,简单搞掂:

<br />
$oauth-&gt;setNonce(md5(rand()));<br />