access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需要使用access_token。
微信开发需要用到的access_token,其实是分为两个种类的,一种是普通的access_token,另一种是网页授权access_token。
普通的access_token,是微信开发者调用微信所提供的各种借口的一个凭证,有效时间为7200秒,也就是两个小时,而且一个公众号每天获取它的次数微信那边是有限制的,上限是2000次。
使用范围:通过网页授权获得的access_token,只能获取到对应的微信用户信息,与微信用户是一对一关系;而普通的access_token在有效期内可以使用,可以获取所有用户信息
网页授权access_token,是第三方网页若需要使用用户的微信账户登录,需要获取它,从而来获取用户微信账户的信息。
另外,获取用户微信账户信息也有两种情况:
1. 普通的获取用户信息,只需要调用微信用户信息接口就能获取,因而使用的是第一种普通的access_token。
2. 网页授权时获取微信用户信息,用的就是第二种,网页授权access_token。
两种access_token混淆的话就会有 “invalid access_token” 的错误。
要注意的是,第一种普通的access_token是全局性的,就是说一旦重新调用接口获取一个新的普通的access_token,之前的那个旧的普通的access_token就会失效,因而用旧的普通的access_token就无法成功地调用相关的接口。所以这种特性可能会导致一些情况,比如说,多个不同的进程独立的去获取这种普通的access_token,就会导致有些接口没办法正常地调用相关的微信接口。一般的话,可以用定时器定时地更新access_token,或者将其缓存在缓存或者数据库当中,设置失效时间,在缓存当中找不到或者已经失效的情况下,再通过接口重新获取的方式来解决类似的问题。
原文:https://blog.csdn.net/huangyuehong914/article/details/82492628
网页授权access_token
微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息。
OAuth2.0
说到信息获取,不得不提OAuth2.0。OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。
OAuth的思路就是在第三方应用程序和服务提供商之间,设置一个授权层(authorization layer)。第三方应用程序不能直接登录服务提供商,只能登录授权层,以此将用户与第三方应用程序区分开来。第三方应用程序登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。具体流程图如下:
- step1:用户访问公众号页面。
- step2:回调授权。(后面详解)。
- step3:用户同意授权。
- step4:重定向到公众号,并返回code。
- step5:公众号通过code获取网页授权access_token。
- step6:刷新access_token(如果需要)。
- step7:公众号通过access_token来获取用户信息。
上述step2的具体授权分析
若用户只获取用户的openid,则是默认授权,用户不会感知到授权的发生,而是直接进入了回调页(往往是用户页面)。在没有关注的情况下,若想获取其他用户信息snsapi_userinfo,就需要用户手动同意。对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是snsapi_userinfo,也是静默授权,用户无感知。
所以在这里问题就有归结于,用户openid的获取,获取我知道的有两种方式:
1.在用户完成支付之后的回调接口当中,可以获取到用户的openid
2.用access_token 获取用户授权的code,再使用code 取获取用户的openid
支付我们就不说了,来看一下第二种获取的方式:
code的获取,具体可以去看微信的开发文档
参数:
用户同意授权后,页面将跳转至上步设置的回调链接上,并带上code和state参数。
code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
通过code换取网页授权access_token
如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
具体是将上步获取到的code值传给下面的链接,即替换code=CODE中的CODE。
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明:
响应会得到如下json数据,参数如下:
刷新access_token
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
具体做法:利用上步获取到的refresh_token来重新授权。
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
链接中的参数只需要将REFRESH_TOKEN替换成上一步获取到的access_token值,APPID换成自己公众号的appid就可以重新获得授权。返回的参数和上一步获取access_token返回的参数一样,都是那五种。
利用access_token获取用户信息
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明:
返回json数据,参数说明:
利用普通access_token获取用户信息
在关注者与公众号产生信息交互后,公众号可获得关注者(注意:用此种方法获取用户信息,前提是用户必须关注公众号)的openid(加密后的微信号,每个用户对每个公众号的openid是唯一的)。公众号可通过本接口来根据openid获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
调用接口https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,请求方式为GET。
参数说明:
返回参数:
除此之外获取到的信息还有:
subscribe_scene:返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他
qr_scene:二维码扫码场景(开发者自定义)
qr_scene_str:二维码扫码场景描述(开发者自定义)
大家可以看到的就是,普通的access-token获取到的用户信息是多余 授权获取到的,授权获取到的都是写基本的用户信息;
以上就是两种token的相关内容的理解,如有不合理的地方,可以留言指正;
参考文章:
1. 微信公众平台技术文档
2.https://blog.csdn.net/benben_2015/article/details/79703508
3.https://blog.csdn.net/huangyuehong914/article/details/82492628
小程序开发文档
https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html
微信获取手机号码地址
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html