Android-0.第三方登录简介


第三方登陆都要求去对应的开放平台注册,并提交应用程序的相关信息,审核通过后都会返回一个 APP_IDAPP_ID会和gradle中的 applicationId以及 signingConfigs中的 签名文件存在唯一映射关系,也就是说要使用第三方登陆成功, applicationId签名文件均不可改变。

微信登陆

1.注册

登录 微信开放平台 注册,如果使用QQ邮箱注册,需要先把QQ邮箱和微信解绑(微信设置–帐号与安全–更多安全设置–邮件件地址),不然会提示邮箱已被占用。

2.创建移动应用

进入 管理中心 点击 创建移动应用,审核通过得到APP_ ID。。

应用中需要图片, 可以直接使用PS生成28 * 28像素或108 * 108像素图片,选择图像—图像大小—重定分辨率—更改像素,保存即可。

点击进入下一步,提交审核即可,其中应用签名处的数字由签名生成工具生成。
获取方式如下:
将工具安装在手机上,1.运行。 2.输入下图中的应用包名。 3.点击Get Signature

注意应用签名applicationId以及你使用的签名文件相关,也就是文章最开始提到的映射关系,所以最好统一使用release的签名文件, 不然有可能debug下正常而release无法运行,release使用签名文件请参看生成签名文件并解决Release下APK is not
signed问题

3.接入流程

安卓接入指南

[0]添加依赖

在build.gradle文件中,添加如下依赖即可:

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

或者

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

(其中,前者包含统计功能)
或者下载ibammsdk.jar导入。

[1] AndroidManifest.xml 设置

添加必要的权限支持:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
[2] 注册到微信

要使程序启动后微信终端能正常响应,必须在代码中向微信终端注册APP_ID。可以在程序入口ActivityonCreate回调函数处,或其他合适的地方将APP_ID注册到微信:

	 final String APP_ID = "wx8888888888";
            //  IWXAPI是第三方app和微信通信的openapi接口,通过WXAPIFactory工厂,获取IWXAPI的实例
            IWXAPI api = WXAPIFactory.createWXAPI(mActivity, APP_ID);
            if (!api.isWXAppInstalled()) {
                Toast.makeText(mActivity, "请安装微信App", Toast.LENGTH_SHORT).show();
                return;
            }
            if (!api.isWXAppSupportAPI()) {
                Toast.makeText(mActivity, "不支持微信登录", Toast.LENGTH_SHORT).show();
                return;
            }
            mActivity.mLoginFragment.freshLoginingState();
            // 将应用的appid注册到微信
            api.registerApp(APP_ID);

其中APP_ID由微信审核通过你的程序后提供。

[3] 发送请求或响应到微信

现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPIsendReqsendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。

boolean sendResp(BaseResp resp);

sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。
以下代码用于获取用户个人信息:

final SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "appId";
            api.sendReq(req);

点击此处查看示例说明。
SendAuth.Req参数说明:

参数		是否必须			说明
appid	是	应用唯一标识,在微信开放平台提交应用审核通过后获得
scope	是	应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
state	否	用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
[4] 接收微信的请求及返回值

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:
a. 在应用包名目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity:

特别注意,一定要是应用包名+wxapi,它是你在微信注册填写的应用包名,也即是gradle中的applicationId

并在manifest文件里面加上exported属性,设置为true

        <activity
            android:name=".third.wxapi.WXEntryActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoDisplay" />

b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。
c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法:调用 api.handleIntent(getIntent(), this);

WXEntryActivity 的完整示例如下:

public class WXEntryActivity  extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        api = WXAPIFactory.createWXAPI(this, DConst.WEIXIN_APP_ID);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        finish();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        setIntent(intent);
        api.handleIntent(intent, this);
    }

    // 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq req) {
        finish();
    }

    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
            SendAuth.Resp tmpResp = (SendAuth.Resp) resp;
            // 这里得到微信返回的数据,根据errCode判断是否授权成功
            //参看紧接着代码下面的说明
        }

        finish();
    }
}

要注意在onCreate中再次调用了 api = WXAPIFactory.createWXAPI(this, DConst.WEIXIN_APP_ID);初始化。
用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuthResp返回数据给调用方的public void onReq(BaseReq req) ,如上代码所示。
如果上次微信已授权成功,它的登陆界面会一闪而过,这和QQ,微博登陆有所不同,QQ, 微博每次都会显示登陆界面。

返回值	说明
ErrCode	ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权) ERR_USER_CANCEL = -2(用户取消)
code	用户换取access_token的code,仅在ErrCode为0时有效
state	第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
lang	微信客户端当前语言
country	微信用户当前国家信息

4.未注册的应用临时调试

如果你想在另一个未注册的应用B上增加微信登陆功能,但是在微信上注册需要审核时间。为了快速验证代码,你可能需要借助已注册的应用来验证:
假定你已注册了应用包名com.a.atest,你注册时使用的签名文件为1.keystore

可以临时调整未注册的应用B以下几点进行验证:
1.gradle中的applicationId临时修改为com.a.atest
2.使用相同的签名文件1.keystore
3.单独建立com.a.atest.wxapi,在里面创建WXEntryActivity



QQ登陆

1.注册

登陆QQ开放平台,直接使用QQ登陆即可,然后点击QQ头像,跳转到QQ互联开发者信息页,验证邮箱即可完成注册。

2.创建移动应用

进入 应用管理 点击 移动应用创建应用,审核通过得到APP_ ID

3.接入流程

创建并配置工程
QQ登录和注销
API调用说明

[0]添加依赖

下载sdk解压在libs文件夹中得到open_sdk_rxxxx_lite.jar,将它导入到工程。

[1] AndroidManifest.xml 设置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
	// .....................................
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="tencent101432020" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 
 <application>
[2] 注册到QQ

Tencent是SDK的功能入口,所有的接口调用都得通过Tencent进行调用。因此,调用SDK,首先需要创建一个Tencent实例,其代码如下:

	   // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
            // 其中APP_ID是分配给第三方应用的appid,类型为String。
            Tencent tencent = Tencent.createInstance(DConst.QQ_APP_ID, mActivity);
            if (!tencent.isSessionValid()) {
                mActivity.mLoginFragment.freshLoginingState();
                tencent.login(mActivity, "get_simple_userinfo,get_user_info,add_topic,upload_pic,add_share", this);
            }
tencent.login参数说明如下:
参数	        参数说明
activity	调用者activity。应用使用SDK时,会从应用自己的Activity跳转到SDK的Activity,应用调用SDK的Activity即为这里的调用者activity。
scope	    应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”
listener	回调API,IUiListener实例。

同时重载onActivityResult

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        Tencent.onActivityResultData(requestCode, resultCode, data, mLoginInterfaceImpl);
        super.onActivityResult(requestCode, resultCode, data);
    }
[3] 接收QQ的返回值

登录成功后调用IUiListener接口中的public void onComplete(JSONObject arg0) 回传的JsonObject, 其中包含OpenIdAccessToken等重要数据。

  public void onComplete(Object o) {
        JSONObject jsonObject = (JSONObject) o;
        String access_token = null, openid = null;
        try {
            access_token = jsonObject.getString("access_token");
            openid = jsonObject.getString("openid");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        TapLogin.inst().union_qqAcount(access_token,openid);
    }
    @Override
    public void onError(UiError uiError) {
        mActivity.mLoginFragment.resetInitState();
        mActivity.mLoginFragment.errorMsg("授权失败:"+ uiError.errorMessage);
    }

    @Override
    public void onCancel() {
        mActivity.mLoginFragment.resetInitState();
        mActivity.mLoginFragment.errorMsg("取消登录");
    }

QQ登陆流程一定要注意不要忘记对onActivityResult的处理。



新浪微博登陆

1.注册

登陆微博开放平台,点击头像,选择编辑开发者信息,提交,同样需要上传身份证。

2.创建移动应用

点击移动应用,创建新应用,审核通过得到APP_ ID

3.接入流程

SDK下载
Android SDK说明文档

[0]添加依赖

在根目录的build.gradle中设置中央仓库:

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://dl.bintray.com/thelasterstar/maven/" }
    }
}

在需要引入SDK的module目录的build.gradle中引入sdk-core依赖:

implementation 'com.sina.weibo.sdk:core:4.1.0:openDefaultRelease@aar'

最新版的4.3.6把WeiboPageUtils都砍了,会导致官方demo的分享功能都无效。

[1] AndroidManifest.xml 设置

添加必要的权限支持:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
[2] 注册到微博

SDK中有三种模式的授权方案:
1.AuthorizeClientSSo:只通过微博客户端进行授权

mSsoHandler.authorizeClientSso(new SelfWbAuthListener());

2.AuthorizeWeb:通过SDK自带的WebView打开H5页面进行授权

mSsoHandler.authorizeWeb(new SelfWbAuthListener());

3.Authorize:如果安装了微博客户端则通过客户端授权,否则通过Web方式授权

mSsoHandler.authorize(new SelfWbAuthListener());

SelfWbAuthListener:授权结果回调,实现WbAuthListener接口

    private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener{
        @Override
        public void onSuccess(final Oauth2AccessToken token) {
            mActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAccessToken = token;
                    if (token.isSessionValid()) {
                        // 保存 Token 到 SharedPreferences
                        AccessTokenKeeper.writeAccessToken(mActivity, mAccessToken);
                        Toast.makeText(mActivity, "授权成功", Toast.LENGTH_SHORT).show();

                        mActivity.finish();
                    }
                }
            });
        }

        @Override
        public void cancel() {
            Toast.makeText(mActivity, "取消授权", Toast.LENGTH_LONG).show();
            mActivity.mLoginFragment.resetInitState();
        }

        @Override
        public void onFailure(WbConnectErrorMessage errorMessage) {
            Toast.makeText(mActivity, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();
            mActivity.mLoginFragment.resetInitState();
        }
    }

要接受到授权的相关数据,必须在当前Activity或者FragmentonActivityResult方法中添加SSOhandler的回调:

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

微博的接入细节具体可以直接参看它的官方demo
可以直接使用它的demo中的签名文件和包名进行测试。

参考:
https://blog.csdn.net/wusj3/article/details/82660348
https://blog.csdn.net/u013451048/article/details/52348751
https://www.cnblogs.com/chaotianque/p/7717866.html
https://www.cnblogs.com/chaotianque/p/7717866.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值