Android对接第三方登录,微信登录
16lz
2021-01-25
使用第三方登录第一步,添加依赖:
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
在mainfest文件中添加权限:
在Android6.0以上需动态申请
注册微信 :
在全局Application类MyApplication中注册微信,在oncreate()方法中调用registerToWX()注册微信
public static IWXAPI mWXapi; public String WX_APP_ID = "你的appid";private void registerToWX() { mWXapi = WXAPIFactory.createWXAPI(context, WX_APP_ID, false); mWXapi.registerApp(WX_APP_ID); }
在点击微信登录的方法中调用以下方法wxLogin():
//微信登录页 private void wxLogin() { if (!AppApplication.mWXapi.isWXAppInstalled()) { showMessage("您还未安装微信客户端"); return; } final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "ufile_wx_login";//这个字段可以任意更改 AppApplication.mWXapi.sendReq(req); }
在自己项目的包名下创建一个package,取名叫wxapi,并在该包下创建一个类名为WXEntryActivity的类。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private static final String WX_APP_ID = "你的APPID"; private static final String WX_APP_SECRET = "你的APPSECRET"; public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); private static final String TAG = "WXEntryActivityLog"; public static String wxCode;// private HttpWxLogin httpWxLogin; public static String openid; public static String accessToken; public static String nickname; public static String headImgUrl; public static String unionId; private Dialog mDialog; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState);// mDialog=WebDialogUtils.createWebDialog(this,"登录中"); //判断是否已经注册到微信 AppApplication.mWXapi.handleIntent(getIntent(), this); } // 微信发送请求到第三方应用时,会回调到该方法 @Override public void onReq(BaseReq baseReq) { } // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法 //app发送消息给微信,处理返回消息的回调 @Override public void onResp(BaseResp baseResp) { Log.d(TAG, "onResp: " + baseResp.errStr); Log.d(TAG, "onResp: 错误码" + baseResp.errCode); //ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权) ERR_USER_CANCEL = -2(用户取消) switch (baseResp.errCode) { case BaseResp.ErrCode.ERR_AUTH_DENIED: Toast.makeText(this, "用户拒绝授权登录", Toast.LENGTH_SHORT).show();// mDialog.dismiss(); finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: Toast.makeText(this, "用户取消授权登录", Toast.LENGTH_SHORT).show();// mDialog.dismiss(); finish(); break; case BaseResp.ErrCode.ERR_OK: //用户同意授权。 final String code = ((SendAuth.Resp) baseResp).code; wxCode =code; Log.d(TAG, "code: " + code); finish(); break; } } //获取access_token private void getAccessToken(final String code) { //这个接口需用get请求 String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WX_APP_ID + "&secret=" + WX_APP_SECRET + "&code=" + code + "&grant_type=authorization_code"; OkHttpClient client = new OkHttpClient(); final Request request = new Request.Builder() .url(path) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, "onFailure: 失败");// mDialog.dismiss(); finish(); } @Override public void onResponse(Call call, Response response) throws IOException { final String result = response.body().string(); Log.d(TAG, "请求微信服务器成功: " + result); try { JSONObject jsonObject = new JSONObject(result); openid = jsonObject.getString("openid"); accessToken = jsonObject.getString("access_token"); } catch (JSONException e) { e.printStackTrace(); } getUserInfo(); } }); } //获取用户信息 private void getUserInfo() { String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(path) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, "onFailure: userinfo" + e.getMessage()); finish(); } @Override public void onResponse(Call call, Response response) throws IOException {// Log.d(TAG, "onResponse: userinfo" + response.body().string()); //okhttp中 response.body().string()只允许调用一次 final String result = response.body().string(); try { JSONObject jsonObject = new JSONObject(result); unionId = jsonObject.getString("unionid"); headImgUrl = jsonObject.getString("headimgurl"); nickname = jsonObject.getString("nickname"); Log.d(TAG,"getUserInfo: unionId = "+unionId+" headImgUrl = "+ headImgUrl + " nickname = "+ nickname); } catch (JSONException e) { e.printStackTrace(); } finish(); } }); }}
到这里已经可以成功获取接入微信登录所需要的所有信息了,我这边的话后端封装好了,只需要传入微信返回的code给后端,然后可以直接从后端返回微信用户的个人信息,所以我这里的getAccessToken()和getUserInfo()这两个方法是没有调用的。这里需要注意的是,微信返回的code只能使用一次。
其实这些都是可以根据微信的文档接的,不过有时候官方文档是真的烂,这里算是给新手一个小实例吧。
更多相关文章
- Android中使用Gesture加入手势操作
- android Bitmap类方法属性 详细说明
- android 新用户判定
- Android开发笔记
- Android(安卓)单选/复选控件
- AndroidContentProvider ContentResolver和ContentObserver的使
- 音乐播放器源码
- service 的调用【转】
- 通过手势实现Android(安卓)ImageView 缩放