您好,登錄后才能下訂單哦!
需求
最近在做一個(gè)項(xiàng)目需求,分享領(lǐng)好書活動(dòng),獲取用戶的個(gè)人信息以及unionID,并誘導(dǎo)用戶分享給好友或朋友圈,達(dá)到裂變拉新的目的。在做的過程中遇到了一些坑的地方,所以回過來總結(jié)一下
技術(shù)方案
使用微信JS-SDK自定義分享到好友和分享到朋友圈
實(shí)現(xiàn)步驟
1、要實(shí)現(xiàn)微信H5網(wǎng)頁自定義分享功能,必須先熟悉下微信公眾平臺(tái)開發(fā)文檔,具體文檔里面說的很詳細(xì),這里說下需要注意的點(diǎn),別忘了綁定開發(fā)者權(quán)限,還有綁定js安全域名,要不然有可能會(huì)報(bào)redirect_uri參數(shù)錯(cuò)誤。
2、首先一般在做微信H5網(wǎng)頁活動(dòng),都需要獲取用戶的個(gè)人信息,這就需要用戶授權(quán),一般授權(quán)有兩種方式,一種是靜默授權(quán),一種是網(wǎng)頁授權(quán),這個(gè)在微信開發(fā)文檔說的很詳細(xì)。
對(duì)于已關(guān)注公眾號(hào)的用戶,如果用戶從公眾號(hào)的會(huì)話或者自定義菜單進(jìn)入本公眾號(hào)的網(wǎng)頁授權(quán)頁,即使是scope為snsapi_userinfo,也是靜默授權(quán),用戶無感知
一般網(wǎng)頁授權(quán)流程分為四步:
①引導(dǎo)用戶進(jìn)入授權(quán)頁面同意授權(quán),獲取code
②通過code換取網(wǎng)頁授權(quán)access_token(與基礎(chǔ)支持中的access_token不同)
③如果需要,開發(fā)者可以刷新網(wǎng)頁授權(quán)access_token,避免過期
④通過網(wǎng)頁授權(quán)獲取用戶基本信息(openid 、UnionID、個(gè)人頭像、性別、省市、微信昵稱等)
3、下面是具體實(shí)現(xiàn)代碼,說下大概思路,通過判斷參數(shù)是否在微信瀏覽器中打開,是否讓用戶授權(quán),并重定向到微信的接口拿到code后通過接口傳給后端返回用戶的基本信息。
// 用戶授權(quán) if (this.$route.query.from) { // 跳轉(zhuǎn)微信頁面 let _nowUrl = window.location.href.split("?")[0] +`?pictureId=${this.$route.query.pictureId}`; // 參數(shù)拼接 let _shareUrl = `https://open.weixin.qq.com/connect/oauth3/authorize?appid=微信公眾號(hào)APPID&redirect_uri=${encodeURIComponent(_nowUrl)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`; window.location.href = _shareUrl; // 重定向到這個(gè)定義的URL } // 通過code獲取用戶信息 if (this.$route.query.code) { let _code = this.$route.query.code; this.handleWechatMsg(_code); }
4、接下來就是如何自定義分享給好友或者朋友圈,同樣也是按照調(diào)用微信開發(fā)文檔上說的進(jìn)行配置和調(diào)用。在調(diào)用分享接口成功之后開始調(diào)用分享api,并在調(diào)用成功之后的回調(diào)函數(shù)執(zhí)行跳頁,這里微信那邊做了限制,如果用戶在點(diǎn)擊分享的時(shí)候取消了,默認(rèn)還是走success成功回調(diào)函數(shù),是拿不到最終分享成功的狀態(tài)。下面是實(shí)現(xiàn)分享的具體代碼
// 分享給朋友或朋友圈 wxChatShare(param) { var that = this; let _url = encodeURIComponent(param.url); apiUrl.wechatConfig(_url).then(res => { if (res.data.code == 200) { wx.config({ debug: false, appId: res.data.content.appid, timestamp: res.data.content.timestamp, // 必填,生成簽名的時(shí)間戳 nonceStr: res.data.content.nonceStr, // 必填,生成簽名的隨機(jī)串 signature: res.data.content.signature, // 必填,簽名 jsApiList: [ "onMenuShareTimeline", "onMenuShareAppMessage" // "updateAppMessageShareData", // "updateTimelineShareData" ] }); // wx.ready(function() { //分享到朋友圈 wx.onMenuShareTimeline({ title: param.title, // 分享標(biāo)題 link: param.link, // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對(duì)應(yīng)的公眾號(hào)JS安全域名一致 imgUrl: param.imgUrl, // 分享圖標(biāo) success: function() { // 用戶點(diǎn)擊了分享后執(zhí)行的回調(diào)函數(shù) that.$Message.message("分享成功!"); that.toRouter(); } }); //分享到好友 wx.onMenuShareAppMessage({ title: param.title, // 分享標(biāo)題 desc: param.desc, // 分享描述 link: param.link, // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對(duì)應(yīng)的公眾號(hào)JS安全域名一致 imgUrl: param.imgUrl, // 分享圖標(biāo) type: param.type, // 分享類型,music、video或link,不填默認(rèn)為link dataUrl: param.dataUrl, // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認(rèn)為空 success: function() { // 用戶點(diǎn)擊了分享后執(zhí)行的回調(diào)函數(shù) that.$Message.message("分享成功!"); that.toRouter(); } }); // wx.updateTimelineShareData({ // title: param.title, // 分享標(biāo)題 // link: param.link, // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對(duì)應(yīng)的公眾號(hào)JS安全域名一致 // imgUrl: param.imgUrl, // 分享圖標(biāo) // success: function(res) { // // 設(shè)置成功 // that.$Message.message("設(shè)置成功!"); // that.toRouter(); // } // }); // //分享給朋友 // wx.updateAppMessageShareData({ // title: param.title, // 分享標(biāo)題 // desc: param.desc, // 分享描述 // link: param.link, // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對(duì)應(yīng)的公眾號(hào)JS安全域名一致 // imgUrl: param.imgUrl, // 分享圖標(biāo) // success: function(res) { // // 設(shè)置成功 // that.$Message.message("設(shè)置成功!"); // that.toRouter(); // } // }); // }); wx.error(function(res) { console.log("驗(yàn)證失敗返回的信息:", res); }); } else { console.log(res.data.message); } }) .catch(err => { this.$Message.message(error); }); },
總結(jié)
這里遇到比較坑的就是,在調(diào)用分享事件的時(shí)候,不能同時(shí)寫四個(gè)分享按鈕事件,如果都寫上,會(huì)造成在安卓機(jī)上還沒有點(diǎn)擊分享按鈕的時(shí)候,就已經(jīng)走分享成功success回調(diào)函數(shù)了,這里說下為啥寫四個(gè)分享按鈕事件,因?yàn)榘l(fā)現(xiàn)如果不寫上即將廢掉的兩個(gè)onMenuShareTimeline、onMenuShareAppMessage會(huì)在安卓機(jī)上遇到不能分享的問題,所以把新增的兩個(gè)分享按鈕事件updateAppMessageShareData、updateTimelineShareData注釋掉,就都可以分享了,iOS和安卓均沒問題。
我發(fā)現(xiàn)其實(shí)遇到這種原因有可能是新舊兩個(gè)分享事件的執(zhí)行順序的問題,也就是在調(diào)用新增的分享按鈕的時(shí)候,得先在wx.ready執(zhí)行,而即將廢棄的接口是不需要的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。