利用腾讯微博开放api开发塞班symbian应用的一些心得,关键字:HMAC-SHA1签名算法,check sign error,发送中文问题。add_pic接
利用腾讯微博开放api开发塞班symbian应用的一些心得,关键字:HMAC-SHA1签名算法,check sign error,发送中文问题。add_pic接口。
最近在搞一个塞班的应用,想接入腾讯微博或者sina微博,找遍了api文档,php,java,ios,android……大多数都有sdk,都木有找到塞班的sdk,估计塞班的程序员太好欺负了,所以没有。虽然说塞班是基于c++的,但是如果你把c++ sdk搬到塞班上的话,估计有十万个以上的问题~等着你来搞定~~蛋痛的塞班,木有办法,只有自己实现了~
首先的问题是Oauth鉴权,Oauth鉴权最关键的就是HMAC-SHA1签名算法,搜索了无数网站,终于在nokia论坛找到一个文章,有现成的代码。非常高兴。居然短短不到100行代码就解决了~赶紧拿来试试,但是就是不对劲~~,最后苦苦寻思,调试,就是因为一个&符号的问题。腾讯微博的api文档说请求request token的HMAC-SHA1签名算法中的key是由App Secret和Token Secret组成,因为请求request token时还木有Token Secret,顾我的key就只有App Secret。忽略了一个问题,那就是不能少&这个符号。虽然木有Token Secret,但是&不能少~
另一点要注意的是:不要请求https,直接请求http就好~
鉴权搞定了,我以为后面发图片就轻而易举了,其实不然,后面还有很多岔道,走错就死翘翘~看腾讯api文档,看起来很容易,其实里面水很深~~第一个问题,根据api文档,把啥都弄好了,调用add_pic发送一个图片,返回{"data":null,"errcode":1,"msg":"error content param","ret":1}什么问题呢?原来是木有把conten放在表单数据中。日,api文档上说,只需要把图片放到表单数据,其实,所有的参数都要放到表单数据中。同时也要放在url参数中~~
好吧content放到表单数据后,木有"error content param"这个错误了,接着返回了这个错误<root><data/><errcode>1</errcode><msg>check sign error</msg><ret>3</ret></root>。这个问题,搞了好久,是啥原因呢,
原来在前面的baseString中,要把oauth_version参数带上,api文档里说可以木有,实际上必须要有~
好,到此,可以正常发图片了,接下来又有问题了,是啥呢?如果内容中有空格,或者中文,又出来check sign error了~这个咋解决呢?转utf-8,url编码,都加上了,还是不行。最后通过腾讯的同事解析c#的sdk,最后总结出事需要这样子做才行:
签名的base String中不需要转utf8,进行urlencode就好,在填到表单数据的conten则只需要转utf8,不需要url encode。如果已经url encode了,需要url Decode,再转utf8.
好,到此我的项目基本完成了~把这些写出来,希望对利用腾讯微博开放api在塞班上开发的朋友有所帮助,毕竟还是有很多塞班用户的~~
附录:1:塞班HMAC-SHA1签名算法链接:http://www.developer.nokia.com/Community/Wiki/How_to_generate_oauth_signature_using_HMAC-SHA1_in_Symbian_C%2B%2B
2:贴一个add_pic接口的url和表单数据示例。
url:http://open.t.qq.com/api/t/add_pic?clientip=127.0.0.1&content=%23Gif%E5%A1%9E%E7%8F%AD%23%20%23Gif%E5%BE%AE%E7%94%B5%E5%BD%B1%23%20&format=xml&jing=23&oauth_consumer_key=801060504&oauth_nonce=132334672042EEDD8114DF1SS2EAC112&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1323346720&oauth_token=27a987ee2a10423da656b0ef5f2007e5&oauth_version=1.0&wei=123&oauth_signature=4Osbpiefdf8%2Bm2p2pl1fYoq1FoI%3D
表单数据:
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="clientip";
127.0.0.1
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="content";
Content-Type: text/plain; charset=utf-8
#Gif塞班# #Gif微电影#
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="format";
xml
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="jing";
23
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_consumer_key";
801060504
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_nonce";
132334672042EEDD8114DF1SS2EAC112
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_signature_method";
HMAC-SHA1
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_timestamp";
1323346720
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_token";
27a987ee2a10423da656b0ef5f2007e5
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_version";
1.0
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="wei";
123
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="oauth_signature";
4Osbpiefdf8+m2p2pl1fYoq1FoI=
------------YrVCInGlLK6trntXaL9C58
Content-Disposition: form-data; name="pic"; filename="Photo~20111208214028.gif"
Content-Type: application/octet-stream
图片二进制数据
------------YrVCInGlLK6trntXaL9C58-- 楼主厉害啊!!!
[解决办法]
求教楼主:能替换S60v3版的内置字体么? 蛋痛的v3版在^3下显示一堆空格~