Android微信第三方登录(个人笔记)

所属分类: 软件编程 / Android 阅读数: 47
收藏 0 赞 0 分享

今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。欢迎各位指教。

微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。

微信注册应用平台的应用签名,下载 微信签名生成工具 输入项目的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"/> 


 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" /> 

具体可参考:微信授权登录取用户信息步骤

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多