vue微信授权登录

1 篇文章 0 订阅
1 篇文章 0 订阅

vue微信授权登录(亲测)


准备:
一、微信公众平台测试帐号申请
1、打开微信公众平台测试帐号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
通过微信扫一扫授权就能进入到测试号管理页面。

二、设置授权域名
在测试号管理页面,需要修改两个地方
第一个:将地址换成外网访问地址:
tool-editor

第二个**(此时不需要前面的http://)**:
如果报redirect_uri参数错误,可检查这步是否去除前面的http://

tool-editor

tool-editor

除了修改上面两个地方以外,作为测试号,还需要将当前页面前面的测试号信息发给后台

tool-editor

现在,前台的基本配置已经完成了。



微信网页授权文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

由微信的官方文档得知,授权登陆共分为四步:

1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

其中,第一步由前端来做,第二步前端把code传到后端,后端获取access_token,第三步第四步则需要后端完成。

写代码之前需要明确下需求,整理下思路,先想再写是个好习惯。

我们需要做的是:

1、前端在需要获取用户信息的页面调起登录,某些页面不需要,比如首页、某些展示静态页。
2、微信返回,前端截取返回url中的code传给后台,并把后台返回的Token存到Cookie和axios的header头中。
3、如果Cookie中已经有Token了,调另一个接口,判断token是否已经过期,过期重新登录。

一、微信授权(history模式/hash模式)

1、history模式下的微信授权登录
查阅Vue Router修改mode 为history 去掉“#/”符号,也需要后台配合改一下,不然页面会404。

mode: "history"

在路由守卫before-each.js的beforeEachHandler中写登录代码

白名单判断:

if ((to.meta && to.meta.needLogin)) {//授权操作

}else {//白名单内不做授权判断,直接next
    next()
  }

第一步:授权,1:

const appid = "wxd49a9705a0c6464a"; // 公众号的唯一标识
 //授权后重定向的回调链接地址, 请使用 encodeURIComponent 对链接进行处理
const redirect_uri = encodeURIComponent(window.location.href.split("?")[0]);
const scope = "snsapi_userinfo"  //弹出授权页面
const urls = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect `
window.location.href = urls

参数说明:
tool-editor

第二步:授权之后截取url中的code传给后台,2:

var code = to.query.code //History模式直接从url获取code
//前端将code传给后台,并把后台返回的Token存到Cookie和axios的header头中
const result = await commonApi.getUserInfo2({ code: code })
if (result.code == 200) {
    Cookie.set("Token", result.token)
    axios.defaults.headers.common['Token'] = result.token
    next()
 }

第三步:如果Cookie中有Token,3:

      // 获取本地token
      const hasToken = Cookies.get("Token");
      if (hasToken) {
        console.log("有token");
        //去 获取用户信息
        next()
      }else{//去执行第一步:授权
      console.log("无token")
      }

2、hash模式下的微信授权登录

微信授权登录验证会把网址中的#号去掉,这样在跳转的时候Vue拿不到Code。所以在第二步做了以下处理

 //Vue - router hash模式微信登录授权验证,#号处理
let href = window.location.href;
if (href.includes("code")) {  //url包括 com/?code 证明为从微信跳转回来的
var url = href.substring(0, href.length - 2); //vue自动在末尾加了 #/ 符号,截取去掉
var jingPosit = url.indexOf("?code"); //获取?code位置
var urlLeft = url.substring(0, jingPosit);//url左侧部分
var urlRight = url.substring(jingPosit, url.length); //url右侧部分
console.log(urlLeft + "#/" + urlRight);
window.location.href = urlLeft + "#/" + urlRight;//拼接跳转
}

获取code方式换成:

 var code = getQueryString("code");//hash模式获取url中code
 function getQueryString(name) {//解析url中的参数
  var arr = (location.hash || "")
    .substr(location.hash.indexOf("?") + 1)
    .replace(/^\#/, "")
    .split("&");
  var params = {};
  for (var i = 0; i < arr.length; i++) {
    var data = arr[i].split("=");
    if (data.length == 2 && data[0] == name) {
      return data[1];
    }
  }
  return null;
}

二、完整代码(hash模式为例,如果改为history模式,去掉相对应代码)

// 页面路由拦截
async function beforeEachHandler(to, from, next) {
  if ((to.meta && to.meta.needLogin)) {
    try {
      // 获取本地token
      const hasToken = Cookies.get("Token");
      if (hasToken) {
        console.log("有token");
        //去 获取用户信息接口
        next()
      } else {
        console.log("无token")
        var code = getQueryString("code");//hash模式获取url中code
        //var code = to.query.code //History 模式从url获取code
        if (code) {//如果存在code,则拿code去后台获取openid拿到用户信息token
          Cookies.set("Token", "dhjshruwy3888384")//没有对接口,token先写死
          next()
          //接口:前端将code传给后台,并把后台返回的Token存到Cookie和axios的header头中
          // const result = await commonApi.getUserInfo2({ code: code })
          // if (result.code == 200) {
          //   sessionStorage.setItem("Token", result.token)
          //   axios.defaults.headers.common['Token'] = result.token
          //   next()
          // }
        } else {//如果不存在code,url中包含code,说明已授权
      //hash模式微信登录授权验证,#号处理(如果在history模式下,这段#号处理if,else可删除)
          let href = window.location.href;
          if (href.includes("code")) {  //url包括 com/?code 证明为从微信跳转回来的
          //vue自动在末尾加了 #/ 符号,截取去掉
          var url = href.substring(0, href.length - 2); 
          var jingPosit = url.indexOf("?code"); //获取?code位置
          var urlLeft = url.substring(0, jingPosit);//url左侧部分
          var urlRight = url.substring(jingPosit, url.length); //url右侧部分
          console.log(urlLeft + "#/" + urlRight);
          window.location.href = urlLeft + "#/" + urlRight;//拼接跳转
          } else {//如果不存在code且url中不包含code,说明未授权,去微信授权
          const appid = "wxd49a9705a0c6464a"; // 公众号的唯一标识
          //授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
          const redirect_uri = encodeURIComponent(window.location.href.split("?")[0]);
          //应用授权作用域:snsapi_userinfo(弹出授权页面,可通过openId拿到昵称、性别、所在地。)
          const scope = "snsapi_userinfo"  
          // 应用授权作用域:snsapi_base (不弹出授权页面,直接跳转,只能获取用户openId)
          //  scope: "snsapi_base" 
          const urls = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect `
          window.location.href = urls
          }
        }
      }

    } catch (error) {
      console.error(error, "-------beforeEach错误日志-----")
      next(false)
    }
  } else {
    next()
  }
}

 function getQueryString(name) {//hash模式中需要用到解析url中的参数的函数
  var arr = (location.hash || "")
    .substr(location.hash.indexOf("?") + 1)
    .replace(/^\#/, "")
    .split("&");
  var params = {};
  for (var i = 0; i < arr.length; i++) {
    var data = arr[i].split("=");
    if (data.length == 2 && data[0] == name) {
      return data[1];
    }
  }
  return null;
}

总结:
1、我们只要能拿到code给后端,后端去拿openid,就算授权成功。
2、redirect_uri参数错误,检查下配置域名是否去除http://
3、response_type参数错误,检查redirect_uri 是否 encodeURIComponent
4、hash模式下:授权后重定向的回调链接地址反复授权,需要对#/处理,获取到code
5、如果改为history模式,需要后端配合修改nginx配置,否则部署会出现404

例子在:
手机端vue项目初始化工程模板:
http://47.107.67.231:8888/project-template/mobileInitProject
feature/wechat-auth分支下面

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 微信一键登录授权通常需要以下步骤: 1. 注册微信开放平台账号并创建应用,获取 AppID 和 AppSecret。 2. 在 Vue 项目中安装 `vue-wechat-auth` 插件,可以通过 npm 或 yarn 安装: ``` npm install vue-wechat-auth ``` 3. 在 `main.js` 中引入插件并配置: ```javascript import Vue from 'vue' import VueWechatAuth from 'vue-wechat-auth' Vue.use(VueWechatAuth, { appId: 'YOUR_APPID', responseType: 'code', scope: 'snsapi_userinfo', state: 'STATE', redirectUri: 'YOUR_REDIRECT_URI' }) ``` - `appId`:微信开放平台的 AppID。 - `responseType`:授权类型,一般为 `code`。 - `scope`:授权作用域,一般为 `snsapi_userinfo`。 - `state`:自定义参数,可为空。 - `redirectUri`:回调 URL,用于接收授权码。 4. 在需要使用微信登录的页面组件中添加登录按钮,并调用插件提供的 `wechatAuth()` 方法: ```html <template> <button @click="wechatLogin">微信一键登录</button> </template> <script> export default { methods: { wechatLogin() { this.$wechatAuth.redirect() } } } </script> ``` 5. 在回调 URL 页面组件中获取授权码,并调用接口进行登录或获取用户信息: ```html <template> <div> <!-- 获取授权码 --> <input v-model="code" placeholder="请输入授权码" /> <button @click="login">登录</button> </div> </template> <script> export default { data() { return { code: '' } }, methods: { login() { // 使用授权码调用后端接口进行登录或获取用户信息 // ... } } } </script> ``` 以上是一个简单的 Vue 微信一键登录授权的流程,其中的具体实现方式可能根据实际需求和后端接口的不同而有所差异。你可以根据具体情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值