<-- home

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

  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" }
    
  25. 里面有access_token ,有效时长,refresh_token(用来刷新token),还有一个很重要的openid ,这个openid 就是当前微信用户的唯一标识啊,这也从一定程度上说明access_token 是面向单一用户的。这个基础的access_token有这本质的区别,真实坑爹啊。scope 是snsapi_base 或者 snspai_userinfo
  26. 有了access_token 和用户的openid 就能真正的进入业务层。

==========================华丽分割线===========================

  1. 我们简称25 中的json包是access_token对象
  2. 先是检验了access_token 是否还有效,无效的话能通过对象中的refresh_token 进行刷新,从而获取最新的 access_token
  3. 查看scope的类型是 snsapi_base 还是 snsapi_userinfo
  4. 以下我用伪代码描述
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 {

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