vue微信分享總匯

本文通過(guò)自己開(kāi)發(fā)過(guò)程遇到一些坑做一次總結(jié):

一梧疲、首先交代一下基本過(guò)程和工具

1、肯定是先擼一波文檔微信api接口文檔

2幌氮、 配置 JS 接口安全域名:登錄微信公眾平臺(tái)缭受,配置安全域名

1514816668(1).jpg

假設(shè)你的前端項(xiàng)目訪(fǎng)問(wèn)的主域名是 abc.com,那就填 abc.com浩销。

3贯涎、引入js文件
此處用的是vux內(nèi)置的插件 其他方式正常引入script即可;

import { WechatPlugin} from 'vux'
Vue.use(WechatPlugin); //  微信
const wx = Vue.wechat;

我推薦直接寫(xiě)在index.html的head中要不引入問(wèn)題可能會(huì)報(bào)錯(cuò)慢洋;要把sdk盡量往前放塘雳;

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
  <title></title>
  <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
</head>

4、后端獲取微信簽名(傳路徑給后臺(tái)返回參數(shù)用于配置wx.config)
這個(gè)步驟需要后端寫(xiě)代碼和微信服務(wù)器進(jìn)行交互普筹,獲得「網(wǎng)頁(yè)授權(quán)access_token」败明,根據(jù)這個(gè) 「網(wǎng)頁(yè)授權(quán) access_token」 把關(guān)鍵的幾個(gè)參數(shù)算出來(lái),傳給前端太防。這幾個(gè)參數(shù)分別是:
appId , timestamp , nonceStr , signature
后端要算出這幾個(gè)參數(shù)不僅僅需要 「網(wǎng)頁(yè)授權(quán) access_token」妻顶,還需要一個(gè) URL 參數(shù)。這個(gè) URL 是前端當(dāng)前的 URL蜒车。
比如 www.abc.com/123 這個(gè)頁(yè)面需要微信分享功能讳嘱,那么就把這個(gè) URL 傳個(gè)后端,后端算出來(lái)參數(shù)再返回給前端酿愧。
注意沥潭,只要 URL 發(fā)生變化,都得需要重新獲取微信分享參數(shù)嬉挡。除非個(gè)別頁(yè)面不需要微信分享功能钝鸽。

1514816829(1).jpg

如果前端用的是 vue-router ,請(qǐng)盡量用 history 模式庞钢。如果你用的是 hash 模式拔恰,那么你給后端傳遞 URL 是有坑的,具體可以看這篇文章基括。

// 此處我是定義在vue原型中 這樣方便以后的調(diào)用 通過(guò) this.wxShare()調(diào)用
const imgUrl = 'http://xxx.xxxx.xxxx'; // 測(cè)試地址
Vue.prototype.wxShare = function (title, desc, link) {
  const url = document.location.href;// 當(dāng)前url
  http.get(getConfig(), {//請(qǐng)求配置
    params: {
      url: url
    }
  }).then(res => {// 獲得簽名配置
    var Data = res.data.data;
    // config信息驗(yàn)證后會(huì)執(zhí)行ready方法颜懊,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶(hù)端的異步操作
    wx.config({
      debug: false, // 開(kāi)啟調(diào)試模式,開(kāi)發(fā)時(shí)可以開(kāi)啟  
      appId: Data.appid,   // 必填风皿,公眾號(hào)的唯一標(biāo)識(shí)   由接口返回
      timestamp: Data.timestamp, // 必填饭冬,生成簽名的時(shí)間戳 由接口返回
      nonceStr: Data.nonceStr,    // 必填,生成簽名的隨機(jī)串 由接口返回
      signature: Data.signature,   // 必填揪阶,簽名 由接口返回
      jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline'] // 此處填你所用到的方法 
    });
  });
wx.ready(() =>{
// ..... code 
}
};

這步很重要,具體看下邊vue在微信中的坑患朱;
5鲁僚、定義方法(可以將該方法放在mounted中,并在其中放入‘分享給朋友’,‘分享至朋友圈’的js接口)

Vue.prototype.wxShare = function (title, desc, link) {
wx.config()
wx.ready(() => {
    // 所以如果需要在頁(yè)面加載時(shí)就調(diào)用相關(guān)接口冰沙,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來(lái)確保正確執(zhí)行侨艾。對(duì)于用戶(hù)觸發(fā)時(shí)才調(diào)用的接口,
    // 則可以直接調(diào)用拓挥,不需要放在ready函數(shù)中唠梨。
    wx.onMenuShareAppMessage({ // 分享給朋友
      title: title,       // 分享標(biāo)題
      desc: desc,   // 分享描述
      link: link,       // 分享鏈接 默認(rèn)以當(dāng)前鏈接
      imgUrl: imgUrl + '/static/images/share.png',// 分享圖標(biāo)
      // 用戶(hù)確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
      success: function () {
        var params = new URLSearchParams();
        params.append('token', window.localStorage.getItem('token'));
        params.append('type', 'share');
        http.post(shareCallback(), params).then(res => { // 請(qǐng)求后端分享成功之后獲取一票的接口
          if (res.data.error == 0) { // 表示當(dāng)天分享成功
            store.commit('shareChange', {// vuex彈出分享成功獲取一票
              isShare: true
            });
          } else {
            return;
          }
        })
      },
      // 用戶(hù)取消分享后執(zhí)行的回調(diào)函數(shù)
      cancel: function () {
        console.log('分享到朋友取消');
      }
    });
    //分享到朋友圈
    wx.onMenuShareTimeline({});
  });
};

然后在需要的鉤子里面調(diào)用即可,以上的流程都可以在文檔中查看;
6、到此處如果順利就可以成功分享侥啤。如果有坑接著往下看当叭;

二、vue在微信中的坑盖灸;

1蚁鳖,在hash模式下:
定義一下: A = http://vigor.dev.yaoguo.cn/#/
B = http://vigor.dev.yaoguo.cn/#/plan
index = 首頁(yè)路徑;
plan = 計(jì)劃頁(yè)路徑赁炎;
shareA = http://vigor.dev.yaoguo.cn/?from=singlemessage&isappinstalled=0#/醉箕;
shareB = http://vigor.dev.yaoguo.cn/?from=singlemessage&isappinstalled=0#/plan;
(1)在安卓和瀏覽器下(包括ios)都是正常顯示:從index 進(jìn)入項(xiàng)目,跳轉(zhuǎn)到plan顯示: index = A,plan = B;
(2)分享出去頁(yè)面:從index進(jìn)入項(xiàng)目徙垫,分享出去路徑:shareA ;點(diǎn)擊跳轉(zhuǎn)到plan讥裤,分享出去路徑:shareB ;
從plan進(jìn)入一樣,分享出去頁(yè)面為加from參數(shù)的當(dāng)前頁(yè)姻报;
(3)通過(guò)window.location.href alert出的路徑:index = A,plan = B;為正常能拿到己英;

然后說(shuō)下不同的地方:
在ios微信打開(kāi):從index 進(jìn)入項(xiàng)目,跳轉(zhuǎn)到plan顯示:
(1)通過(guò)微信右上角打開(kāi)按鈕在其他瀏覽器打開(kāi):通過(guò)index進(jìn)入項(xiàng)目逗抑,在瀏覽器打開(kāi)index頁(yè)面剧辐。點(diǎn)擊跳轉(zhuǎn)到plan頁(yè)面再通過(guò)其他瀏覽器打開(kāi)依然是index頁(yè)面; 從plan進(jìn)入項(xiàng)目邮府,在瀏覽器打開(kāi)plan頁(yè)面,點(diǎn)擊跳轉(zhuǎn)到index頁(yè)面再通過(guò)其他瀏覽器打開(kāi)依然是plan頁(yè)面;
(2) ios: 從index進(jìn)入項(xiàng)目荧关,在本頁(yè)分享,分享出去路徑:shareA;點(diǎn)擊到plan褂傀,分享出去路徑:shareA 此時(shí)分享出去的路徑是一樣的忍啤; 從plan進(jìn)入項(xiàng)目,分享出去頁(yè)面路徑一樣為:shareB ;

造成問(wèn)題:(1)wx.config簽名使用的url認(rèn)證錯(cuò)誤;
解決辦法:wx.config簽名使用的url仙辟,通過(guò)window.location.href.split('#')[0]獲韧ā;
(2)如果分享當(dāng)前頁(yè)叠国,需要做不同的處理未檩;

那么在分享認(rèn)證用路徑就有問(wèn)題:

拿 URL 換取微信分享 config 時(shí),最好這么寫(xiě):
const url = window.location.href.split('#')[0]粟焊;以下所有子頁(yè)面也就認(rèn)證成功冤狡;
注意這個(gè)url需要 encodeURIComponent(url);
或者直接寫(xiě)主域名孙蒙。例如:http://wwww.baidu.com/
如果:

image.png

報(bào)這個(gè)錯(cuò)誤:1、url不對(duì)悲雳;2,挎峦、后臺(tái)給你的數(shù)據(jù)算法不對(duì)(找接口改);3合瓢、清除緩存坦胶;

  • ios上二次分享會(huì)出現(xiàn)簽名錯(cuò)誤, 并且莫名被拼接上了一串標(biāo)識(shí) 此問(wèn)題只有在ios上有

ios會(huì)在#號(hào)中間添加一串標(biāo)識(shí) 如下

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

這個(gè)問(wèn)題解決了兩天,建議在一開(kāi)始就開(kāi)啟debug模式,這樣能及時(shí)知道問(wèn)題所在

解決辦法:

一開(kāi)始以為是 ‘#’ 的問(wèn)題 于是乎開(kāi)啟vue HTML5 History 模式 去除掉# 結(jié)果發(fā)現(xiàn) 在進(jìn)入其他頁(yè)面的時(shí)候 復(fù)制連接還是首頁(yè)的鏈接 本質(zhì)上是 vue-router切換的時(shí)候 都是操作的瀏覽器歷史記錄 (此時(shí)你可以復(fù)制url 都是一樣的)真實(shí)URL為第一次剛進(jìn)入時(shí)的URL

  • 導(dǎo)致錯(cuò)誤是 當(dāng)瀏覽者從分享窗口進(jìn)入后,他從分享頁(yè)按著正常路由跳轉(zhuǎn)到其他頁(yè)面晴楔,其他頁(yè)面的邏輯中如果有需要獲取當(dāng)前頁(yè)面url的需要顿苇,會(huì)發(fā)現(xiàn)這個(gè)url和正常路由跳轉(zhuǎn)的不一樣,導(dǎo)致簽名不一致,所以獲取不到正確的文案。

  • 解決: 每次路由變化時(shí)都重新請(qǐng)求下簽名滥崩,簽名的URL 用第一次進(jìn)入時(shí)的URL就可以解決了.

但是我們需求不是所有頁(yè)面都是一樣的分享怎么辦岖圈?

在main.js驗(yàn)證成功config后,在需要的頁(yè)面把微信分享提供的代碼寫(xiě)入鉤子函數(shù)中就好了钙皮;
隱藏按鈕也一樣蜂科;

我們也可以禁止掉微信默認(rèn)分享;(具體看文檔)

wx.hideMenuItems({
menuList: [] // 要隱藏的菜單項(xiàng)短条,只能隱藏“傳播類(lèi)”和“保護(hù)類(lèi)”按鈕导匣,所有menu項(xiàng)見(jiàn)附錄3
});

使用方式,直接將項(xiàng)隱藏的菜單項(xiàng)
發(fā)送給朋友: "menuItem:share:appMessage"
分享到朋友圈: "menuItem:share:timeline"
分享到QQ: "menuItem:share:qq"
分享到Weibo: "menuItem:share:weiboApp"
收藏: "menuItem:favorite"
分享到FB: "menuItem:share:facebook"
分享到 QQ 空間/menuItem:share:QZone
放入到menuList:[]括號(hào)中茸时,具體拼接方式贡定,大概是","

三、開(kāi)發(fā)的時(shí)候可都,一定要下載一個(gè)微信開(kāi)發(fā)者工具缓待,在那里面進(jìn)行微信分享測(cè)試。代碼開(kāi)啟 debug 模式后渠牲,如果簽名錯(cuò)誤旋炒,微信開(kāi)發(fā)者工具會(huì)直接提醒你的。判斷簽名是否正確非常重要签杈。傳送門(mén)

四瘫镇、iOS下微信分享成功后不執(zhí)行success中的方法:

1、更新引入新的sdk:https://res.wx.qq.com/open/js/jweixin-1.3.2.js
2答姥、在success中加入
 setTimeout(function(){ 
  // 執(zhí)行函數(shù)
}, 500);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铣除,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹦付,更是在濱河造成了極大的恐慌尚粘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敲长,死亡現(xiàn)場(chǎng)離奇詭異背苦,居然都是意外死亡互捌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)行剂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人钳降,你說(shuō)我怎么就攤上這事厚宰。” “怎么了遂填?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵铲觉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吓坚,道長(zhǎng)撵幽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任礁击,我火速辦了婚禮盐杂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哆窿。我一直安慰自己链烈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布挚躯。 她就那樣靜靜地躺著强衡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪码荔。 梳的紋絲不亂的頭發(fā)上漩勤,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音缩搅,去河邊找鬼越败。 笑死,一個(gè)胖子當(dāng)著我的面吹牛誉己,可吹牛的內(nèi)容都是我干的眉尸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巨双,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼噪猾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起筑累,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袱蜡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后慢宗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坪蚁,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奔穿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敏晤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贱田。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘴脾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耗拓,我是刑警寧澤奏司,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站竿刁,受9級(jí)特大地震影響麻献,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜监婶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一惑惶、第九天 我趴在偏房一處隱蔽的房頂上張望短纵。 院中可真熱鬧,春花似錦鱼冀、人聲如沸悠就。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炸茧。三九已至稿静,卻和暖如春辕狰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柳琢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毙驯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓垦巴,卻偏偏與公主長(zhǎng)得像铭段,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子憔披,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • 1芬膝、下載weixin-js-sdk 的依賴(lài) cnpm install weixin-js-sdk --save 2...
    fangzy0723閱讀 947評(píng)論 0 1
  • 網(wǎng)上非常多的微信分享例子和教程锰霜,但是都不全面癣缅,甚至不少錯(cuò)誤哄酝。自己根據(jù)微信官方文檔踩了好幾個(gè)坑才擼成功友存。痛定思痛爬立,寫(xiě)...
    Yi罐可樂(lè)閱讀 15,229評(píng)論 7 30
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理侠驯,服務(wù)發(fā)現(xiàn),斷路器吟策,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 今天跟楊靜一起回家,路上聊了很多着撩,我發(fā)現(xiàn)她最近狀態(tài)不錯(cuò)匾委,成長(zhǎng)挺快的。 她也是剛開(kāi)始做店長(zhǎng)薯鳍,也沒(méi)有經(jīng)驗(yàn)挨措,現(xiàn)在好像慢慢...
    楊榮鵬閱讀 204評(píng)論 0 4