基于JSSDK的微信扫描二维码踩坑记录之扫描成功后的回调请求

1,977 阅读3分钟

1.首先知道JSSDK使用步骤

image.png

1-1.绑定域名

在微信公众后台管理中完成,具体我没操作,后端大佬负责搞定了;

1-2.引入JS文件

  在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js 如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。

备注:支持使用 AMD/CMD 标准模块加载方法加载,使用npm安装weixin-js-sdk后,在需要使用的页面引入: import wx from 'weixin-js-sdk';

1-3. 通过config接口注入权限验证配置

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

1-4.通过ready接口处理成功验证

wx.ready(function(){
  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
})

2.项目代码展示

2-1调用二维码扫描

methods: {
    //调用二维码扫描
    openCamera() {
      var that = this;
      let url = window.location.href;
      if (url.includes('#')) {
        url = url.split('#')[0];
      }
      // 获取时间戳,,
      this.$axios
        .get('/SDSmart/xxxxxxx/getsignature', {
          params: { url: decodeURIComponent(url) },
        })
        .then((res) => {
          //   console.log(res);
          wx.config({
            debug: false,
            appId: 'wx01xxxxxxxxfd',
            timestamp: res.data.timestamp, //必填,生成签名的时间戳
            nonceStr: res.data.noncestr, // 必填,生成签名的随机串
            signature: res.data.signature, // 必填,签名
            jsApiList: ['scanQRCode', 'checkJsApi'], // 必填,需要使用的JS接口列表
          });
          wx.ready(() => {
            wx.checkJsApi({
              jsApiList: ['scanQRCode'], // 需要检测的JS接口列表
              success: function (res) {
              },
            });

            wx.scanQRCode({
              needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
              scanType: ['barCode', 'qrCode'], // 可以指定扫二维码还是一维码,默认二者都有
              success: function (res) {
                var result = res.resultStr;
                that.result = result;
              },
              fail: function (err) {
                alert('JSSDK  error' + JSON.stringify(err));
              },
            });
          });
        });
    },
    }

2-2扫描成功后的回调

data() {
    return {
      expertList: [], //专家列表
      currPage: 1, //页数
      pageSize: 10, //每页的数据个数
      result: '',//扫描成功后的回调链接
    };
  },
watch: {
    result() {
      let result = this.result;
      if (result !== '') {
        this.$axios
          .get(result, {
            headers: {
              user_id: localStorage.getItem('userId'),//首页授权限时存储的
              token: localStorage.getItem('token'),//首页授权限时存储的
            },
          })
          .then((res) => {
            this.expertList = [];
            Toast.loading({
              message: '您已成功关注该医生',
            });
            this.getList();
          });
      }
    },
  },

3.总结踩坑点

1.通过config注入权限验证时,调接口传的url必须是当前页面的url,用window.location.href获取,并且不能带#;传参时要 params: { url: decodeURIComponent(url) },用decodeURIComponent解码;

  1. jsApiList: ['scanQRCode'], // scanQRCode必填,需要使用的JS接口列表;

3.在开发中遇到ios系统调扫一扫调不起来问题,出现scanQRCode:premission denied的错;后来经历各种查询,终于找到原因了,我用的路由导航进入到扫一扫这个页面,ios获取location.href时就不是当前链接,所以在config那里就会出错;正确方法应该是用window.location.href跳转到有扫一扫按钮的页面;

4.调扫码成功后,我这里做的是一个关注的功能,扫码后要回调请求一下返回的链接,就是res.resultStr;我这里用来watch监听result,进行回调请求;(奔泪经历:回调时候,headers传参字段写错了,但是回调也成功了,就是一直没有添加数据成功,头大了好久,后来硬着头皮说后台有问题,然后被打脸,呜呜,写代码还是要仔细仔细再仔细,认真认真再认真!)

4.页面展示

image.png