Android 微信第三方登录

幽沉谢世事,俯默窥唐虞。这篇文章主要讲述Android 微信第三方登录相关的知识,希望能为你提供帮助。
微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。
微信注册应用平台的应用签名,下载  微信签名生成工具  输入项目的packageName也可以查看到。
(注意:debug、Release 一定要区分,因为2种生成的微信签名不一致,会导致没有跳转、回调。。。。一般在微信开发者上面注册的是正式环境打包好的、)
  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"/>

【Android 微信第三方登录】2.在图一按钮上面,加上微信跳转方法、也就是启动微信登录的方法
private void loginToWeiXin(){ IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true); mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID); if (mApi != null & & mApi.isWXAppInstalled()) { SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test_neng"; mApi.sendReq(req); } else Toast.makeText(this, "用户未安装微信", Toast.LENGTH_SHORT).show(); }

3.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity
  package(项目报名).wxapi.WXEntryActivity.Java 
回调方法onResp() 方法没有触发回调、请监测WXEntryActivity onCreate中是否调用此方法    mApi.handleIntent(this.getIntent(), this);
package com.xxx.xxxx.android.wxapi; /** * 微信登录页面 * @author kevin_chen 2016-12-10 下午19:03:45 * @version v1.0 */ public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private static final String APP_SECRET = "填写自己的AppSecret"; private IWXAPI mWeixinAPI; public static final String WEIXIN_APP_ID = "填写自己的APP_id"; private static String uuid; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true); mWeixinAPI.handleIntent(this.getIntent(), this); }@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); mWeixinAPI.handleIntent(intent, this); //必须调用此句话 }//微信发送的请求将回调到onReq方法 @Override public void onReq(BaseReq req) { LogUtils.log("onReq"); }//发送到微信请求的响应结果 @Override public void onResp(BaseResp resp) { LogUtils.log("onResp"); switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: LogUtils.log("ERR_OK"); //发送成功 SendAuth.Resp sendResp = (SendAuth.Resp) resp; if (sendResp != null) { String code = sendResp.code; getAccess_token(code); } break; case BaseResp.ErrCode.ERR_USER_CANCEL: LogUtils.log("ERR_USER_CANCEL"); //发送取消 break; case BaseResp.ErrCode.ERR_AUTH_DENIED: LogUtils.log("ERR_AUTH_DENIED"); //发送被拒绝 break; default: //发送返回 break; }}/** * 获取openid accessToken值用于后期操作 * @param code 请求码 */ private void getAccess_token(final String code) { String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WEIXIN_APP_ID + "& secret=" + APP_SECRET + "& code=" + code + "& grant_type=authorization_code"; LogUtils.log("getAccess_token:" + path); //网络请求,根据自己的请求方式 VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() { @Override public void onSuccess(String result) { LogUtils.log("getAccess_token_result:" + result); JSONObject jsonObject = null; try { jsonObject = new JSONObject(result); String openid = jsonObject.getString("openid").toString().trim(); String access_token = jsonObject.getString("access_token").toString().trim(); getUserMesg(access_token, openid); } catch (JSONException e) { e.printStackTrace(); }}@Override public void onError(String errorMessage) {} }); }/** * 获取微信的个人信息 * @param access_token * @param openid */ private void getUserMesg(final String access_token, final String openid) { String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "& openid=" + openid; LogUtils.log("getUserMesg:" + path); //网络请求,根据自己的请求方式 VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() { @Override public void onSuccess(String result) { LogUtils.log("getUserMesg_result:" + result); JSONObject jsonObject = null; try { jsonObject = new JSONObject(result); String nickname = jsonObject.getString("nickname"); int sex = Integer.parseInt(jsonObject.get("sex").toString()); String headimgurl = jsonObject.getString("headimgurl"); LogUtils.log("用户基本信息:"); LogUtils.log("nickname:" + nickname); LogUtils.log("sex:" + sex); LogUtils.log("headimgurl:" + headimgurl); } catch (JSONException e) { e.printStackTrace(); } finish(); }@Override public void onError(String errorMessage) {} }); }}

5.在  AndroidManifest.xml 设置注册微信的页面
当授权时候进入WXEntryActivity、当前背景可能是黒或白,为了不影响用户体验,可以把当前Activity设置为透明:
android:theme="@android:style/Theme.Translucent" 
< !--注册微信回调 WXEntryActivity --> < activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTop" android:theme="@android:style/Theme.Translucent" />

 

    推荐阅读