实现微信登录可划分为三步:
1.首先获取微信授权,微信授权成功后会返回一个code到WXEntryActivity中的onResp方法中去
2.通过上一步获取到的code来请求微信接口获取到accessToken和openId。
请求接口:
https://api.weixin.qq.com/sns/oauth2/access_token? appid=AppID&secret=AppSecret&code=code&grant_type= authorization_code"
3.再通过第二部获取到的accessToken和openId来请求另一个微信接口从而获取到微信的用户信息来实现登录功能
具体步骤如下:
1.在Android studio中添加依赖 :
implementation compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
或
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
2.在AndroidManifest.xml文件中添加所需要的权限:
3.在项目的包名下创建名为wxapi包,然后再在此包下创建名为WXEntryActivity并继承自Activity,再实现IWXAPIEventHandler接口重写onRep和onResp方法(此activity是一个比叫特殊的类没有布局文件,微信所有的回调都是通过这个activity来实,没有设置布局文件,通常设置一个透明的主题,它的任务干完后就直接finish掉)。最后,还需要在AndroidMnifest.xml中注册activity添加代码如下:
4.准备工作做完下面开始实现微信登录:
首先在WXEntryActivity的onCreate方法中做初始化工作
//通过WXAPIFactory工厂获取IWXApI的示例
api = WXAPIFactory.createWXAPI(this, APP_ID, true);
//将应用的appid注册到微信
api.registerApp(APP_ID);
api.handleIntent(this.getIntent(), this);
然后处理微信授权后的回调
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK: {
if (baseResp instanceof SendAuth.Resp) {
SendAuth.Resp newResp = (SendAuth.Resp) baseResp;
//获取微信返回的code
final String code = newResp.code;
Log.e(TAG, "微信返回的CODE: " + code);
break;
}
case BaseResp.ErrCode.ERR_USER_CANCEL: {
//用户取消登录
break;
}
case BaseResp.ErrCode.ERR_BAN: {
//如果点击微信登录按钮没有调起微信授权界面,并且一直回调到这里,那很可能是手机问题,可以尝试重启手机
break;
}
default:{
break;
}
}
finish();
}
5.最后在上面的集成工作完成后后就可以在起它的activity中发起微信登录的请求,执行代码如下:
api = WXAPIFactory.createWXAPI(getActivity(), Constants.APP_ID, false); api.registerApp(APP_ID); if (api != null && api.isWXAppInstalled()) { SendAuth.Req req = new SendAuth.Req(); /* 授权作用域(scope)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应scope的权限后, 使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。 如获取用户个人信息则填写snsapi_userinfo */ req.scope = "snsapi_userinfo"; /* 用于保持请求和回调的状态,授权请求后原样带回给第三方。 该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 */ req.state = "wechat_sdk_demo"; api.sendReq(req); }else { Toast.makeText(getActivity(), "用户未安装微信", Toast.LENGTH_SHORT).show(); }
微信授权成功拿到code后就可通过上面提到的接口发送get请求获取用户信息来实现登录功能了。
代码中出现的AppID和AppSecret是在微信开放平台申请微信登录获取的