发现很多朋友都遇到这个问题,我把我在github上的回复和邮件回复都记录在下面,有空再整理下:

issues/35
error_code=21337, error:appkey permission denied是啥意思 帐号已经审核通过了。 在http://open.weibo.com/wiki/Error_code错误代码里也没找到

8月初我也遇到这个问题,当时我用的是在另一个app正在用的分享代码,sdk是2.0。

换了新申请成功的新的app的账号和回调地址,登录授权后总提示Fail to received access token字样,网上搜到的方法都无法解决,有个说过几天好了,那等等看。

等到9月了,依然是这个问题。查了log,发现weibo返回的是这个错误21337,网上说法是,新申请的app,只能用新的jar, 旧的不能用了。旧的账号用旧的jar就可以。

于是看了下最新的sdk,瀑布汗,改得都api跟微信api一个样了,这代价是几乎完全重做分享模块的新浪部分啊,坑爹啊有木有?!

一开始想是不是传闻中parseInt的问题,反编译看了下sdk2.0的,好吧,jar里的已经是parseLong了,网上那堆搜搜就贴代码的大神还是洗洗睡吧。

结果,不知被新浪坑死了,还是被新浪的“官方sdk”坑死了。


新注册的不能用0714的sdk 因为不再支持直接返回access_token,只能走服务端验证流程先获取code,再去换accesstoken。0821版本sdk不能用,因为api大改并只支持sso,没装则会提示安装新浪微博客户端;0806版本部分可用,api部分不可用因为替换成sso的调用方式了,所以应用0714的api的代码+0806的登陆授权代码,并用反射设置两个私有静态字段,再签名。。。。。。

1
weibo = Weibo.getInstance(APP_KEY, REDIRECT_URL, SCOPE); setStaticStringField(Weibo.class, "app_secret", APP_SECRET); setStaticStringField(Weibo.class, "mPackageName", getPackageName(activity));

原来的StatusAPI和WeiboAPI复制出来,就成功在装了和没装新浪客户端的机子上分享微博

新浪微博Weibo_SDK的0714和0806的源码,可以在github上找到,注意是commit历史那里

源代码没改,用了0806的,用反射篡改了几个值

大概是0704左右的版本 有StatusAPI等一堆API的辅助类,不过0806版本删掉了这部分,demo的api会检查是否安装新浪微博客户端。

所以不要用0806的发微薄API, 把0704那堆API类复制到自己的代码目录里来用。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
final String SCOPE = "direct_messages_write";
weibo = Weibo.getInstance(APP_KEY, REDIRECT_URL, SCOPE);
BeanRefUtil.setStaticStringField(Weibo.class, "app_secret", APP_SECRET);
BeanRefUtil.setStaticStringField(Weibo.class, "mPackageName", getPackageName());
// BeanRefUtil.java
import java.lang.reflect.Field;
public class BeanRefUtil {
public static String getStaticStringField(Class cls, String fieldName) {
try{
Field field = cls.getDeclaredField(fieldName);
field.setAccessible(true);
return (String)field.get(null);
}catch (NoSuchFieldException e){
return null;
}catch (IllegalAccessException e){
return null;
}
}
public static boolean setStaticStringField(Class cls, String fieldName, String value) {
try{
Field field = cls.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(null, value);
return true;
}catch (NoSuchFieldException e){
return false;
}catch (IllegalAccessException e){
return false;
}
}
}