首页 > 代码库 > 微信网页授权获取用户信息等机制
微信网页授权获取用户信息等机制
参考官方文档
https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
1.用户进入授权界面(APP?WeChat)
引导用户打开链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
图片来源于微信公众平台开发者文档
a-zA-Z0-9:小写字母a至z;大写字母A至Z;数字0至9
state补充说明:开发者自定义的参数,比如一个内部的回调地址。如redirect_uri是一个用户进入内部各种回调地址的入口entry,state包含了这个内部的回调地址。
302重定向:302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。
2.用户同意授权后,跳转至redirect_uri/?code=CODE&state=STATE(WeChat?中转)
补充说明:中转获取到code后,可以通过3,4等进行一系列的操作获取用户openid及用户基本信息,处理后再与state中的内部回调地址结合完成app内的跳转等。(中转?APP)
3.通过code换取网页授权access_token及用户openid等(中转?WeChat)
请求https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
以获取access_token。
其中:appid:公众号的唯一标识;secret:公众号的appsecret;code:2中获取的code参数;grant_type=authorization_code默认不变
若CODE有效(是2中获取的参数)且未过期,appid(是1中的appid)和secret一致,返回JSON数据:
{ "access_token":"ACCESS_TOKEN",//网页授权接口调用凭证 "expires_in":7200,//access_token接口调用凭证超时时间,单位(秒) "refresh_token":"REFRESH_TOKEN",//用户刷新access_token "openid":"OPENID",//用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID "scope":"SCOPE",//用户授权的作用域,使用逗号(,)分隔 "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 }
这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
(3.1)刷新access_token(如果需要)
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。
请求https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
appid:公众号的唯一标识;grant_type=refresh_token不变;refresh_token:3中获取到的refresh_token。
返回JSON数据:
{ "access_token":"ACCESS_TOKEN",//网页授权接口调用凭证 "expires_in":7200,//access_token接口调用凭证超时时间,单位(秒) "refresh_token":"REFRESH_TOKEN",//用户刷新access_token "openid":"OPENID",//用户唯一标识 "scope":"SCOPE"//用户授权的作用域,使用逗号(,)分隔 }
4.拉取用户信息(需scope为 snsapi_userinfo)
请求方法:http:GET(请使用https协议)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数:access_token:3中的获取的网页授权接口调用凭证;openid:3中获取的用户openid;lang:返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语。
返回JSON:
{ "openid":" OPENID",//用户的唯一标识 " nickname": NICKNAME,//用户昵称 "sex":"1",//用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 "province":"PROVINCE",//用户个人资料填写的省份 "city":"CITY",//普通用户个人资料填写的城市 "country":"COUNTRY",//国家,如中国为CN //用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],//用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 }
附:用户特权信息:目前已知有微信沃卡用户:群组特权、表情特权、支付特权、流量特权和游戏特权(https://zhidao.baidu.com/question/583338933.html)
微信网页授权获取用户信息等机制