微信授权登录,关于调不起授权页面,无法响应回调方法,获取不到code 详解
前期准备工作:申请AppId,下载资源包jar、文档等。
微信授权登录步骤:
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;(第1步官方文档写得很模糊分散,做微信授权登录的时候遇到很多问题,现在总结记录下来)
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token,openid;
3. 通过access_token和openid进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
注意:
1.想要正常调起微信授权登录页面,应用包名和签名必须是和申请AppId时上传的应用保持一致,否则无法调起微信授权登录页面。Debug签名是无法调起微信授权登录页面的。
2.想要接收微信返回值,也就是响应回调方法,必须做到以下3步操作:
a.新建一个包:应用包名.wxapi(应用包名必须是你申请AppId时应用的包名),在wxapi目录下新建WXEntryActivity类,该类继承自Activity,并在manifest文件里面配置WXEntryActivity时,加上exported属性,设置为true
b.实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
c.在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图
该代码写在onCreate方法里,请把AppId替换成你自己的AppId
当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
WXEntryActivity无需设置界面,通过onResp(BaseResp resp)拿到返回的resp,resq的类型是com.tencent.mm.sdk.modelmsg.SendAuth$Resp,强转成SendAuth.Resp,就能通过resq.code拿到code,把code发送给后台服务器,后台通过code就能拿到access_token和oppenid,通过access_token和oppenid就能拿到用户信息进行注册登录了,然后把信息再返回给前端应用,整个授权登录就OK了。
第一步:请求CODE移动应用微信授权登录
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
注:请求CODE这段代码写在点击微信登录的Activity(或Fragment或View)里边。不能写在WXEntryActivity,否则无法响应WXEntryActivity的回调方法。
第二步和第三步由后台服务器来做,实现用户注册登录再返回给前端应用。这样就实现了微信授权登录。
F.A.Q
1. 什么是授权临时票据(code)?
答:第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。
WXEntryActivity类代码如下(ConstantApi.APP_ID_WX为APP_ID )
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "WXEntryActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IWXAPI api = WXAPIFactory.createWXAPI(this, ConstantApi.APP_ID_WX, true);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq req) {
Log.e(TAG, "onReq...");
}
@Override
public void onResp(BaseResp resp) {
Log.e(TAG, "onResp...");
String code = null;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK://用户同意,只有这种情况的时候code是有效的
code = ((SendAuth.Resp) resp).code;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
break;
case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
break;
default://发送返回
break;
}
finish();
}
微信授权登录,关于调不起授权页面,无法响应回调方法,获取不到code 详解的更多相关文章
- 微信SDK登录无法调起,微信SDK无法接收回调的几种解决办法
今天有位同事请求帮忙调试微信登录问题,他遇到了以下2个问题,所以,写篇日志备忘,如果有其它朋友遇到此类问题,都可以照此解决! 平时在开发中,有些开发者经常会遇到微信登录SDK登录时,无法调起微信客户端 ...
- vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)
前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解(转VIII)
JVM本身就是一个java进程,一个java程序运行在一个jvm进程中.多个java程序同时运行就会有多个jvm进程.一个jvm进程有多个线程至少有一个gc线程和一个用户线程. JDK本身提供了很多方 ...
- 如何在微信小程序定义全局变量、全局函数、如何实现 函数复用 模块化开发等问题详解
1.如何定义全局数据 在app.js的App({})中定义的数据或函数都是全局的,在页面中可以通过var app = getApp(); app.function/key的方式调用,不过我们没有必要 ...
- 【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
http://www.cnblogs.com/therunningfish/p/5524238.html JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsol ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
Jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.打印出某个java进程(使用pid)内存内的,所有'对象'的情况(如:产生那些对象,及其数量). 使用方法 ...
- 微信公众平台开发——微信授权登录(OAuth2.0)
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
- 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)
一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...
- 微信授权登录(OAuth2.0)-- 随记
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
随机推荐
- Openstack(十六)实现内外网结构
类似于阿里云ECS主机的内外网(双网卡不通网段)的结构,最终实现内外网区分隔离. https://www.aliyun.com/product/ecs/?utm_medium=text&utm ...
- nmon 命令
nmon 命令 用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds >] [ -c < ...
- CSS实现超出DIV宽度文字自动隐藏并显示省略号
当文字超出DIV宽度时,超出的文字部分省略,并用显示省略号代替,css代码如下: div.ellipsis { padding-left: 5px; text-align: left; text-ov ...
- 在使用swiper时,解决同一个页面使用多个轮播出现问题做法
$(".swiper-container").each(function(){ $(this).swiper({ loop: true, initialSlide :0, pagi ...
- 能否通过六面照片构建3D模型?比如人脸,全身的多角度照片,生成3D模型。?
https://www.zhihu.com/question/36412840 9023 添加评论 分享 邀请回答举报 收起 已关注写回答 9 个回答 默认排序 叛逆者 计算机图形学 ...
- HDU1087
/*记忆化dfs+dp,因为每次最多走k步,所以上下左右的方向有所扩展, dp[i][j]存的是从dp[i][j]出发能吃的最大个数*/ #include<stdio.h> #includ ...
- android驱动学习---led实验
======================== 驱动: 内核:android-kernel 2.6.36 (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...
- Linux硬盘扩容(非LVM)
环境说明: 虚拟机:Centos6 [root@elements ~]# cat /etc/redhat-release CentOS release 6.10 (Final) [root@eleme ...
- AOP 增强方法
Spring AOP 提供了 5 种类型的通知,它们分别是 Before Advice(前置通知).After Returning Advice(后置通知).Interception Around A ...
- Flask 6 模板2
NOTE Jinja2提供了多种控制程序,可以用来改变模板的渲染流程. 1.在模板中使用条件控制语句: templates/condition.html: {% if user %} Hello, { ...