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"/>
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 微信第三方登录(个人笔记)的更多相关文章
- Android 微信第三方登录
步骤一 微信开发者平台 我开始的解决思路是,去微信开发者平台看API文档. 这个API文档的主要意思呢,有三点: 1.你得下载这几样东西(下载链接),一个是他的范例代码,一个是他的签名生成工具. 2. ...
- iOS微信第三方登录实现
iOS微信第三方登录实现 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...
- Android UmengShareSDK第三方登录
Android UmengShareSDK 第三方登录- 今天就不废话了,集成平台第三方登录.市面上集成平台有shareSDK 和 Ument两种,shareSDK的ipa和服务好些,如果自己研究会很 ...
- 微信第三方登录(原生)demo
在一家ecstore二开公司有一段时间了,公司希望往自己研发产品上面走,一直在培养新人. 最近要自己去微信登录,自己就在ectore的框架基础上,写的原生微信第三方登录以此来熟悉微信第三方登录,在 ...
- laravel5实现微信第三方登录功能
背景 最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4. 实现过程以微信网页版第三方登录,其他于此类似,在此不做重复. 准备工作 网站应用微信登录是基于OAu ...
- 3. ABP .NETCore 添加企业微信第三方登录
1.企业微信登录步骤 1.获取企业微信Token 官方文档:https://work.weixin.qq.com/api/doc#90000/90135/91039 2.通过Token 与前端传的Co ...
- Android Learning:微信第三方登录
这两天,解决了微信第三方授权登录的问题,作为一个新手,想想也是一把辛酸泪.我想着,就把我的遇到的坑给大家分享一下,避免新手遇到我这样的问题能够顺利避开. 步骤一 微信开发者平台 我开始的解决思路是,去 ...
- Android ShareSDKQQ 第三方登录so easy?
昨天群里有个群友看到我之前做的那个qq第三方登录怎么做的,于是乎思考了一下,还是决定写一篇博客记录下.事实上都不难的,事实上之前我又写到FaceBook的第三方登录不知道看下这Android集成Fac ...
- [置顶]
Android ShareSDKQQ 第三方登录so easy?
昨天群里有个群友看到我之前做的那个qq第三方登录怎么做的,于是乎思考了一下,还是决定写一篇博客记录下,其实都不难的,其实之前我又写到FaceBook的第三方登录不知道看下这Android集成FaceB ...
随机推荐
- 【探索】在 JavaScript 中使用 C 程序
JavaScript 是个灵活的脚本语言,能方便的处理业务逻辑.当需要传输通信时,我们大多选择 JSON 或 XML 格式. 但在数据长度非常苛刻的情况下,文本协议的效率就非常低了,这时不得不使用二进 ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法
有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...
- redis集成到Springmvc中及使用实例
redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...
- ES6的一些常用特性
由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性.原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门(水好深,ES6没学好ES7又来了...) ...
- 普通程序员如何转向AI方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...
- TFS 测试用例步骤数据统计
TFS系统集成了一套BI系统,基于SQL Server的Analysis Service进行实现的.通过这几年的深入使用,能够感触到这个数据数据仓库模型是多么的优秀,和微软官方提供的数据仓库示例Adv ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...