新浪微薄分享一(授權)

閒來無事,想把項目中用到的第三方組件總結一下,省的以後用到還得重新學習。接下來的一系列文章涉及到的第三方組件有新浪、騰訊、微信等第三方分享和登錄,支付寶,個推等。

今天先說一下新浪微薄分享之授權。因爲我們一個項目中一般設計到的分享都有好幾種,如果都引用對應的sdk的話項目相對比較大。另外sdk官方都推出了Demo,使用起來也比較簡單,所以我們這裏講的都是網頁接入。


無論是分享還是登錄,首先要做的都是獲得用戶授權。授權目前有兩種方式,我們先講目前推薦的方式,主要分爲二步

第一步:請求授權,獲取Code

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.auth);
		web = (WebView) findViewById(R.id.web);
		StringBuffer sb = new StringBuffer("https://open.weibo.cn/oauth2/authorize");
		sb.append("&client_id=" + Constant.TENCONNECT_APP_ID);
		try {
			sb.append("&redirect_uri=" + URLEncoder.encode(Constant.TENCONNECT_REDIRECT_URL, "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		sb.append("&display=mobile");

		web.getSettings().setJavaScriptEnabled(true);
		web.setWebViewClient(new WebViewClient() {

		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) { 
		//這裏獲取的url=http://www.myaddress.com/?code=6f59f37d0212ee969cdc943aa9af9443
			String code = getCodeBySubUrl(url);//通過截取url獲取code
			getAccessToken(code);//第二步獲取accessToken
		});
		web.loadUrl(sb.toString());
	}
第二步:通過code,發送post請求,獲取授權accessToken

public void getAccessToken(final String code) {

	new AsyncTask<Object, Object, String>() {

			@Override
			protected Json doInBackground(Object... params) {
 				Map<String,String> parameters = new HashMap<String, String>
				parameters.put("client_id", client_id);
				parameters.put("client_secret", Contents.REGISTERED_REDIRECT_URI);
				parameters.put("grant_type", "authorization_code");
				parameters.put("code", code);
				parameters.put("redirect_uri",redirect_uri);
				byte[] b = HttpClientConnector.getInstance(AuthWebActivity.this).requestByPost("https://api.weibo.com/oauth2/access_token",parameters);
				String result = new String(b);
				LogInfo.i(TAG, result);
				Json json = new Json(result);
				return json;
			}

			@Override
			protected void onPostExecute(Json result) {
			
				if (result != null) {
					String accessToken = result.getString("access_token");	
				}
				super.onPostExecute(result);
			}

		};

}.execute()


再來講第二種方式,此種方式可能考慮到安全問題,新浪的api文檔上已經沒有了,但是依然可以使用,較第一種來說比較簡單,只要加上一個字段一步就搞定了。

就是response_type=token,代碼如下:

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.auth);
		web = (WebView) findViewById(R.id.web);
		StringBuffer sb = new StringBuffer("https://open.weibo.cn/oauth2/authorize");
		sb.append("&client_id=" + Constant.TENCONNECT_APP_ID);
		try {
			sb.append("&redirect_uri=" + URLEncoder.encode(Constant.TENCONNECT_REDIRECT_URL, "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
                sb.append("&display=mobile");
		sb.append("&response_type=token");

		web.getSettings().setJavaScriptEnabled(true);
		web.setWebViewClient(new WebViewClient() {

		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) { 
		//這裏獲取的url=http://www.myaddress.com/#access_token=2.00JjjRvC3BVyOD9ca2d6e2a2QbkbUE&remind_in=2625243&expires_in=2625243&uid=2678744171 
//然後通過字符串截取獲取access_token即可
			
		});
		web.loadUrl(sb.toString());
	}







發佈了75 篇原創文章 · 獲贊 9 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章