記錄一次vue2.0(history模式)下微信自定義分享的坑


吐槽:關於微信自定義分享前先後後翻了文檔兩三遍,感受大佬們寫文檔都是這麼瀟灑麼?躲在角落裏的我瑟瑟發抖了兩天.....ios

下面咱們(帶着憤怒)來看微信文檔來進行開發:傳送門ajax

1. 根據文檔來配置(公衆號安全域名,引入官方微信js算法

2. 配置權限,根據微信文檔描述:全部須要使用JS-SDK的頁面必須先注入配置信息json

wx.config({
    debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
    appId: '', // 必填,公衆號的惟一標識
    timestamp: , // 必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名
    jsApiList: [] // 必填,須要使用的JS接口列表
});

----->>>>>  經過調用後臺接口來獲取上面的 (* 必填項), 並在mounted開始配置初始化複製代碼

3. 經過ready接口處理成功驗證(直接在ready方法內寫分享朋友以及朋友圈)api

wx.ready(function(){

  // 分享到朋友圈
  wx.onMenuShareTimeline ({
    title: `title`,
    desc: `desc`,                           //  分享描述
    link:  `本身分享的路由地址`, 分享連接,該連接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致複製代碼
imgUrl: `自定義圖標`, // 分享圖標
    success: function () {
    },
    cancel: function () { 
    }
  });

  // 分享給朋友
  wx.onMenuShareAppMessage({
    title: `title`,
    desc: `desc`,
    link:  `本身分享的路由地址`, 分享連接,該連接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致
    imgUrl: `自定義圖標`, // 分享圖標複製代碼
success: function () {
    },
    cancel: function () { 
    }
  });

  wx.error(function(){
    salert('驗證失敗');
  });
});複製代碼

經過以上三個步驟,微信分享朋友以及朋友圈功能完成,很高興的打開本地微信開發者工具調試 >>> 成功了!!!!瀏覽器

帶着自豪的心情告訴PR功能開發完上線。安全

過兩天PR過來跟我說,微信分享有問題,WTF??前兩天還能夠,忽然就出問題了,下面是線上分享的截圖:bash


接下來開始逐一來排查究竟是哪出了問題,首先檢查微信白名單、wx.config配置項、後臺數據、以及異步初始化,而後又去開發者工具看了一下,並無任何問題。因而又推上去了,發現仍是分享不出來,又去微信看了一下文檔,發現並無違規字體以及任何違反微信文檔的內容。反覆分享發現一個規律。微信

重點來了!!!微信開發

只有在第一次分享出現標題以及鏈接丟失,刷新一次當前頁面後再去分享就成功了,因而谷歌搜了一下,發現微信對SPA單頁面分享並非那麼友好(忽然讓我想起了之前的IE...),在ios下面第一次分享的連接永遠都是你第一次訪問的url。看下圖:


在ios系統要刷新一次來才能正確分享,而且要保存當前url

解決辦法:

在src/assets/js目錄下面新建一個share.js,並在main.js進行全局註冊,在每一個組件進行調用的同時經過beforeRouteEnter鉤子判斷ios終端,而後經過assign()方法加載一個新的文檔,自此微信自定義分享結束啦...........,來看一下自定義分享成功以後的成果:


beforeRouteEnter具體實現方法:

beforeRouteEnter (to, from, next) {
  var u = navigator.userAgent;
  var IOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端
  // 修復iOS版微信HTML5 History兼容性問題
  if (IOS && to.path !== location.pathname) {
    // 此處不能用location.replace
    location.assign(to.fullPath)
  } else {
    next()
  }
}複製代碼

下面share.js是具體實現方法:

// ajax來請求wexin 
  function getWxChat() {
     return new Promise((resolve, reject) => {
       $.ajax({
         url: 'https://res.wx.qq.com/open/js/jweixin-1.0.0.js',
         dataType: "script",
         cache: true,
      })
      .done(function () {
       resolve(window.wx)
      })
      .fail(function (error) {
        reject(error);
      });
    })
 }

 // 後臺索要簽名算法
  function backAround() {
    return new Promise((resolve, reject) => {
      $.ajax({
        url: `XXX.com`,//後臺索要的算法簽名
        method: 'POST',
        data: {
          url: window.location.href.split('#')[0],
        },
        type : 'json'
      }).done(function(ret) {
        resolve(ret)
      }).fail(function(ret) {
        reject( ret );
      })
    })
  }
export function wechatShare(shareDate) {
  return new Promise(async function(resolve, reject) {
    try{
      let isWechat=navigator.userAgent.indexOf('MicroMessenger')>-1 //判斷爲微信瀏覽器

      if(!isWechat){
        return resolve('not weichat')
      }
      if(!window.wx){
        await getWxChat();
      }

      var defaultData = {
        title: `分享的標題`,
        content: `內容`,
        link: `${window.location.href}`,
        logo: ``, //分享出來的圖片的
        success: function (res) {
        },
      }

      let data = { ...defaultData, ...shareDate }
      let ret = JSON.parse(await backAround())

      wx.config({
        debug: false, // 開啓調試模式,
        appId: 'XXXXX', // 必填,公衆號的惟一標識
        timestamp: ret.timestamp, // 必填,生成簽名的時間戳
        nonceStr: ret.nonce_str, // 必填,生成簽名的隨機串
        signature: ret.signature,// 必填,簽名,見附錄1
        jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline']
      })

      wx.ready(function () {

        wx.onMenuShareTimeline({
          title: data.title,
          desc: data.content,
          link: data.link,
          imgUrl: data.logo,
          dataUrl: '',
          success: data.success,
          cancel: function () {}
        })

        wx.onMenuShareAppMessage({
          title: data.title,
          desc: data.content,
          link: data.link,
          imgUrl: data.logo,
          dataUrl: '',
          success: data.success,
          cancel: function () {}
        })
      
      })
    }catch(error){
      reject( error );
    }
  })
}

複製代碼

最後想說下寫內容的時候實際上是在記錄本身的血淚史,也給你們分享下微信自定義分享的坑,微信的文檔有時候會讓人懷疑人生,懷疑codeing,若是你們有什麼更好的解決方法能夠交流下。

相關文章
相關標籤/搜索