vue2实现微信分享坑点

作者: 宇cccc | 来源:发表于2017-05-24 11:19 被阅读17349次
    • 现在我的需求是在首页或者详情页点击分享 成功之后会请求后端接口 如果符合条件 则会得到一张
      项目地址 vue2投票系统
    • 首先 肯定是先撸一波文档 微信api接口文档
      微信分享其实很简单 步骤如下
    • 绑定域名

    先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。这个不多说,见文档,只有绑定了才能进行下一步的动作

    • 引入js文件

    此处我用的是vux内置的插件 其他方式正常引入script即可

    import { WechatPlugin} from 'vux'
    Vue.use(WechatPlugin); //  微信
    const wx = Vue.wechat; 
    
    • 通过config接口注入权限验证配置

    所有需要使用JS-SDK的页面必须先注入配置信息 配置信息需要后端返回

    // 此处我是定义在vue原型中 这样方便以后的调用 通过 this.wxShare()调用
    const imgUrl = 'http://xxx.xxxx.xxxx'; // 测试地址
    Vue.prototype.wxShare = function (title, desc, link) {
      const url = document.location.href;// 当前url
      http.get(getConfig(), {//请求配置
        params: {
          url: url
        }
      }).then(res => {// 获得签名配置
        var Data = res.data.data;
        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作
        wx.config({
          debug: false, // 开启调试模式,开发时可以开启  
          appId: Data.appid,   // 必填,公众号的唯一标识   由接口返回
          timestamp: Data.timestamp, // 必填,生成签名的时间戳 由接口返回
          nonceStr: Data.nonceStr,    // 必填,生成签名的随机串 由接口返回
          signature: Data.signature,   // 必填,签名 由接口返回
          jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline'] // 此处填你所用到的方法 
        });
      });
    wx.ready(() =>{
    // ..... code 
    }
    };
    
    • 定义方法

    Vue.prototype.wxShare = function (title, desc, link) {
    wx.config()
    wx.ready(() => {
        // 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,
        // 则可以直接调用,不需要放在ready函数中。
        wx.onMenuShareAppMessage({ // 分享给朋友
          title: title,       // 分享标题
          desc: desc,   // 分享描述
          link: link,       // 分享链接 默认以当前链接
          imgUrl: imgUrl + '/static/images/share.png',// 分享图标
          // 用户确认分享后执行的回调函数
          success: function () {
            var params = new URLSearchParams();
            params.append('token', window.localStorage.getItem('token'));
            params.append('type', 'share');
            http.post(shareCallback(), params).then(res => { // 请求后端分享成功之后获取一票的接口
              if (res.data.error == 0) { // 表示当天分享成功
                store.commit('shareChange', {// vuex弹出分享成功获取一票
                  isShare: true
                });
              } else {
                return;
              }
            })
          },
          // 用户取消分享后执行的回调函数
          cancel: function () {
            console.log('分享到朋友取消');
          }
        });
        //分享到朋友圈
        wx.onMenuShareTimeline({});
      });
    };
    

    然后在需要的钩子里面调用即可,以上的流程都可以在文档中查看

    • 坑点

    • 在ios微信浏览器中 window.onload.reload() 以及 window.location.go(0) 无效

    我想实现登陆之后刷新页面, 结果在登陆之后 ios并不会刷新页面
    解决办法: 最后使用 watch 解决

        watch: {
          login: function () {
            if (this.login) {
              this._getFansCard()
            }
          }
        }
    
    • ios上二次分享会出现签名错误, 并且莫名被拼接上了一串标识 此问题只有在ios上有

    微信截图_20170524110236.png

    ios会在#号中间添加一串标识 如下

    http://test.aaa.bbbb.com/?from=singlemessage&isappinstalled=0#/details?id=2
    // 原本链接 http://test.aaa.bbbb.com/#/details?id=2
    

    这个问题解决了两天,建议在一开始就开启debug模式,这样能及时知道问题所在
    解决办法:

    一开始以为是 ‘#’ 的问题 于是乎开启vue HTML5 History 模式 去除掉# 结果发现 在进入其他页面的时候 复制连接还是首页的链接 本质上是 vue-router切换的时候 都是操作的浏览器历史记录 (此时你可以复制url 都是一样的)真实URL为第一次刚进入时的URL

    • 导致错误是 当浏览者从分享窗口进入后,他从分享页按着正常路由跳转到其他页面,其他页面的逻辑中如果有需要获取当前页面url的需要,会发现这个url和正常路由跳转的不一样,导致签名不一致,所以获取不到正确的文案。
    • 解决: 每次路由变化时都重新请求下签名,签名的URL 用第一次进入时的URL就可以解决了.

    相关文章

      网友评论

      • 8a3ec291eac0:jsApiList 用到的方法动态的 不同路由 可能方法不一样 有的页面是好的 但是有的页面 签名能获取到 但是获取到的 JSSDK 权限 就获取不到了 有办法么
      • 萘小蒽:其他很细,但是建议你别用URLSearchParams这个方法,兼容性太差。
        萘小蒽:这只是以表单格式提交,以axios为例,你可以用对象来包装参数,在post提交之前transformRequest里,将data对象转化为表单的提交格式,说白了是要看仔细第三方文档哈。
        宇cccc:其实一直是用qs的 但是不知道为什么后端取不到 没办法只能用这种办法
      • 367a344f705c:写的很好,不过我没用vuex,需要做点小改动
      • 0bce343be48f:你好,楼主。解决方案不是很懂,能够详细的说一下吗?
      • yo握瑾怀瑜:博主,你好,我遇到一个分享的坑,就是我之前是自己写在vuex里面的action现在拿出来,用你的全局挂载的分享了,但是debug已经显示config:ok了,分享的参数仍然不能触发,需要当前页面二次刷新,才可以显示我配置的分享的标题等参数,请问 有遇到这种情况吗,IOS下是这种情况
        key_b994:亲,解决了么?
        657777713c40:我也是啊 请问解决了吗 求帮助
        天之炽_9901:我这边也是这样,始终找不到解决方案,你们有解决吗
      • 严严小辅:您好,我是做好的网址嵌入别个公众号的那种,ios分享的都是首页,自己内部代码可以解决这个问题么?
      • 1505f871c844:你的项目服务器那边报了500,想看下你的demon演示。
      • Cango:你好,我用的是vue-router的history模式,在android上签名和微信分享正常,但是在ios签名始终报错config:invalid signature。无论是每个页面重新做wx config还是只在首页做一次wx config,ios都是报无效签名。请问一下,哪里出问题了
        Cango:@宇cccc 请问一下,是不是因为在history模式下,ios的页面的页面跳转,但是链接不变,一直是首页地址,所以造成签名不过。
        Cango:@宇cccc url已经传了,因为android上分享是好着的
        宇cccc:@Cango 获取签名需要将当前url传给后端
      • 你是猪吗_95a7:你好,请问你最后面那个ios的分享的坑知道是怎么解决吗?我也被难在这里一天了
        宇cccc:每次路由变化时都重新请求下签名,签名的URL用第一次进入时的URL就可以解决了.
      • 白色轮回:敬爱的作者,github上有您的代码么,如果有的话,能分享一下么,万分感谢
      • 93aa29d75292:您好,请问一下,我也在做微信分享的功能,场景是当点击进入新闻详情页的时候,进行微信分享,我的url如:http://ecmagnet.natapp1.cc/mobile/newsdetail/1 我使用encodeURIComponent(window.location.href.split('#')[0]),这样得到当前的url,然后传递给后台,来获取appId,签名等信息,发现一直出现config:invalid signature这个错误,然后在微信平台上对singature测试,发现和后台传递给我的是一样的,但还是一直出现config:invalid signature错误,希望您能帮我看看
        93aa29d75292:@EricD_c898 早解决了,是签名的url的问题
        EricD_c898:楼住解决了吗···同问啊,签名验证没错,但是一直报 invalid signature
        宇cccc:开启debug模式 然后确定你传给后端的链接是正确的 如果是 那么基本是后端接口的问题了

      本文标题:vue2实现微信分享坑点

      本文链接:https://www.haomeiwen.com/subject/stlgxxtx.html