Запишите яму пользовательского обмена WeChat под vue2.0 (режим истории)

внешний интерфейс WeChat JavaScript Vue.js
Запишите яму пользовательского обмена WeChat под vue2.0 (режим истории)

Тукао: Я просматривал документ два или три раза до и после пользовательского обмена WeChat.Вы чувствуете, что большие парни настолько умны в написании документов? Два дня дрожал в углу...

Давайте (с гневом) посмотрим на документацию WeChat для разработки:портал

1. Настройте в соответствии с документом (имя домена безопасности общедоступной учетной записи, введение официального WeChat js)

2.Настройте разрешения, как описано в документации WeChat:Все страницы, которые должны использовать JS-SDK, должны сначала ввести информацию о конфигурации.

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

----->>>>>  通过调用后台接口来获取上面的 (* 必填项), 并在mounted开始配置初始化

3. Обрабатывайте успешную проверку через готовый интерфейс (пишите и делитесь друзьями и кругом друзей прямо в готовом методе)

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('验证失败');
  });
});

Благодаря вышеперечисленным трем шагам функция обмена друзьями и кругом друзей в WeChat завершена, и я очень рад открыть локальный инструмент отладки WeChat для разработчиков >>> Успех! ! ! !

Расскажите о разработке PR-функции и запустите ее с гордостью.

PR пришел ко мне через два дня и сказал мне, что есть проблема с обменом WeChat, WTF? ? Первые два дня все было нормально, но вдруг возникла проблема. Вот скриншот, опубликованный в сети:


Затем я начал исследовать, что пошло не так, один за другим.Сначала я проверил белый список WeChat, элементы конфигурации wx.config, фоновые данные и асинхронную инициализацию, а затем обратился к инструментам разработчика для проверки, и проблем не было. Поэтому я снова поднял его и обнаружил, что все еще не могу поделиться им.Я пошел в WeChat, чтобы посмотреть документ, и обнаружил, что там нет незаконных шрифтов и любого контента, нарушающего документ WeChat. Повторный обмен обнаружил закономерность.

Вот в чем дело! ! !

Появляется только в первой акцииНазвание и связь потеряны,Обновите текущую страницу, а затем успешно поделитесь ею, поэтому я выполнил поиск в Google и обнаружил, что WeChat не так дружелюбен к одностраничному обмену SPA (внезапно напомнил мне о предыдущем IE...), впервые под ios общая ссылка всегда будет URL-адресом, который вы посещаете в первый раз. Посмотрите на картинку ниже:


В системе ios его необходимо обновить один раз, чтобы правильно поделиться, и текущий URL-адрес необходимо сохранить.

Решение:

Создайте новый файл share.js в каталоге src/assets/js и зарегистрируйте его глобально в main.js.При вызове каждого компонента передайтеХук beforeRouteEnter оценивает терминал ios, а затем загружает новый документ с помощью метода assign().С тех пор пользовательский обмен WeChat закончился... Давайте посмотрим на результаты после успешного пользовательского обмена:


Конкретный метод реализации 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 );
    }
  })
}

Наконец, я хочу сказать, что когда я пишу контент, я фактически записываю свою собственную историю крови и слез, а также делюсь с вами ямой кастомного обмена WeChat. Документы WeChat иногда заставляют людей сомневаться в жизни и кодировании. есть что-нибудь лучше Решения могут быть сообщены.