公司的应用需要一个分享功能,希望能够分享到新浪和腾讯的微博平台上去。要求比较简单,只是允许用户能够发一条我们预制好的微博即可。
新浪微博和腾讯微博都有各自的开放平台,平台上提供了丰富的api接口和详尽的说明文档。即使从来没有做过,借助这些资料和SDK上的Demo,都可以迅速上手。
本文将分两部分来各自介绍新浪和腾讯微博分享的流程和操作方法,仅为菜鸟童鞋们参考。其中最多的问题都来自于Oauth认证,而认证这部分最多的问题来自于腾讯微博,这一点我们后边再说。
由于新浪和腾讯采用的Oauth认证算法的版本不一样,腾讯使用的是Oauth1.0 ,尽管官方提供的SDK说已经支持Oauth2.0,但是我没有试验成功。
通过了认证,什么问题都会迎刃而解。
好了,废话不多说,正文开始。
一:Oauth认证简介
首先来说Oauth认证到底是个神马东西,简单来说就是一种授权的算法。可以保证第三方应用在不拿到用户微博的账号和密码的前提下,访问用户的微博信息,而这一切都需要用户的授权才可以,从而最大程度的保护用户账号和密码的安全。
认证步骤简述如下:
二:新浪微博应用申请及SDK下载1. 用户要使用第三方应用的微博服务,第三方应用首先向新浪微博请求身份验证。
2.服务器根据第三应用提供的APP Key和App Secret(密钥) ,核实是否是合法应用。
如果通过验证,返回第三方应用一个未授权的请求令牌(Request Token)。这个令牌告诉用户,此应用是合法滴。
3. 第三方应用拿着这个未授权的令牌,重定向到服务端的用户授权页,请求用户授权。这个授权页一定是服务端的,不允许第三方来构造。
4.用户输入授权账号和密码,提交服务端验证通过后,会向第三方应用返回授权的请求令牌和验证码等。
5.第三方应用在拿着授权的请求令牌去换取访问令牌(Access Token)。
6.服务器返回访问令牌
如下图所示:
三:动手开发测试1. 登录新浪微博开房平台,没有的话就注册一个。
2.创建一款手机应用,按照向导提示,输入相关信息即可。新浪会为你的应用分配一个独一无二的APP KEY和APP Secret 。将这两个东西保存好。
当然这只是我们自己申请测试的应用,在访问人数和次数上,会有一定的限制。如果你的应用需要正式上线运行,要提交新浪审核。
3.准备工作完成,去平台下载android版的SDK。
新浪微博的SDK包中含有一个简单的DEMO,可以发布一条微博,这对我们来说已近足够。我们主要使用它封装好的API。
1.SDK集成
将SDK包中的android.net.http,android.webket,com.weibo.net包拷贝到自己的项目目录下,这个不用多说。
2. 在AuthorizeActivity中,将APP KEY和App Secret替换成自己申请应用的APP KEY和App Secret。
3.按照文档介绍,手机的桌面应用使用隐式验证即可。其中Activity的重要代码按照如下编写即可。参见下载包中的微博SDK说明文档。
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.weibo.net.AccessToken;
import com.weibo.net.DialogError;
import com.weibo.net.Oauth2AccessToken;
import com.weibo.net.RequestToken;
import com.weibo.net.Weibo;
import com.weibo.net.WeiboDialogListener;
import com.weibo.net.WeiboException;
/**
* Sample code for testing weibo APIs.
*
* @author ZhangJie (zhangjie2@staff.sina.com.cn)
*/
public class AuthorizeActivity extends Activity {
/** Called when the activity is first created. */
private Button mLogin;
private TextView mToken;
private static final String URL_ACTIVITY_CALLBACK = "weiboandroidsdk://TimeLineActivity";
private static final String FROM = "xweibo";
// 设置appkey及appsecret,如何获取新浪微博appkey和appsecret请另外查询相关信息,此处不作介绍
// 替换为开发者的appkey,例"1646212960";
private static final String CONSUMER_KEY = "3543730096";
// 替换为开发者的appkey,例"94098772160b6f8ffc1315374d8861f9";
private static final String CONSUMER_SECRET = "765385b9d52ffd2fe548141d29f6d1af";
private String username = "";
private String password = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mToken = (TextView) this.findViewById(R.id.tvToken);
mLogin = (Button) this.findViewById(R.id.btnLogin);
mLogin.setText("oauth!");
mLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (v == mLogin) {
Weibo weibo = Weibo.getInstance();
weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET);
// Oauth2.0
// 隐式授权认证方式
// 此处回调页内容应该替换为与appkey对应的应用回调页
weibo.setRedirectUrl("http://www.sina.com");
// 对应的应用回调页可在开发者登陆新浪微博开发平台之后,
// 进入我的应用--应用详情--应用信息--高级信息--授权设置--应用回调页
// 进行设置和查看
// 应用回调页不可为空
weibo.authorize(AuthorizeActivity.this,
new AuthDialogListener());
// try {
// // Oauth2.0 认证方式
// Weibo.setSERVER("https://api.weibo.com/2/");
// Oauth2AccessToken at =
// weibo.getOauth2AccessToken(AuthorizeActivity.this,
// Weibo.getAppKey(), Weibo.getAppSecret(), username,
// password);
// // xauth认证方式
// /*
// * Weibo.setSERVER("http://api.t.sina.com.cn/");
// * AccessToken at =
// * weibo.getXauthAccessToken(TextActivity.this,
// * Weibo.APP_KEY, Weibo.APP_SECRET, "", "");
// * mToken.setText(at.getToken());
// */
// RequestToken requestToken =
// weibo.getRequestToken(AuthorizeActivity.this,
// Weibo.getAppKey(), Weibo.getAppSecret(),
// AuthorizeActivity.URL_ACTIVITY_CALLBACK);
// mToken.setText(requestToken.getToken());
// Uri uri =
// Uri.parse(AuthorizeActivity.URL_ACTIVITY_CALLBACK);
// startActivity(new Intent(Intent.ACTION_VIEW, uri));
//
// } catch (WeiboException e) {
// e.printStackTrace();
// } // mToken.setText(at.getToken());
//
}
}
});
}
public void onResume() {
super.onResume();
}
class AuthDialogListener implements WeiboDialogListener {
@Override
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
mToken.setText("access_token : " + token + " expires_in: "
+ expires_in);
AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET);
accessToken.setExpiresIn(expires_in);
Weibo.getInstance().setAccessToken(accessToken);
Intent intent = new Intent();
intent.setClass(AuthorizeActivity.this, TestActivity.class);
startActivity(intent);
}
@Override
public void onError(DialogError e) {
Toast.makeText(getApplicationContext(),
"Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onCancel() {
Toast.makeText(getApplicationContext(), "Auth cancel",
Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(getApplicationContext(),
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
}
}
常见问题:
新浪微博的使用还是比较顺利的,唯一遇到的下面的问题
error:redirect_uri_mismatch
这个是由于没有仔细看说明文档,文档中清楚的说明了使用隐式验证的时候,要设置应用回调页。设置方法在代码中也有。
登录新浪微博开放平台,新浪微博开放平台->我的应用->应用信息->高级应用->授权设置->应用回调页中的url地址保持一致就可以了,如图所示:
四:发一条微博
测试一下,运行app,发送一条带图片的微博。如下图
登录新浪微博,查看一下,试验成功!
原文地址:http://www.67tgb.com/?p=483
欢迎访问:http://www.67tgb.com