微信网页授权获取用户信息等机制

参考官方文档

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


另:获取用户基本信息的另一种方法:(UnionId机制)

http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html

通过上述1,2,3获取到用户的openid

再访问:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

此时的access_token为调用接口的凭证,而非用户授权时的access_token

两种方法返回的用户信息有所不同:

此种方法返回的Json数据参数列表如图:标红的为网页授权没有返回的参数。(网页授权返回的参数除下图未标红的外,多一个用户特权信息,json 数组,如微信沃卡用户为(chinaunicom))

 

posted on 2017-05-04 00:16  圆不润  阅读(953)  评论(0编辑  收藏  举报