您的位置:首页 > 其它

学习笔记之——新浪微博第三方登录分享接口

2016-08-19 15:47 429 查看
        新浪微博第三方登录分享接口算是开发项目中遇到比较难以搞定的第三方登录接口,API文档说明详细,但是有些BUG却只能自己摸索解决办法,特写此文存档,方便以后再用之时可查阅。

       以下为开发步骤和注意事项:

新浪微博SDK的使用

官网:http://open.weibo.com/

Demo:https://github.com/sinaweibosdk/weibo_android_sdk

1) 


登录 login signin auth 授权

package 包名

sign 签名 (例如:b4ffe24cc9fd9795ccf466006f445266)

输入包名获取签名的软件在官网创建应用的时候有链接可下载


appkey (例如:3931573859)

解决:

a) 创建应用并获得Appkey



b) 生成签名



注意: 项目需要先安装到模拟器中



c) 修改appkey



2) 认证失败



21322 : 重定向地址不匹配

重定向地址:

解决

a) 修改高级信息--->回调页



b) 修改代码中的回调页





4. 集成微博SDK,获得Token的步骤

1) 项目依赖库

2) 拷贝清单中的权限



3) 在清单中注册微博登录的Activity



4) 在微博网站的应用信息中填写包名、签名



5) 参考微博Demo的WBAuthActivity.java类拷贝

5. 获得当前登录微博的用户信息



http://open.weibo.com/wiki/2/users/show

6. 分享

接口文档:http://open.weibo.com/wiki/2/statuses/update

POST请求接口测试工具

Chrome插件 PostMan

http://www.atool.org/httptest.php





常见问题:

1. 


使用微博SDK时,运行FC

原因:微博的库中没有.so文件

解决:将WeiBoDemo项目中的所有so文件和目录都移动到weiboSDK库中



   最后上项目中直接运用的干货咯!可以封装起来,持续使用:

        在官方demo中复制以下两个类到项目中

package com.bankbbs.sina;

/**
* @author SINA
* @since 2013-09-29
*/
public interface ConstantsInterface {

public static final String APP_KEY  = "1742252744";

public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";

public static final String SCOPE =
"email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," + "invitation_write";
}
package com.bankbbs.sina;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

import com.sina.weibo.sdk.auth.Oauth2AccessToken;

/**
* 该类定义了微博授权时要的参数
*
* @author SINA
* @since 2013-10-07
*/
public class AccessTokenKeeper {
public static final String PREFERENCES_NAME = "com_weibo_sdk_android";

public static final String KEY_UID           = "uid";
public static final String KEY_ACCESS_TOKEN  = "access_token";
public static final String KEY_EXPIRES_IN    = "expires_in";
public static final String KEY_REFRESH_TOKEN    = "refresh_token";

/**
* 保存 Token 对象 SharedPreferences
*
* @param context 应用程序上下文环
* @param token   Token 对象
*/
public static void writeAccessToken(Context context, Oauth2AccessToken token) {
if (null == context || null == token) {
return;
}

SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
Editor editor = pref.edit();
editor.putString(KEY_UID, token.getUid());
editor.putString(KEY_ACCESS_TOKEN, token.getToken());
editor.putString(KEY_REFRESH_TOKEN, token.getRefreshToken());
editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime());
editor.commit();
}

/**
*  SharedPreferences 读取 Token 信息
*
* @param context 应用程序上下文
*
* @return 返回 Token 对象
*/
public static Oauth2AccessToken readAccessToken(Context context) {
if (null == context) {
return null;
}

Oauth2AccessToken token = new Oauth2AccessToken();
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
token.setUid(pref.getString(KEY_UID, ""));
token.setToken(pref.getString(KEY_ACCESS_TOKEN, ""));
token.setRefreshToken(pref.getString(KEY_REFRESH_TOKEN, ""));
token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0));

return token;
}

/**
* 清空 SharedPreferences Token信息
*
* @param context 应用程序上下文环
*/
public static void clear(Context context) {
if (null == context) {
return;
}

SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
Editor editor = pref.edit();
editor.clear();
editor.commit();
}
}
然后写方法initWBSDK() 在onCreate中调用,写loginWeiBo()在登录按钮中调用:

/* *******************微博第三方登录开始*******************************/

/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
private AuthInfo mAuthInfo;
private SsoHandler mSsoHandler;
private String token;

private void loginWeiBo()
{
// SSO 授权, ALL IN ONE 如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权
mSsoHandler.authorize(new AuthListener());
}

private void initWBSDK() {
// 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
mAuthInfo = new AuthInfo(this, ConstantsInterface.APP_KEY, ConstantsInterface.REDIRECT_URL, ConstantsInterface.SCOPE);
mSsoHandler = new SsoHandler(LoginActivity.this, mAuthInfo);
// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
SharedPreferences pref = getSharedPreferences(AccessTokenKeeper.PREFERENCES_NAME, Context.MODE_APPEND);
String uid = pref.getString(AccessTokenKeeper.KEY_UID, "");
token = pref.getString(AccessTokenKeeper.KEY_ACCESS_TOKEN, "");
// 第一次启动本应用,AccessToken 不可用
mAccessToken = AccessTokenKeeper.readAccessToken(this);
if (mAccessToken.isSessionValid()) {
updateTokenView(true);
}
}

/**
* 显示当前 Token 信息。
*
* @param hasExisted
*            配置文件中是否已存在 token 信息并且合法
*/
private void updateTokenView(boolean hasExisted) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new java.util.Date(mAccessToken.getExpiresTime()));
String format = getString(R.string.weibosdk_demo_token_to_string_format_1);

String message = String.format(format, mAccessToken.getToken(), date);
if (hasExisted) {
message = getString(R.string.weibosdk_demo_token_has_existed) + "\n" + message;
}
}

/**
* 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用
* {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO
* 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到
* SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {

@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView(false);

// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(LoginActivity.this, mAccessToken);
Toast.makeText(LoginActivity.this, R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();
} else {
/* 以下几种情况,您会收到 Code:
1. 当您未在平台上注册的应用程序的包名与签名时;
2. 当您注册的应用程序包名与签名不正确时;
3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。*/
String code = values.getString("code");
String message = getString(R.string.weibosdk_demo_toast_auth_failed);
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(LoginActivity.this, message, Toast.LENGTH_LONG).show();
}
}

@Override
public void onCancel() {
Toast.makeText(LoginActivity.this, R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
}

@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(LoginActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}

/**
* 当 SSO 授权 Activity 退出时,该函数被调用。
* TODO 如果没有重写此方法,授权可能失败
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

// SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResults
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
/* *******************微博第三方登录结束*******************************/
分享主要是如下一段代码(此处用SharedPreferences保存和获取是否登录的信息):

public void share()
{
SharedPreferences pref = getSharedPreferences(AccessTokenKeeper.PREFERENCES_NAME, Context.MODE_APPEND);
String uid = pref.getString(AccessTokenKeeper.KEY_UID, "");
String token = pref.getString(AccessTokenKeeper.KEY_ACCESS_TOKEN, "");
if (token.equals(""))
{
// 提示没有登录
Toast.makeText(this, "请先登录", Toast.LENGTH_LONG).show();
return;
}
String url = "https://api.weibo.com/2/statuses/update.json";
Map<String, String> params = new HashMap<String, String>();
params.put("access_token", token);
params.put("status", "测试分享微博 " + new Date().toString());
HTTPUtils.post(this, url, params, new ResponseListener()
{
@Override
public void onResponse(String arg0)
{
Toast.makeText(DetailActivity.this, "分享成功", Toast.LENGTH_LONG).show();
}

@Override
public void onErrorResponse(VolleyError arg0)
{
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: