公司的微信项目一直遇到一个openid获取不到的问题,今天仔细追踪了一下原因,发现原来是code没有获取到,导致了一些列问题,code作为微信OAuth2.0授权获取用户信息的根源,看下官方描述:

具体而言,网页授权流程分为四步:

1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

只要看前两个就知道了,作为新开发都知道access_token的作用,我不多说。

关于网页授权的两种scope的区别说明

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

关于特殊场景下的静默授权

1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;
2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。
Scope为snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

看完文档就知道了,1、用户拒绝了授权,2、微信内部错误,第二种情况应该是极少出现所以一般都不考虑,那用户拒绝授权了怎么办,我们再来看看官方文档:

下图为scope等于snsapi_userinfo时的授权页面:

用户同意授权后

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE

code说明 :
code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

这么一来就简单了,用户都已经拒绝授权了。好,用户你可以滚出我的世界了,比如python+flask就可以这么做:

首先假如你的state设置为state=1

code = request.values.get('code')
state = request.values.get('state')
if code is None and state == '1':return render_template('angelababy_out.html') #一个授权失败的页面,或者你也可以做别的操作嘛

至此,这个bug就解决了。

附微信授权官方文档:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

OAuth2.0微信code获取失败怎么办相关推荐

  1. OAuth2.0 微信授权机制

    我在了解设计Restful接口的时候,发现涉及到接口验证,可以利用OAuth2.0机制来验证. 我开发的微信端Web网页通过微信授权的时候,微信端也是用OAuth2.0机制来获取用户基本信息. OAu ...

  2. php微信企业号oauth2.0,微信企业号:OAuth2.0微信授权验证

    微信企业号:OAuth2.0微信授权验证 企业应用中的 URL 链接(包括自定义菜单或者消息中的链接),可以通过 OAuth2.0 验证接口来获取成员的身份信息.使用步骤和方法如下: 1.先开发要使用 ...

  3. ajax 微信code获取_ajax 实现微信网页授权登录的方法

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个phper ,所以,微信开发采用的是 EasyWeCha ...

  4. 关于OAuth2.0 Authorization Code+PKCE flow在原生客户端(Native App)下集成的思考

    Working with Proof Key for Code Exchange (PKCE) - DEV Community 写在前面 前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式 ...

  5. Spring Security oauth2.0微信小程序登录

    微信小程序前期开发准备,可以参考这篇文章微信小程序前期准备 1.学习过Spring Secrity oauth2.0的都知道,他有四种登录模式可以选择 authorization code(授权码模式 ...

  6. 基于OAuth2.0微信网页第三方授权原理

    看了阮一峰的OAuth2.0 的文章,主要偏理论 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 和闪客sun 的,整体流程比较详细 htt ...

  7. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  8. 淘宝开放平台店铺订单管理oAuth2.0订单同步获取接口解决方案

    正常为了进行淘宝/天猫平台卖家订单商品oAuth2.0开发,首先我们需要做下面几件事情. 1.注册一个开发者账号,拥有订单管理相关应用标签:需要部署聚石塔. 2.然后为每个淘宝应用注册一个应用程序键( ...

  9. ajax 微信code获取_计算机毕业设计中微信小程序实现微信登录(Java后台)

    点击上方"蓝字",关注我们. 需要的材料 1:一个可以测试的微信小程序 2:此微信小程序的APPID和APPscret 流程 微信用户对应一个小程序都有一个唯一的openid,微信 ...

最新文章

  1. sql实现两张表的拷贝
  2. 【Python】青少年蓝桥杯_每日一题_1.27_单词出现的次数
  3. R语言统计分布及模拟
  4. 苹果Mac侧边栏笔记工具:​​​​​​​​SideNotes
  5. 区块链 Solidity中uint转string 数字转字符串
  6. 用计算机求回归,鲜为人知的用途,回归分析用计算器就能做!
  7. 如何用计算机做牛顿迭代公式,牛顿迭代法
  8. provisional headers are shown
  9. SpringBoot+PageHelper实现分页功能
  10. 计算机读研的收获和遗憾
  11. Unity学习记录——模型与动画
  12. 拒绝从入门到入土:初识C语言
  13. Android开发 打造自己的Annotation框架
  14. 2020个人成长计划
  15. 股市风云:价值成长投资 稳健赢利之道
  16. ubuntu定时执行任务
  17. ubuntu从零开始手工编译shogun
  18. 计算机音乐作曲排名2019,2019全球歌曲排行榜_数据 2019全球古典音乐排行榜
  19. vnc连接不上,vnc连接不上是为什么?原因详解
  20. Linux下编写ENC28J60网卡驱动,完善网络设备框架

热门文章

  1. 11月24号-11月30号
  2. linux安装svn使用解压包的方式
  3. React中使用useState数据异步问题解决方法
  4. IPv6的被请求节点的组播地址
  5. ros::NodeHandle成员介绍
  6. CGI简介用C来写CGI程序简要指南
  7. html手机端背景显示不全,手机浏览器打开PC端网站,背景显示不全怎么办?
  8. zookeeper伪分布环境搭建
  9. 耶鲁大学 博弈论(Game Theory) 笔记2-学会换位思考
  10. 爱站权重查询 怎么批量查询网站爱站权重