Home  >  Article  >  Web Front-end  >  Detailed explanation of the steps to implement WeChat authorized login in vue

Detailed explanation of the steps to implement WeChat authorized login in vue

php中世界最好的语言
php中世界最好的语言Original
2018-04-28 16:04:446591browse

This time I will bring you a detailed explanation of the steps for Vue to implement WeChat authorized login. What are the precautions for Vue to implement WeChat authorized login? The following is a practical case, let's take a look.

Background

Vue front-end and back-end separation development WeChat authorization

Scenario

app Share products to WeChat Moments or share it with WeChat friends. When the user clicks on the page, the WeChat authorized login is performed to obtain user information.

Problem: There is no fixed h5 application homepage. The redirect URL after authorization has parameters and is very long

I am stupid and have tried many methods during the development process. Trampling on pitfalls is not enough to describe my mood. It can be said that every time it is an experience of jumping into a well.

1. At first, the front end requests WeChat connection, returns the code, and then uses the code to request the backend interface to obtain the token. Later, I saw other people’s blogs saying that this method is not good, and it is best to directly request the backend interface. Then the background returns the URL for jump, so the most traditional method is adopted, the background returns the URL and the front desk jumps.

async ReturnGetCodeUrl() {
  let {
    data
  } = await getWxAuth({});
  if (data.status == 200) {
    window.location.href = data.url;
    // 返回的结果
    // redirect_uri重定向的url是后台的地址,后台就是可拿到code,获取token
    // https://open.weixin.qq.com/connect/oauth2/authorizeappid=xxxxxxxxxxxxxxxxxx&redirect_uri=***url***&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect
    
  }
 },
2. A problem arose at this time. WeChat authorization required a lot of hopping. Finally, it was a pain in the ass to go back to the link when I first clicked in. I checked the solution online and changed the link. As a redirect_uri parameter, it looks like this

https://open.weixin.qq.com/connect/oauth2/authorizeappid=xxxxxxxxxxxxxxxxxx&redirect_uri=*www.admin?http://www.xxx .com/h5/product*&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect

#However, our front-end link looks like this, with parameters and is super long, what? WeChat may not accept that I am so ugly. /(ㄒoㄒ)/~~

http://www.xxx.com/h5/product?id=6RedfM5O4xeyl0AmOwmyipkHr8AQC v-hYXZVAIFTwDXOsWSKqgu3VaCmaKSerBnacvWuzO3Zwdf8y/2K2lvqkluV6Ane4LCAKyPU2tPAPj/MF6 F6xkzp27GqqpNya7HbdEA34qGQJvHIA9tlIMkeEWid1112b8oZuP3FQBwU//MaSrovzQP6LlzWamyPnv0vMizu8uh0ItpJOQUV1m/temF3U9KuHo8rXCw=

Finally gave up on this plan

3. Consider how to redirect my front desk address and obtain the token

The next step is the method I use now, there are still many bugs , share my method first, and then optimize it later or make modifications if there is a better method

In main.js
RoutingThe global hook determines whether there is a user_token locally, which is what is returned after WeChat authorization token, if there is no token and the current route is not author (a page specifically designed for authorization), then save the current URL, such as www.xxx.com/h5/product?id=6RedfM5O4xeyl0AmOwm, and then enter author. If there is a token locally, that is, the user has previously authorized the token and there is no user information in vuex, then I will obtain the user information and save it in vuex. A problem encountered here is that the token will expire, then I will Delete If the local user_token is deleted, window.localStorage.removeItem("user_token"); refresh the page router.go(0); at this time, go through it again if there is no token.

 router.beforeEach((to, from, next) => {
   //  第一次进入项目
   let token = window.localStorage.getItem("user_token");
   
   if (!token && to.path != "/author") {
    window.localStorage.setItem("beforeLoginUrl", to.fullPath); // 保存用户进入的url
    next("/author");
    return false;
   } else if (token && !store.getters.userInfo) {
   //获取用户信息接口
    store
     .dispatch("GetUserInfo", {
      user_token: token
     })
     .catch(err => {
      window.localStorage.removeItem("user_token");
      router.go(0);
      return false;
     });
   }
   next();
  });
The following is the logic of entering author.vue. When entering author for the first time, www.xxxx.com/h5/author, determine whether the link has a token parameter. If not, jump to WeChat authorization, and then the background will restart. Direct it back and carry the token, such as: www.xxxx.com/h5/author?token=xxxxxxxxx&msg=200

<template>
  <p>
授权中。。。
  </p>
</template>
<script>
 
  import {
   getWxAuth
  } from '@/service/getData'
  import {
   GetQueryString 
  } from '@/utils/mixin';
  export default {
   data() {
     return {
      token: '',
     };
   },
   computed: {
    
   },
   created() {
     this.token = window.localStorage.getItem("user_token");
     //判断当前的url有没有token参数,如果不存在那就跳转到微信授权的url
     //就是前面说的ReturnGetCodeUrl方法
 
     if (!GetQueryString("token")) {
      this.ReturnGetCodeUrl();
     } else {
      //如果有token,如http://www.xxxx.com/h5/author?token=xxxxxxxxx&msg=200,这里的参数就是后台重定向到前台http://www.xxxx.com/h5/author,并携带的参数。这样就可以拿到我们想要的token了
      //判断一下后台返回的状态码msg,因为可能出现微信拿不到token的情况
      let msg = GetQueryString("msg")
      if (msg = 200) {
        this.token = GetQueryString("token");
        //存储token到本地
        window.localStorage.setItem("user_token", this.token);
        //获取beforeLoginUrl,我们的前端页面
        let url = window.localStorage.getItem("beforeLoginUrl");
        //跳转
        this.$router.push(url);
        //删除本地beforeLoginUrl
        removeLocalStorage("beforeLoginUrl");
      }else{
      //msg不是200的情况,可能跳到404的错误页面
      }
     }
   },
   methods: {
    
     async ReturnGetCodeUrl() {
      let {
        data
      } = await getWxAuth({});
      if (data.status == 200) {
       
        window.location.href = data.url;
      }
     },
     
   },
   watch: {},
   components: {},
   mounted: function () {}
  }
</script>
<style lang=&#39;scss&#39; scoped>
</style>
GetQueryString method

mixin.js

export const GetQueryString = name => {
 var url = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
 var newUrl = window.location.search.substr(1).match(url);
 if (newUrl != null) {
  return unescape(newUrl[2]);
 } else {
  return false;
 }
};
Believe it or not After reading the case in this article, you have mastered the method. For more exciting information, please pay attention to other related articles on the PHP Chinese website!

Recommended reading:

vue implements the verification code countdown function

How to deal with the 302 status code when axios appears

The above is the detailed content of Detailed explanation of the steps to implement WeChat authorized login in vue. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn