微信授权三步走
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。服务器在处理微信授权时,可分为三步,在这三步之前,先来看看微信授权是个怎么的过程。
1. 用户请求页面,服务器发现没有授权,在服务器端重定向到授权页面
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&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重定向时候,必须带此参数 |
之后,页面上就出来个授权登录的页面。
2. 用户同意授权之后 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE
code说明 : code作为换取access_token和openid的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
这里就意味着微信又访问了我们的服务器一次,但是这一次带上了一个code参数。
3.服务器用code换openid和access_token 服务器拿到url中的code之后,请求以下链接
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 填写上一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
正确时返回的JSON数据包如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
scope | 用户授权的作用域,使用逗号(,)分隔 |
这里只要拿到openid就结束,之后的内容就不再详细介绍了。 对于服务器而言,并不是每个请求都要这么走一遍,这里总结了三步走流程:
第一步:检查cookie中是否有openid
首先,如果微信在授权之后,服务器会得到一个openid,此openid是用户唯一标识,一个用户相对于某个公众号都有一个唯一的openid。微信授权的首要目的就是要拿到这个openid,进一步用这个openid获取用户头像、进行数据统计等工作。拿到openid之后,先将其存入cookie中,如果下次请求页面,发现cookie中openid,说明用户已经做过授权验证,不用再次授权,用这个openid进行下面的工作即可。如果没有openid,说明授权还没成功,进入第二步。
第二步:检查url中是否有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",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
从而获取openid和access_token,然后将openid存入cookie中,确保不重复授权。之后用access_token获取用户信息。返回页面等。。 如果没有code参数,就进入第三步。
第三步:重定向到授权页
如果检查第一、二步都没有,就说明用户是第一次访问,需要就行授权。此时服务器重定向到如下授权页面
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
当用户授权之后,会带上code参数,重定向回来,就进入第二步,完成授权。到这里三步走就结束了。
静默授权有时间了补充。
下面给出逻辑代码(nodejs)
// req: http request
function (req) {
if (req.cookie.openid) {
sendPage();
} else if (req.params.code) {
var code = req.params.code;
var openid = httpGetOpenid();
setCookie('openid', openid);
snedPage();
} else {
redirect(302, url);
}
}