

下载地址~ http://download.csdn.net/detail/zhangnianxiang/4375685 新浪微博 曾经@微博API 新浪那边表示 旧版的Oauth 1.0a将在不久的2012.9.1号停止。这个是一个很苦的消息。意味着涉及微博的都要修改。 Oauth2.0相比较于Oauth1.0的话 流程少了很多,其中
下载地址~
http://download.csdn.net/detail/zhangnianxiang/4375685
新浪微博
曾经@微博API 新浪那边表示 旧版的Oauth 1.0a将在不久的2012.9.1号停止。这个是一个很苦逼的消息。意味着涉及微博的都要修改。
Oauth2.0相比较于Oauth1.0的话 流程少了很多,其中一点就是签名。之前都是用signpost这个开源项目辅助。现在完全可以去掉了
好吧。废话不说了。
新浪微博Oauth2.0认证的官方说明
http://open.weibo.com/wiki/Oauth2
简单步骤:1获取code 2获取accessToken 3使用accessToken访问api
新浪的这份授权机制还是比较详细。理解起来比较容易
| 接口 | 说明 |
|---|---|
| OAuth2/authorize | 请求用户授权Token |
| OAuth2/access_token | 获取授权过的Access Token |
| OAuth2/get_oauth2_token | OAuth1.0的Access Token更换至OAuth2.0的Access Token |
步骤1http://open.weibo.com/wiki/Oauth2/authorize
获取code
| 必选 | 类型及范围 | 说明 | |
|---|---|---|---|
| client_id | true | string | 申请应用时分配的AppKey。 |
| redirect_uri | true | string | 授权回调地址,站外应用需与设置的回调地址一致,站内应用需填写canvas page的地址。 |
| response_type | false | string | 返回类型,支持code、token,默认值为code。 |
| state | false | string | 用于保持请求和回调的状态,在回调时,会在Query Parameter中回传该参数。 |
| display | false | string | 授权页面的终端类型,取值见下面的说明。 |
https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
{
"access_token": "ACCESS_TOKEN",
"expires_in": 1234,
"remind_in":"798114",
"uid":"12341234"
}web=(WebView)findViewById(R.id.web); web.getSettings().setJavaScriptEnabled(true); web.getSettings().setSupportZoom(true); web.getSettings().setBuiltInZoomControls(true); web.setWebViewClient(new WebViewC());
WebviewClient
class WebViewC extends WebViewClient{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.v("aaa", "===onPageStarted==="+url);
if(url.contains("code=")){
try {
Intent intent = new Intent(Oauth2Activity.this,MainActivity.class);
Uri uri = Uri.parse(url);
String code = uri.getQueryParameter("code");
String openid =uri.getQueryParameter("openid");
String openkey=uri.getQueryParameter("openkey");
editor.putString(StatcParame.T_OPEN_ID, openid);
editor.putString(StatcParame.T_OPEN_KEY, openkey);
HttpClient httpclient=MyCountHttpClient.getNewHttpClient();
URI accessToken = null;
List parameters=new ArrayList();
//必须编码,否则无法向服务器发送微博
if(codeFlag==1){
parameters.add(new BasicNameValuePair("client_id", StatcParame.S_CONSUMER_KEY));
parameters.add(new BasicNameValuePair("client_secret", StatcParame.S_CONSUMER_SECRET));
parameters.add(new BasicNameValuePair("redirect_uri", StatcParame.S_CALLBACK));
accessToken = URI.create(StatcParame.S_API_access_token);
intent.putExtra("mode", 1);
}else if(codeFlag ==2){
parameters.add(new BasicNameValuePair("client_id", StatcParame.T_CONSUMER_KEY));
parameters.add(new BasicNameValuePair("client_secret", StatcParame.T_CONSUMER_SECRET));
parameters.add(new BasicNameValuePair("redirect_uri", StatcParame.T_CALLBACK));
accessToken = URI.create(StatcParame.T_API_access_token);
intent.putExtra("mode", 2);
}
parameters.add(new BasicNameValuePair("grant_type", "authorization_code"));
parameters.add(new BasicNameValuePair("code", code));
HttpPost post=new HttpPost(accessToken);
HttpResponse response=null;
post.setEntity(new UrlEncodedFormEntity(parameters ,HTTP.UTF_8) );
post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
response = httpclient.execute(post);
if(codeFlag==1){
JSON.GetOauth(sharedpre,Utils.getResponseText(response));
}else if(codeFlag==2){
String tempUrl = StatcParame.T_CALLBACK+"?"+Utils.getResponseText(response);
Uri temp = Uri.parse(tempUrl);
String access_token = temp.getQueryParameter("access_token");
String expires_in=temp.getQueryParameter("expires_in");
String name=temp.getQueryParameter("name");
editor.putString(StatcParame.T_ACCESS_TOKEN, access_token);
editor.putString(StatcParame.T_EXPIRES_IN, expires_in);
editor.putString(StatcParame.T_NAME, name);
editor.commit();
}
startActivity(intent);
Oauth2Activity.this.finish();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这个方法集合了sina和tencent的处理
这步走完就拿到ACCESSTOKEN了
下面贴个发布微博的方法
SINA发送一个带图片的微博
Weibo weibo = Weibo.getInstance();
AccessToken accessToken = new AccessToken(shared.getString(StatcParame.S_ACCESS_TOKEN, ""), StatcParame.S_CONSUMER_SECRET);
accessToken.setExpiresIn(shared.getString(StatcParame.S_EXPIRES_IN, ""));
weibo.setAccessToken(accessToken);
weibo.setupConsumerConfig(StatcParame.S_CONSUMER_KEY, StatcParame.S_CONSUMER_SECRET);
weibo.setRedirectUrl("http://www.sina.com.cn");
try {
String msg = URLEncoder.encode(body, HTTP.UTF_8);
WeiboParameters bundle = new WeiboParameters();
bundle.add("status", msg);
bundle.add("pic", "/sdcard/1.jpg");
String rlt = "";
String url = Weibo.SERVER + "statuses/upload.json";
Utility.setAuthorization(new Oauth2AccessTokenHeader());
rlt = weibo.request(context, url, bundle, Utility.HTTPMETHOD_POST, weibo.getAccessToken());
Toast.makeText(context, rlt, 1000).show();
Log.v("aaa","Successfully upload the status to ["+ rlt+ "].");
return "OK";
} catch (Exception e1) {
e1.printStackTrace();
}TENCent发送一条微博
OAuthV2 oAuth =new OAuthV2();
oAuth.setAccessToken(shared.getString(StatcParame.T_ACCESS_TOKEN, ""));
oAuth.setOauthVersion("2.a");
oAuth.setClientIP("117.25.173.11");
oAuth.setOpenid(shared.getString(StatcParame.T_OPEN_ID, ""));
oAuth.setOpenkey(shared.getString(StatcParame.T_OPEN_KEY, ""));
oAuth.setClientId(StatcParame.T_CONSUMER_KEY);
oAuth.setClientSecret(StatcParame.T_CONSUMER_SECRET);
try {
TAPI api = new TAPI("2.a");
String respone = api.add(oAuth, "json","abcc","117.25.173.11","","","0");
Toast.makeText(context, respone, 1000).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}源码之后上传。
联系 zhangnianxiang@gmail.com
