1.根据appId,重定向到https://open.weixin.qq.com/connect/oauth2/authorize
请求中参数指定redirect_uri,response_type=code,scope=snsapi_userinfo,
redirect_uri是公众平台重定向到自己业务平台接口路径,接口中会返回公众平台返回的code
state是业务平台携带给业务平台的回调接口的自己业务平台的数据,当然这个携带的数据你也可以把他放在redirect_uri中携带
2.携带接口获取到code后,根据appId和appsecret发送一个http请求,是一个
https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxx&&secret=xxx&code=xxx&grant_type=authorization_code
3.步骤2接口会返回用户在公众平台的openId和accessToken,根据这两个数据,继续发送http rest风格的请求,
得到用户基本信息。
注意,步骤1是重定向,步骤2是发送一个RESTFULL风格的公众平台的接口请求,两者区别很明显,
接口请求的返回分两种:1种是view类型的(网页),1种的数据类型的
转发和重定向都是针对网页请求结果,这是传统的前后端在一起通过model做数据传递的方式
rest风格的请求是前后端分离的,支持页面局部刷新的请求方式
相关逻辑:
1)为什么这个过程会涉及到两种请求方式
步骤1请求后需要一个用户授权页面,这个页面要保证统一的话,就必须由公众平台定义这个页面,所以第一次是请求页面,
点击确认完成授权后要跳转到业务平台的页面,这个页面一定要重定向的方式,所以后台的这个接口一定是一个view类型的接口
2) 用户已经授权的情况下再进入到授权页面的话,微信会自动跳转到你的redirect_url,还是会走之前的流程,只是他不弹授权框
3)所以,即使是前后端分离的开发模式,微信也要先重定向到后台接口,然后后台接口返回的是前端的路由页面,路由页面相关数据可以
需要的相关数据可以通过参数的方式让前端去截取;
所以,扫描登录二维码的时候(包含前端路由页面以及携带设备参数),先走前端页面,前端缓存中先判断是否已经获取了用户登录信息以及设备号信息。如果已经获取了,那么就不需要再去授权了,直接在前端处理,前端要保存用户的openId,以及用户的基本信息以及设备信息。
如果用户未登录,先通过接口请求后台的appId,拿到appId后,前端发起重定向请求到微信公众平台获取code的接口,该接口中携带
业务后台的回调地址,业务后台拿到code后,通过code请求openId,再通过openId请求用户信息,最后,将用户信息和openId以参数的形式
重定向给前端路由页面。