您的位置:首页 > 移动开发 > 微信开发

学习笔记-微信授权登录

2017-08-08 16:09 351 查看
        现在几乎所有的APP 都会在登录页面设置QQ 或者 微信快捷登录方式,本篇文章主要分享一点博主做微信登录的过程,作为经验积累.做微信登录和微信支付都需要引入 微信的SDK ,本文在此不作多的 描述,直入 主题了,至于怎么去微信开放平台申请 开发者号和 APPID , SCREAT_KEY 大家可以去看官方文档;

 1. 接入 微信 sdk ,博主用的 是

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


  然后判断手机上是否安装了 微信客户端

private boolean isWeixinAvilible(LoginActivity loginActivity) {
final PackageManager packageManager = loginActivity.getPackageManager();
//  获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
//   获取所有已安装程序的包信息
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
if (pn.equals("com.tencent.mm")) {
return true;
}
}
}
return false;
}


接下来是关键的一步,在应用登录界面

IWXAPI api = WXAPIFactory.createWXAPI(this, Constant.APP_ID, false);
private static final String WEIXIN_SCOPE = "snsapi_userinfo";// 用于请求用户信息的作用域
private static final String WEIXIN_STATE = "login_state"; // 自定义
SendAuth.Req req = new SendAuth.Req();
req.scope = WEIXIN_SCOPE;//授权阈
req.state = WEIXIN_STATE;
api.registerApp(Constant.APP_ID);
api.sendReq(req);

在自己包名下面创建 wxapi 文件夹,里面创建一个 WXEntryActivity.java 文件,作为处理接受微信返回数据类,这个activity 也必须在 应用manifest 里面配置

android:exported="true"
WXEntryActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

//微信界面
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
public static final String WX_APPID = "-------------";
private IWXAPI api;
private boolean isFrist = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
//注意:*/
//第三方开发者如果使用透明界面来实现WXEntryActivity,需要判断handleIntent的返回值,如果返回值为false,则说明入参不合法未被SDK处理,应finish当前透明界面,避免外部通过传递非法参数的Intent导致停留在透明界面,引起用户的疑惑
try {
api = WXAPIFactory.createWXAPI(this, WX_APPID, false);
api.handleIntent(getIntent(), this);//这一句必须加,不加收不到返回的数据
} catch (Exception e) {
e.printStackTrace();
}
}

private static final String WEIXIN_SCOPE = "snsapi_userinfo";// 用于请求用户信息的作用域
private static final String WEIXIN_STATE = "login_state"; // 自定义
private SendAuth.Req req;

// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
break;
default:
break;
}
}

// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
if (ConstantsAPI.COMMAND_SENDAUTH == resp.getType()) {
//授权回调
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
//获取请求码
SendAuth.Resp sendAuthResp = (SendAuth.Resp) resp;
String code = sendAuthResp.code;
Log.d("tian", "请求码--------" + code);
WXEntryActivity.this.finish();
finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
/*Intent intent1 = new Intent();
Log.e("tiantian","微信登陆取消设置result");
intent1.putExtra("code", "cancel");
setResult(2, intent1);*/
finish();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
finish();
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
finish();
break;
default:
break;
}
}

}

@Override
public void onBackPressed() {
finish();
}

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

}
}

将接收到的code ,获取微信access_token 和openid

private void getResult(final String code) {
HttpService httpService = CommonUtils.doNet();
Call<WxTokenBean> call = httpService.getWxToken("https://api.weixin.qq.com/sns/oauth2/access_token", Constant.APP_ID, Constant.APP_SECRET, code, "authorization_code");
call.enqueue(new retrofit2.Callback<WxTokenBean>() {
@Override
public void onResponse(Call<WxTokenBean> call, retrofit2.Response<WxTokenBean> response) {
if (!response.isSuccessful()) {
ToastUtils.showToast(response.message());
return;
}
WxTokenBean wxTokenBean = response.body();
String access_token = wxTokenBean.getAccess_token();
String openid = wxTokenBean.getOpenid();
getUserinfo(access_token, openid);
}

@Override
public void onFailure(Call<WxTokenBean> call, Throwable t) {
dismissLoadingDialog();
ToastUtils.showToast("微信登陆失败,请重试");
}
});
}
拿到 access_token 和 openid 就可以请求微信用户信息了

Call<WxUserInfoBean> call = httpService.getWxUserInfo("https://api.weixin.qq.com/sns/userinfo?access_token", access_token, openid);
通过返回的bean 就可以获取你需要的用户信息了;


参考资料:

http://www.jianshu.com/p/09a58fe0faef
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信登录