微信公众号开发之登录流程

来源:互联网 发布:青岛知豆电动车出租 编辑:程序博客网 时间:2024/05/18 02:03


1.浏览器js 请求java的islogin 接口
2.java 从session 中获取当前用户
3.能获取到说明已经登录
4.不能获取到说明没有登陆
5.返回一个result
6.resuel.code == 200 是已经登录
7.result.code == 400 是没有登录
8.已经登录的就不说了,说下没有登陆情况
9.浏览器js根据result.code == 400 判断没有登录
10.在浏览器端进行跳转 window.location.href = result.redirect_url
11.result.redirect-url 是微信的接口,如下
12. https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb3549eaaee11457a&redirect_uri=http://jiezhao.xtake.cn/weixin/login&response_type=code&scope=snsapi_base&state=snsapi_base|http://localhost:3000/dev/index.html#wechat_redirect
13.浏览器js直接进行跳转了 get请求
14.这里请求的是微信的服务器 response_type告诉微信我现在是想要code
15.微信知道了之后,进行一系列判断,就能在 12 那个页面上进行再次跳转,你可以理解成这样:
16.你get请求 12 的地址后,微信的控制层 拿到你传进来的几个参数,appid 是认证过的,好了 那就没问题了,微信服务器生成一个随机的code,然后把这个code 和请求传过来的redirect_url,state 原封不动的一并传到了返回的页面上,页面上的js无论通过什么样的形式都能获取到刚刚传过来的生成的code和redirect_url以及state,这样一来js 就能在这个页面上直接进行window.location.href = 传过来的redirect_url?code=[传过来的code]&state=[传过来的state]
17.到这里就简单了,因为redirect_url 和state 是原封不动的传过来的,所以到现在的请求连接就是我们自己网站了。并且带着参数 code state
18.我们自己的服务器要针对redirect_url 写响应的controller
19.比如我们这里的连接是 jiezhao.xtake.cn/weixin/login?code=xxxx&state=xxxxx
20.这个时候就进入到我们的业务层的了
21我们在controller 中能根据code 获取access_token,是在controller中通过httpClient 请求如下连接完成的:(注意是在controller层请求的)
22.https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
23.上面的这个请求中填上自己的appid,sectrt 以及controller传过来的CODE,就能获取到access_token
24.这是正确时返回的数据json
25.{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
26.里面有access_token ,有效时长,refresh_token(用来刷新token),还有一个很重要的openid ,这个openid 就是当前微信用户的唯一标识啊,这也从一定程度上说明access_token 是面向单一用户的。这个基础的access_token有这本质的区别,真实坑爹啊。scope 是snsapi_base 或者 snspai_userinfo
27.有了access_token 和用户的openid 就能真正的进入业务层。
==========================华丽分割线===========================
28.我们简称25 中的json包是access_token对象
29.先是检验了access_token 是否还有效,无效的话能通过对象中的refresh_token 进行刷新,从而获取最新的 access_token
30.查看scope的类型是 snsapi_base 还是 snsapi_userinfo
31.以下我用伪代码描述
accessToken = 通过code获取accessToken(code)
if(accessToken is 失效) {
重新获取AccessToken

if (accessToken 的scope 是 snspai_base) {
openid = accessToken.getopenid()
业务user = userservice.getUserBy(openid)
if(业务user == null) {
//说明该微信用户在我们的业务系统中并不存在,我们想不他直接存进来
//想要存起来 我们不想仅仅知道openid 还想知道用户头像以及更详细的信息。
//这时候snspai_base 的scope 已经不够用了,需要能提供更详细信息的 . //nsapi_userinfo scope
//然后。构建像12 中一样的url 不过scope 改成了 snsapi_userinfo
snsapi_userinfo_url = 构建url();
// 然后使用WebUtils.issueRedirect()这个工具能在后台进行请求
//这个时候思考
//请求了这个构建好的类似于12 的这个连接之后就又进入了12之后的步骤。
//也就是说如果用户没有登录,为了拿到更详细的用户信息,
//重新获取snsapi_userinfo 的 scope 的access_token

} else {
}//后来的写到程序上面的注释上了

0 0
原创粉丝点击