Vue h5 微信二次分享

1. npm install weixin-jsapi
2. 对应文件引用 import wx from 'weixin-jsapi'

微信文档

参考链接

3. 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。(一般后端配置)
后端配置
4. 前端需要调取后端的接口,获取微信的congfig所需要的参数
wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名
    jsApiList: [] // 必填,需要使用的JS接口列表
});
5.遇到的问题
  1. invalid url domain 当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名

    导致的原因是:

    1.后端没有配置 '对应公众号' 的 'js接口安全域名'
    2. 确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
    3. 接口修改了,没有通知前端修改
  2. invalid signature 签名错误

    导致原因:1.请求后端接口传值没有取当前页面完整的URL (window.localhost.url)2.一定要去掉&from=timeline&isappinstalled=0
  3. 一开始分享还是链接地址,等两秒就正常了

    导致原因:没有把微信的js以及对应的配置放在前面
index.vue
import CONFIG from './config';
import wx from 'weixin-jsapi';
export default {
  created(){ // A页和A页里面的子页B都需要分享,需要处理一下
        let me = this
        const imgUrl = 'banner.jpg';// 直接拿服务器里面图片地址
        const title = '这是标题';
        const desc = '这是副标题';
        let tempUrl = window.location.href;
        if(tempUrl.indexOf("from") > -1){ // 二次分享会自动拼接&form=来源,需要切割掉
            tempUrl = tempUrl.indexOf("?from") > -1?tempUrl.split('?from')[0] :tempUrl.split('&from')[0]
            // location.href= tempUrl+"#hashchat"; // 如果子页面需要分享,就用这个
            window.location.href= tempUrl // 只有一个页面分享,就不用带参数
         }
       
        //  如果A页面里面的子页B也需要分享,就加这个,不需要就删掉 start 
        // if(tempUrl.indexOf("#hashchat") > -1){
         //   if(CONFIG.platform.android){ // 安卓需要监听退出事件,安卓返回需要点击两次才会完全退出
           //     pushHistory();
         //       window.addEventListener("popstate", function(e) {
           //         if(tempUrl.indexOf("#hashchat") > -1){
         //               wx.closeWindow(); 
         //           }
                    
           //     }, false);
           //     function pushHistory() {
          //          var state = {
           //             title: "title",
           //             url: "#"
           //         };
                    // pushState 改变网址却不需要刷新页面
          //          window.history.pushState(state, "title", "#hashchat");
      //          }
        //    }
            
       //  }
      // end 
     // 如果根据后端接口来变更分享的内容,只需要在接口成功返回内,调用这个方法
      this.getWeChat(imgUrl,title,desc)
    },
  mounted:{
    getWeChat(imgUrl,title,desc){
      this.$request({ // 改成自己的接口请求方式
            url: "/接口",
            method: "get",
            query: {
                // 必须跟地址栏的地址一模一样, 必须跟地址栏的地址一模一样, 必须跟地址栏的地址一模一样
                url : window.location.href //URL 完整的链接
            }
        }).then((res) => {
            if(!res) return
            wx.config({
                debug: false, //开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: res.appId, // 必填,公众号的唯一标识
                timestamp: res.timestamp, // 必填,生成签名的时间戳
                nonceStr: res.nonceStr, // 必填,生成签名的随机串
                signature: res.signature, // 必填,签名
                jsApiList: [ // 用的方法都要加进来
                    'updateAppMessageShareData', 'updateTimelineShareData','onMenuShareAppMessage','onMenuShareTimeline'
                ]
            });
            CONFIG.getWxReady(imgUrl,title,desc)
        })
      }
    }
}

config.js
export default {
  // 判断机型 可不要
  platform: (function() {
        var nav = window.navigator;
        var platform = {
            "iphone": false,
            "ipad": false,
            "android": false,
            "pc": false,
            "ios": false,
            "version": "0"
        };

        var ua = nav.userAgent;
        var android = ua.match(/(Android)\s+([\d.]+)/);
        var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
        var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/);
        if (ipad) {
            platform.ipad = ipad[1] && true || false;
            platform.version = ipad[2] && ipad[2].replace(/-/g, ".") || "";
            platform.ios = true;
        } else if (iphone) {
            platform.iphone = iphone[1] && true || false;
            platform.version = iphone[2] && iphone[2].replace(/-/g, ".") || "";
            platform.ios = true;
        } else if (android) {
            platform.android = android[1] && true || false;
            platform.version = android[2];
        } else {
            platform.pc = true;
        }

        return platform;
    })(),
  //微信分享
  getWxReady() {
        // 一开始打印支持哪些方法
        // wx.checkJsApi({
        //     jsApiList:['updateAppMessageShareData','updateTimelineShareData','onMenuShareAppMessage'],
        //     success:function(res){
        //         console.log('checkJsApi -> res',res)
        //     }
        // })
        wx.ready(function() {
            const url = window.location.href // 要取当前URL
            // onMenuShareAppMessage 文档上说即将废弃,但是安装的这个weixin-jsapi版本只有这个可以用,不支持updateAppMessageShareData
            //分享给朋友
            if (wx.updateAppMessageShareData) {
                wx.updateAppMessageShareData({
                    title: title, // 分享标题
                    desc: desc, // 分享描述
                    link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    imgUrl: imgUrl, // 分享图标
                    success: function() {
                        // 设置成功
                    }
                })
            } else {
                //分享给朋友 
                wx.onMenuShareAppMessage({
                    title: title, // 分享标题
                    desc: desc, // 分享描述
                    link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    imgUrl: imgUrl, // 分享图标
                    type: '', // 分享类型,music、video或link,不填默认为link
                    success: function() {
                        // 用户点击了分享后执行的回调函数
                    }
                })
            }
            if (wx.updateTimelineShareData) {
                //分享到朋友圈
                wx.updateTimelineShareData({
                    title: title, // 分享标题
                    link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    imgUrl: imgUrl, // 分享图标
                    success: function() {
                        // 设置成功
                    }
                });
            } else {
                wx.onMenuShareTimeline({
                    title: title, // 分享标题
                    link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                    imgUrl: imgUrl, // 分享图标
                    success: function() {
                        // 设置成功
                    }
                })

            }
            // 分享QQ
            wx.onMenuShareQQ({
                title: title, // 分享标题
                desc: desc, // 分享描述
                link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: imgUrl, // 分享图标
                success: function() {
                    // 设置成功
                },
                cancel: function() {
                    // 用户取消分享后执行的回调函数
                }
            })
        })
    }
}

微信二次分享bug集合

你可能感兴趣的:(Vue h5 微信二次分享)