Vue:实现JSSDK调取微信扫一扫功能

概要

功能需求:项目需求VueH5项目调取微信的扫一扫功能,实现扫码获取二维码返回信息

请求微信的授权地址

1.在用户登录项目的时候需要跳转微信的授权地址:微信教程地址概述 | 微信开放文档

  (1):项目安装JSSDK :  安装完成查看根目录 package.json文件,查看是否引入成功

npm install weixin-js-sdk

(2.)安装了 JSSDK 后,就可以准备微信授权了 

 1.跳转微信授权

//路由前置守卫 路由跳转前触发 并做出一些处理
router.beforeEach((to,from,next)=>{
  //检查是否已经授权了,授权之后后端回调跳转到前端页面,并在路由上携带了用户的信息,因为扫码进入的路径是'/invioce' 但是前端路由是hash模式,路由携带#号,避免跳转的路由地址没有携带#号
  if(window.location.href.indexOf('?') === -1 || to.path === '/invioce'){
    window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=公众号AppId&redirect_uri=后端提供的地址入口/wetchat/callback&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
  }
  next()
})

 2.后端拿到数据,回调到我们页面(需要跟后端确定,授权完成之后跳转的路径 比如 : ''#/index'')

  access_token:概述 | 微信开放文档

前端域名地址/index?access_token=调取微信接口的临时票据&open_id=用户的openId每个微信openid都是唯一的&user_name=用户微信昵称#/index 

 

 3.拿取路由中携带的用户信息


 mounted(){
       //获取用户的信息 已对象的形式  {"键":"值","键":"值"}
      let urlText = this.getUrlParams(window.location.href)
      //将用户信息保存到本地
      localStorage.setItem('URL',JSON.stringify(urlText))

     
    
},
getUrlParams(url) {
       //地址中是否包含 ?
      if (!url.includes("?")) {
        return {};
      }
      // 通过 ? 分割获取后面的参数字符串
      let urlStr = url.split('?')[1]
      // 创建空对象存储参数
      let obj = {};
        // 再通过 & 将每一个参数单独分割出来
      let paramsArr = urlStr.split('&')
      for(let i = 0,len = paramsArr.length;i < len;i++){
            // 再通过 = 将每一个参数分割为 key:value 的形式
        let arr = paramsArr[i].split('=')
        if(arr[1].indexOf('#') !== -1){
          arr[1] = arr[1].slice(0,arr[1].indexOf('#'))
        }
        obj[arr[0]] = arr[1];
      }
    return obj
}

wx.Config配置

1.在需要用到扫一扫的页面中通过config接口注入权限验证配置

 (1)请求后端接口

mounted(){
    //拿取本地址保存的 用户open_id ,和请求签名的url,去掉#号后面的参数,相当于拿网页域名了比如:https://houduan.yuming.com/#/add_invoice?id=183611 => https://houduan.yuming.com/.
这次请求中没把access_token传过去,因为后端自己保存了access_token没让我传,access_token是用来拿取
jsapi_ticket,然后通过jsapi_ticket 和另外一些参数去拿取微信签名
    let signList = JSON.parse(localStorage.getItem('URL'))
    this.get_sign.open_id = signList.open_id
    this.get_sign.url = location.href.split('#')[0]
},

scan(){
      this.$axios.get('后端的接口地址',{
          params:this.get_sign
        }).then(res=>{
          //获取后端接口返回的 微信签名 和 其他参数
          console.log('res',res);
          let  resMsg = res.data
          wx.config({
            // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            debug: false,
            // 必填,公众号的唯一标识
            appId: resMsg.appId,
            // 必填,生成签名的时间戳
            timestamp: resMsg.timestamp,
            // 必填,生成签名的随机串
            nonceStr: resMsg.nonceStr,
            // 必填,签名,见附录1
            signature: resMsg.signature,
            // 必填,需要使用的JS接口列表,我这里是请求的扫一扫
            jsApiList: ["scanQRCode"],
          });

          wx.ready(() => {
            //微信扫一扫请求操作
            this.ClickScan(this.type)
          });

          wx.error((res) => {
            console.log("失败",res);
          });
          
        })
    },

wx.scanQRCode调起摄像头

ClickScan(type) {
         wx.scanQRCode({
              needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
              scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
              success: (res) => {
                //扫码返回的结果
                let data_code = res.resultStr
              },
              cancel: () => {
                console.log('err', res);
                this.$dialog.alert({
                 message:res
                });
              },
            });
    },

小结

提供一些错误信息的截图

如果在wx.config中debug设置为true ,并且项目中出现错误提示

 1.请求签名的url 和 前端请求wx.config中的url不一致 就会提示这个错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值