飞道的博客

vue 实现微信登陆 你学会了吗

385人阅读  评论(0)

背景

微信登陆作为比较常用的第三方登陆,实际应用比较多,比如小程序,微信公众号必不可少缺少 但是发现有一些初级人员还是不容易理解这当中的一个思路,故分享下当前微信登录的一个实现原理以及实战代码

原理

基本步骤 :

  1.  客户端判断token是否存在,token不存在则请求后端获取微信登陆地址

  2.  服务器返回相关的微信登陆地址(这个地方其实也可以由前端自己拼接 具体看自己情况 )

  3.  前端将获取到的微信地址(或者自己前端写好的地址也可以)做跳转

  4.  微信则会返回到之前设置的回调登录地址上做处理(该回调地址为微信请求地址上带的redirect_uri)

  5.  服务器端验证信息的真实性以后将该用户的信息生成对应的token 通过做跳转到前端指定的页面比如 login/token/123 

  6.  前端通过login/token/123 获取到对应的token信息 并保存在本地缓存,接下来请求接口带着这个token即可

具体流程图如下

实现

前端VUE部分

在路由里面做判断是否有token(判断是否登录操作) 没有则跳转到login页面

/src/view/Login.vue


  
  1. created() {
  2. try {
  3. document.title = "登陆中...";
  4. let ua = window.navigator.userAgent.toLowerCase();
  5. if (ua.match( /MicroMessenger/i) == "micromessenger") {
  6. this.$axios.get( "/api/weixin/get_weixin_login_url", []).then( (res) => {
  7. //alert("跳转到微信授权页面", res.data.url);
  8. window.location.href = res.data.url;
  9. });
  10. } else {
  11. this.cli = true;
  12. }
  13. } catch (e) {
  14. }
  15. }

同时也检测是否在login 下面是否有token给到前端(登录成功部分操做)

/src/router/index.js


  
  1. router.beforeEach( (to, from, next) => {
  2. var params = to.fullPath.split( '/');
  3. var token = localStorage.getItem( 'token');
  4. //alert(to.fullPath);
  5. //如果token不存在就跳转登录
  6. if (!token && params[ 1] !== "login") {
  7. //alert('如果token不存在就跳转登录', to.fullPath);
  8. localStorage.setItem( "beforeUrl", to.fullPath);
  9. next( "/login");
  10. return false;
  11. }
  12. //保存用户的token信息
  13. //并跳转到之前的地址
  14. if (params[ 1] == "login" && params[ 2] == 'token') {
  15. localStorage.setItem( 'token', params[ 3]);
  16. var url = localStorage.getItem( "beforeUrl");
  17. //alert(url);
  18. var urlParam = "/";
  19. if (url) {
  20. urlParam = url.split( '/');
  21. }
  22. if (url == '' || url == null || urlParam[ 1] == "login") {
  23. url = '/';
  24. }
  25. next(url);
  26. return false;
  27. }
  28. next();
  29. });

后端代码

获取微信登陆页面地址


  
  1. $redirect_uri = urlencode( "http://" .你的域名 . "/api/weixin/callback");
  2. $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $appId . "&redirect_uri=" . $redirect_uri . "&response_type=code&scope=snsapi_userinfo&state=STATE";
  3. return json([ 'code' => 200, 'msg' => 'success', 'data' => [ 'url' => $url]]);

微信回调返回


  
  1. //当前使用的为easywechat
  2. $app = new Application( self::get_weixin_config());
  3. $oauth = $app->oauth;
  4. // 获取 OAuth 授权结果用户信息
  5. $user = $oauth->user();
  6. $info = Db::name( 'vote_user')->where( 'wx_id',$user[ 'original'][ 'openid'])->find();
  7. if( empty($info)){
  8. $add = [
  9. 'wx_id' => $user[ 'original'][ 'openid'],
  10. 'avatar' => $user[ 'avatar'],
  11. 'name' => $user[ 'name'],
  12. 'nickname' => $user[ 'nickname'],
  13. 'wx_content' => json_encode($user),
  14. 'createtime' => time(),
  15. 'updatetime' => time(),
  16. ];
  17. Db::name( 'vote_user')->insert($add);
  18. $info = Db::name( 'user')->where( 'wx_id',$user[ 'original'][ 'openid'])->find();
  19. }
  20. $token = sha1($info[ 'name'].$info[ 'wx_id'].$info[ 'updatetime']);
  21. header( 'location:'. '/#login/token/'.$token); // 跳转到 user/profile

到此整个微信登陆流程结束

 

 


转载:https://blog.csdn.net/crj121624/article/details/116304884
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场