文章目录
- 微信登陆
- 1.注册
- 2.创建移动应用
- 3.接入流程
- [0]添加依赖
- [1] AndroidManifest.xml 设置
- [2] 注册到微信
- [3] 发送请求或响应到微信
- [4] 接收微信的请求及返回值
- 4.未注册的应用临时调试
- QQ登陆
- 1.注册
- 2.创建移动应用
- 3.接入流程
- [0]添加依赖
- [1] AndroidManifest.xml 设置
- [2] 注册到QQ
- [3] 接收QQ的返回值
- 新浪微博登陆
- 1.注册
- 2.创建移动应用
- 3.接入流程
- [0]添加依赖
- [1] AndroidManifest.xml 设置
- [2] 注册到微博
第三方登陆都要求去对应的开放平台注册,并提交应用程序的相关信息,审核通过后都会返回一个
APP_ID
,
APP_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
。可以在程序入口Activity
的onCreate
回调函数处,或其他合适的地方将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] 发送请求或响应到微信
现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI
的 sendReq
和 sendResp
两个方法来实现。
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通过SendAuth
的Resp
返回数据给调用方的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
, 其中包含OpenId
, AccessToken
等重要数据。
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
或者Fragment
的onActivityResult
方法中添加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中的签名文件和包名进行测试。