Android 新浪微博 授权失败 21337


新浪微博 android 开发中 oauth2 认证有两种 一种是code 一种的sso

code的一种 最常用 sso的需要安装新浪微博客户端3.0以上

刚申请的新应用复用以前的代码就报 permision denied,百思不得其解。新浪微博开发的不向前兼容的么,后来查看

得知,需要把授权参数从原来的  token  替换为code

      parameters.add("response_type", "code");

问题来了,得到code 如何换取 access_token呢

而开发中code方式 每次都需要授权 很繁琐,

所以就去官方问:如何授权后 得到Oauth2AccessToken

官方的回答是:请自行从CODE中获取Oauth2AccessToken

听到这句话 蛋都碎了一地


找了两个小时 终于找到 解决方法

通过这个URLhttps://api.weibo.com/oauth2/access_token 

POST过去后 返回JSON字符串 

JSON字符串中就有

access_token

expires_in

坑爹的是expires_in  是按秒计算的

而oauth2AccessToken.isSessionValid() 是按 毫秒计算的.....

哥又绕了20分钟才过去

半成品的API 伤不起啊!!

附上源代码:

AccessTokenKeeper类  主要用于访问 保存文件的

 
[java]  view plain copy
  1. public class AccessTokenKeeper {  
  2.     private static final String PREFERENCES_NAME = "com_weibo_sdk_android";  
  3.       
  4.     public static void keepAccessToken(Context context, Oauth2AccessToken token) {  
  5.         SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);  
  6.         Editor editor = pref.edit();  
  7.         editor.putString("token", token.getToken());  
  8.         editor.putLong("expiresTime", token.getExpiresTime());  
  9.         editor.commit();  
  10.     }  
  11.       
  12.     public static void clear(Context context){  
  13.         SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);  
  14.         Editor editor = pref.edit();  
  15.         editor.clear();  
  16.         editor.commit();  
  17.     }  
  18.   
  19.       
  20.     public static Oauth2AccessToken readAccessToken(Context context){  
  21.         Oauth2AccessToken token = new Oauth2AccessToken();  
  22.         SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);  
  23.         token.setToken(pref.getString("token"""));  
  24.         token.setExpiresTime(pref.getLong("expiresTime"0));  
  25.         return token;  
  26.     }  
  27. }  

MainActivity  住页面

[java]  view plain copy
  1. public class MainActivity extends Activity {  
  2.     private Weibo weibo;  
  3.     private static Oauth2AccessToken oauth2AccessToken;  
  4.       
  5.         @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         weibo = Weibo.getInstance(ConstantS.APP_KEY,ConstantS.REDIRECT_URL,ConstantS.SCOPE);  
  10.         MainActivity.oauth2AccessToken = AccessTokenKeeper.readAccessToken(this);  
  11.       
  12.         if (oauth2AccessToken!=null&&oauth2AccessToken.isSessionValid()) {//验证通过  
  13.             //跳向主页面  
  14.               String date = new java.text.SimpleDateFormat("yyyy/MM/dd hh:mm:ss")  
  15.               .format(new java.util.Date(MainActivity.oauth2AccessToken  
  16.                       .getExpiresTime()));  
  17.         Toast.makeText(this,"access_token 仍在有效期内,无需再次登录: \naccess_token:"  
  18.               + MainActivity.oauth2AccessToken.getToken() + "\n有效期:" + date,50000).show();  
  19.           
  20.           Intent intent=new Intent(MainActivity.this,LuoBoActivity.class);  
  21.           startActivity(intent);  
  22.         }  
  23.         else {  
  24.             weibo.anthorize(MainActivity.thisnew authdiloag());  
  25.               
  26.         }  
  27.           
  28.           
  29.       
  30.           
  31.         }  
  32.         class authdiloag implements WeiboAuthListener  
  33.     {  
  34.         @Override  
  35.         public void onComplete(Bundle values) {  
  36.               
  37.           
  38.             String code=values.getString("code");  
  39.               
  40.             //  AccessTokenKeeper.keepAccessToken(MainActivity.this, oauth2AccessToken);  
  41.               
  42.             if (code!=null) {  
  43.                 Toast.makeText(MainActivity.this"认证code成功"+code, Toast.LENGTH_SHORT).show();  
  44. //android 4.0以后访问HTTP必须异步处理  
  45.                 httpThread hThread=new httpThread(code);  
  46.                 Thread thread=new Thread(hThread);  
  47.                 thread.start();  
  48.                 Intent intent=new Intent(MainActivity.this,LuoBoActivity.class);  
  49.                 startActivity(intent);  
  50.             }  
  51.         }  
  52.         @Override  
  53.         public void onCancel() {  
  54.             }  
  55.     @Override  
  56.         public void onError(WeiboDialogError arg0) {  
  57.                 }  
  58.         @Override  
  59.         public void onWeiboException(WeiboException arg0) {  
  60.             }   }  
  61.           
  62.           
  63.         class httpThread implements Runnable  
  64.         {  
  65.             String code;  
  66.             public httpThread(String code)  
  67.             {  
  68.                 this.code=code;  
  69.             }  
  70.             @Override  
  71.             public void run() {  
  72.                 try {//key secret 在基本信息里 回调页面 在高级信息里  
  73.                     HttpPost post=new HttpPost(URI.create("https://api.weibo.com/oauth2/access_token?client_id=自己的APPKEY&client_secret=自己的SECRET&grant_type=authorization_code&redirect_uri=自己的回调页面&code="+code));  
  74.                     HttpClient httpClient=new DefaultHttpClient();  
  75.                     HttpResponse response= httpClient.execute(post);  
  76.                     if (response.getStatusLine().getStatusCode()==200) {  
  77.                           
  78.                             String temp=EntityUtils.toString(response.getEntity());  
  79.                               JSONObject o=new JSONObject(temp);   
  80.                             String access_token=o.getString("access_token");  
  81.                             String express_in=o.getString("expires_in");  
  82.                             //这里按照 毫秒计算  
  83.                             long time= Long.parseLong(express_in)*1000+ System.currentTimeMillis();  
  84.                             if (oauth2AccessToken==null) {  
  85.                                 oauth2AccessToken=new Oauth2AccessToken();  
  86.                             }  
  87.                             oauth2AccessToken.setExpiresTime(time);  
  88.                             oauth2AccessToken.setToken(access_token);  
  89.                               
  90.                             AccessTokenKeeper.keepAccessToken(MainActivity.this, oauth2AccessToken);  
  91.                     }  
  92.                 } catch (ClientProtocolException e) {  
  93.                     e.printStackTrace();  
  94.                 } catch (ParseException e) {  
  95.                     e.printStackTrace();  
  96.                 } catch (IOException e) {  
  97.                     e.printStackTrace();  
  98.                 } catch (JSONException e) {  
  99.                     e.printStackTrace();  
  100.                 }  
  101.             }  
  102.               
  103.         }  
  104.   
  105. }  
  106. 记录之,帮助后来人~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值