Vue微信公眾號網(wǎng)頁分享的示例代碼
前言
今天做了個分享功能,反正挺詭異的,下面就來說一說步驟
后端使用egg.js,代碼如下:
'use strict';
const Subscription = require('egg').Subscription;
class AccessToken extends Subscription {
static get schedule() {
return {
interval: '2h',//2小時獲取一次
type: 'all',
};
}
async subscribe() {
const config = this.ctx.app.config.wechat_config;
const url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET'.replace('APPID', config.appId)
.replace('APPSECRET', config.appSecret);
const res = await this.ctx.curl(url, {
dataType: 'json',
});
console.log(res);//accesstoken
if (res.data.errcode) {
return;
}
console.log('token ' + res.data.access_token);
const jsUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi'.replace('ACCESS_TOKEN', res.data.access_token);
const jsRes = await this.ctx.curl(jsUrl, {
dataType: 'json',
});
console.log('ticket ' + jsRes.data.ticket);//ticket
this.ctx.app.ticket = jsRes.data.ticket;
this.ctx.app.access_token = res.data.access_token;
}
}
module.exports = AccessToken;
async getJSsdk() {
const appId = this.ctx.app.config.wechat_config.appId;//appid
const ticket = this.ctx.app.ticket;//初始化時獲得的ticket
const nonceStr = Math.random()
.toString(36)
.substr(2, 15);
const timestamp = parseInt(new Date().getTime() / 1000);//秒為單位的時間戳
let url = this.ctx.query.link; //前端的頁面地址
url = decodeURIComponent(url);//解碼
const string = 'jsapi_ticket=' + ticket + '&noncestr=' + nonceStr + '×tamp=' + timestamp + '&url=' + url;
const hash = crypto.createHash('sha1');
hash.update(string);
const signature = hash.digest('hex');//生成簽名
this.ctx.body = {
status: true,
message: '獲取成功',
data
};
};
步驟
1.在vue項目中public目錄下的index.html中引入
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
2.在想分享的組件的mounted中加入如下代碼:
//如果不創(chuàng)建meta標(biāo)簽分享出去的就會沒有描述
var oMeta = document.createElement('meta');
oMeta.content = '隨意的內(nèi)容';//這里隨便寫
oMeta.name = 'keywords';
document.getElementsByTagName('head')[0].appendChild(oMeta);
var oMeta1 = document.createElement('meta');
oMeta1.content = '隨意的內(nèi)容';//這里隨便寫
oMeta1.name = 'description';
document.getElementsByTagName('head')[0].appendChild(oMeta1);
3.initJSSDK方法體:
function initJSSDK() {
let wechaturl = window.location.href.split('#')[0];//單頁應(yīng)用就獲取#前面的東西
let link = encodeURIComponent(wechaturl);
const jssdk = await getJSSDK(link); //給后端接口傳過去當(dāng)前頁面的地址,注意這個地址要配置在js安全域名里
wx.ready(() => {
let shareData = {
title: this.detail.title,
desc: this.detail.summary,
link: location.href, //必須是js安全域名下的地址(分享出去的沒有圖片顯示請檢查這里的link參數(shù))
imgUrl: window.wechatImg,//隨意地址的圖片都行,最好是jpg的,經(jīng)測試無圖片大小約束
success: function () {
console.log(1);
},
cancel: function () {
console.log(2);
}
};
wx.onMenuShareAppMessage(shareData);//分享給好友
wx.onMenuShareQQ(shareData);//分享給手機QQ
wx.onMenuShareQZone(shareData);//分享到QQ空間
wx.onMenuShareTimeline(shareData);//分享到朋友圈
});
wx.error(function (res) {
console.log(res);
});
wx.config({
debug: true,
appId: jssdk.appId, // 必填,公眾號的唯一標(biāo)識
timestamp: jssdk.timestamp, // 必填,生成簽名的時間戳,精確到秒(后端返回)
nonceStr: jssdk.nonceStr, // 必填,生成簽名的隨機串(后端返回)
signature: jssdk.signature, // 必填,簽名(后端返回)
jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline', 'onMenuShareQQ', 'onMenuShareQZone']
});
}
常見問題
無效的簽名:可能是前端encode地址過去后,后端忘記解碼了,也有可能是因為前端地址傳錯了或者沒有encode就傳過去了,后端簽名算法出錯的機率比較小.
還有可能是后端的ticket失效了(這個在開發(fā)過程中機率比較小)
無效的domain:前端給后端傳的地址可能沒有配置在js安全域名中
jssdk版本就用上面的1.4版本,同樣的代碼用了新版的就直接不行了,也沒有任何報錯。
暫時沒有發(fā)現(xiàn)網(wǎng)上所說的蘋果會出現(xiàn)問題。經(jīng)測試都是好的
到此這篇關(guān)于Vue微信公眾號網(wǎng)頁分享的示例代碼的文章就介紹到這了,更多相關(guān)Vue公眾號網(wǎng)頁分享內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解element-ui設(shè)置下拉選擇切換必填和非必填
這篇文章主要介紹了詳解element-ui設(shè)置下拉選擇切換必填和非必填,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Vue組件庫ElementUI實現(xiàn)表格列表分頁效果
這篇文章主要為大家詳細(xì)介紹了Vue組件庫ElementUI實現(xiàn)表格列表分頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
vue el-table實現(xiàn)行內(nèi)編輯功能
這篇文章主要為大家詳細(xì)介紹了vue el-table實現(xiàn)行內(nèi)編輯功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12

