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

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

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

新浪微博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. 获得当前登录微博的用户信息

6. 分享

POST请求接口测试工具
Chrome插件 PostMan


常见问题:
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)
			{
			}
		});
	}





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值