Android 第三方登录之新浪微博授权登录

Android第三方登录的优点有很多,这里先简单略过,后续再补充。先写微博,其他的慢慢补充

新浪微博授权登录

新浪微博开放平台

新浪微博Android SDK

主要流程如下:

这里只是写了一下程序的逻辑,前期的注册申请工作可以参考官网,或者直接点这里:新手指南

/**
 * 微博账号登录授权流程
 * 1.   集成SDK,修改主目录和主模块下面的build.gradle文件,添加微博sdk的依赖
 * 2.   创建Constants接口,定义新浪微博授权时所需要的参数(APP_KEY,REDIRECT_URL,SCOPE权限)
 * 3.   创建微博API接口类对象 初始化WbSdk对象(在应用的Application或者调用SDK功能代码前)
 * 4.   实现WbAuthListener接口
 * 5.   调用方法,认证授权
 * 6.   添加SSOhandler的回调,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack}
 */

下面上代码,先是接口

/**
 * 该接口定义了新浪微博授权时所需要的参数
 */
public interface Constants {

    /**当前该 APP 使用的 APP_KEY ,其他应用使用需要替换*/
    public static final String APP_KEY = "396518504";


    /**
     * 当前应用的回调页
     *
     * <p>
     * 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响,
     * 但是没有定义将无法使用 SDK 认证登录。
     * 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
     * </p>
     */
    public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";


    /**
     * Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。通过 Scope,平台将开放更多的微博
     * 核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新 OAuth2.0 授权页中有权利
     * 选择赋予应用的功能。
     *
     * 我们通过新浪微博开放平台-->管理中心-->我的应用-->接口管理处,能看到我们目前已有哪些接口的
     * 使用权限,高级权限需要进行申请。
     *
     * 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。
     *
     * 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
     * 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope
     */
    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";

//    public static final String SCOPE = null;  //为null时会出现没有点击确定就自动授权成功的情况
}

然后是Activity

public class WBAuthActivity extends Activity {

    private SsoHandler ssoHandler;
    private Oauth2AccessToken mAccessToken;     // 封装了 "uid", "access_token","expires_in","refresh_token",并提供了他们的管理功能

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AuthInfo authInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
        WbSdk.install(this, authInfo);

        ssoHandler = new SsoHandler(WBAuthActivity.this);           //创建微博实例,认证授权

        // SSO认证授权 仅客户端
//        ssoHandler.authorizeClientSso(new SelfWbAuthListener());
        // Web授权 没有客户端,网页授权
//        ssoHandler.authorizeWeb(new SelfWbAuthListener());
        // SSO 授权+Web 授权 混合授权
        ssoHandler.authorize(new SelfWbAuthListener());

        // 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,第一次启动本,AccessToken 不可用
        mAccessToken = AccessTokenKeeper.readAccessToken(WBAuthActivity.this);
        if (mAccessToken.isSessionValid()){
            updateTokenView(true);
        }
    }

     /** 微博认证授权回调类 */
    public class SelfWbAuthListener implements WbAuthListener{

        @Override
        public void onSuccess(final Oauth2AccessToken oauth2AccessToken) {

            WBAuthActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAccessToken = oauth2AccessToken;
                    if (mAccessToken.isSessionValid()){
                        //显示 mAccessToken
                        updateTokenView(false);
                        //保存 mAccessToken 到 SharedPreferences
                        AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
                        Toast.makeText(WBAuthActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }

        @Override
        public void cancel() {
            Toast.makeText(WBAuthActivity.this, "取消授权", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(WbConnectErrorMessage wbConnectErrorMessage) {
            Toast.makeText(WBAuthActivity.this, "授权失败:" + wbConnectErrorMessage.getErrorMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 显示当前 Token 信息
     * @param hasExisted 配置文件中是否存在 Token 信息并且合法
     */
    public void updateTokenView(boolean hasExisted){

        String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date(mAccessToken.getExpiresTime()));
        String format = "Token:%1$s \n有效期:%2$s \nUid:%3$s";
        String message = String.format(format, mAccessToken.getToken(), date, mAccessToken.getUid());
        if (hasExisted){
            message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;
        }
        Log.e("WBAuthActivity", message);
    }

    //用户登出
    public void loginOut(){
        AccessTokenKeeper.clear(getApplicationContext());
        mAccessToken = new Oauth2AccessToken();
        updateTokenView(false);
    }

    //更新Token
    public void refreshToken(){
        if (!TextUtils.isEmpty(mAccessToken.getRefreshToken())){
            AccessTokenKeeper.refreshToken(Constants.APP_KEY, WBAuthActivity.this, new RequestListener() {
                @Override
                public void onComplete(String s) {

                }

                @Override
                public void onWeiboException(WeiboException e) {

                }
            });
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (ssoHandler != null){
            ssoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("WBAuthActivity", "======WBAuthActivity onDestroy=====");
    }
}

最后,贴上第三方登录之支付宝登录,需要的朋友可以参考

猜你喜欢

转载自blog.csdn.net/fitaotao/article/details/82690725