了不起学弟:了不起,上次你和我讲了如何去维护一个access_token了,我也学会了
了不起:嗯!不错,学会了就好啊哈哈
了不起学弟:你这次再给我讲讲微信登录这一块的逻辑呗~
了不起:。。。行吧,那我就再给你讲一讲
我们整个微信登录的流程一共涉及到3个交互。第一个就是小程序前端,第二个就是小程序服务端,第三个就是微信服务端。
小程序前端调用wx.login。
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
小程序前端,调用login这个接口,最主要的目的就是去换取code,而这个code的作用,就是和我们第二步去做交互。
这个code的有效是五分钟,我们要在五分钟之内去调用第二步的操作。大家可以看一下官网上的代码示例。
小程序服务端调用code2session。
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html
我们第一步过后就会去调用这个接口,去校验登录凭证。
大家可以看一下参数,有appid,secret,js_code,grant_type。分别的意思,前两个是小程序会给你的固定的参数,js_code就是第一步通过wx.login获取到的code grant_type此处只需填写 authorization_code。
返回参数有:openid,errcode,errmsg,unionid,session_key。分别的意思,openid就是微信用户的唯一标识。errcode和errmsg就不作解释啦。unionid就是小程序和服务号关联就会返回一个unionid。session_key就是会话秘钥。unionid的机制大家参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html 我们获取到session_key和openid后,我们我要要把这两个给关联起来并且生成一个token。这个session_key 是不可以直接给前端的,因为有安全风险问题。我们可以在缓存关联一个token:openid ,然后在openid:session_key。
经过第二步后,我们返回了一个token给小程序前端。小程序前端需要把这个token维护在storage内,下一次小程序前端请求小程序后端的时候,就必须得携带这个token。
对于同一个微信平台下的应用(比如服务号和小程序),同一个用户openid是不同的,但是unionId是相同的。
不需要用户授权,我们走今天说的第一步和第二步就可以获取到用户的unionid。这边开发中有这样的需求的话,我们在用户表里面是要同时去存储unionid和openid的。