发现很多朋友都遇到这个问题,我把我在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()); 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; } } }
|