您的位置:首页 > 其它

新浪微薄分享一(授权)

2014-05-26 18:05 267 查看
闲来无事,想把项目中用到的第三方组件总结一下,省的以后用到还得重新学习。接下来的一系列文章涉及到的第三方组件有新浪、腾讯、微信等第三方分享和登录,支付宝,个推等。

今天先说一下新浪微薄分享之授权。因为我们一个项目中一般设计到的分享都有好几种,如果都引用对应的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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: