微信授权三步走

2018-07-16
wechat
3749

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。服务器在处理微信授权时,可分为三步,在这三步之前,先来看看微信授权是个怎么的过程。

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);
  }
}