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 plaincopy
  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 plaincopy
  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. 記錄之,幫助後來人~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章