vue2.0 Hash模式下实现微信分享
1,通过后台,获取accessToken 和 签名jsApiTicket,并写入浏览器缓存(可以写在app.vue中)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <script type= "text/ecmascript-6" > import Store from 'common/js/store.js' ; const CODE_SUC = 1; const CODE_ERR = 0; export default { name: 'app' , data () { return { wxToken: { accessToken: "" }, wxJsApiTicket: { jsApiTicket: "" } }; }, created () { setInterval( this .getAccessToken(), 7000); // 接口入住权限验证配置 }, components: { vFooter }, methods: {<br> // 获取accessToken 和 签名jsApiTicket,并写入浏览器缓存 getAccessToken () { this .axios.post( "/api/user/getAccessToken" , { "token" : null , "uid" : 0, "devType" : "wx" }).then((res) => { res = res.data; if (res.code === CODE_SUC) { // console.log(res.accessToken); this .wxToken.accessToken = res.accessToken; this .wxJsApiTicket.jsApiTicket = res.jsApiTicket; Store.saveAccessToken( this .wxToken); Store.saveJsApiTicket( this .wxJsApiTicket); // console.log(res.accessToken); } else if (res.code === CODE_ERR) { console.log( "获取accessToken失败" ); } }). catch ((res) => { window.alert( '网络异常,登录请求失败' ); }); } } }; </script> |
2,上面的store.js(写入浏览器缓存的文件)如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | const STORAGE_KEY1 = 'memberInfo' ; const STORAGE_KEY2 = 'token' ; const STORAGE_KEY3 = 'accessToken' ; const STORAGE_KEY4 = 'jsApiTicket' ; export default { fetchFromLocal () { return JSON.parse(window.localStorage.getItem(STORAGE_KEY1) || "{}" ); }, saveToLocal (obj) { window.localStorage.setItem(STORAGE_KEY1, JSON.stringify(obj)); }, saveAccessToken (obj) { window.localStorage.setItem(STORAGE_KEY3, JSON.stringify(obj)); }, saveJsApiTicket (obj) { window.localStorage.setItem(STORAGE_KEY4, JSON.stringify(obj)); } }; |
3,mian.js中,注册分享全局函数,并暴露出接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import wx from 'weixin-js-sdk' ; // 导入微信sdk import Store from 'common/js/store.js' ; // 导入store.js // 全局注册分享函数 Vue.prototype.wxShare = function (title, desc, link, imgUrl) { // 获取签名 this .axios.post( "/api/user/getSignature" , { "token" : null , "uid" : 0, "devType" : "wx" , "ticket" : Store.fetchjsApiTicket().jsApiTicket, // 获取浏览器缓存的签名 "url" : encodeURIComponent(window.location.href.split( '#' )[0]) // 此处进行一次编码 }).then((res) => { res = res.data; if (res.code === CODE_SUC) { wx.config({ debug: false , appId: '' , // 填写自己的appID timestamp: res.timestamp, nonceStr: res.noncestr, signature: res.signature, jsApiList: [ 'onMenuShareTimeline' , 'onMenuShareAppMessage' ] }); } else if (res.code === CODE_ERR) { console.log( "获取accessToken失败" ); } }). catch ((res) => { window.alert( '网络异常,登录请求失败' ); }); wx.ready(function () { // 分享给朋友 wx.onMenuShareAppMessage({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接 imgUrl: imgUrl, // 分享图标 type: '' , // 分享类型,music、video或link,不填默认为link dataUrl: '' , // 如果type是music或video,则要提供数据链接,默认为空 success: function () { window.alert( '已分享给朋友' ); this .axios.post( "/api/product/shareStatistics" , { "token" : null , "uid" : 0, "devType" : "wx" }).then((res) => { res = res.data; if (res.code === CODE_SUC) { window.alert( "分享返回数据成功" ); } else if (res.code === CODE_ERR) { console.log( "获取失败" ); } }). catch ((res) => { window.alert( '网络异常,登录请求失败' ); }); }, cancel: function () { // 用户取消分享后执行的回调函数 }, fail: function (res) { window.alert(JSON.stringify(res)); } }); // 分享到朋友圈 wx.onMenuShareTimeline({ title: title, // 分享标题 link: link, imgUrl: imgUrl, // 分享图标 success: function () { window.alert( '已分享到朋友圈' ); }, cancel: function () { // 用户取消分享后执行的回调函数 this .axios.post( "/api/product/shareStatistics" , { "token" : null , "uid" : 0, "devType" : "wx" }).then((res) => { res = res.data; if (res.code === CODE_SUC) { window.aleryt( "分享返回数据成功" ); } else if (res.code === CODE_ERR) { console.log( "获取失败" ); } }). catch ((res) => { window.alert( '网络异常,登录请求失败' ); }); }, fail: function (res) { window.alert(JSON.stringify(res)); } }); }); }; |
4,在相应的位置调用注册好的wxShare (title, desc, link, imgUrl)函数,并传入所需的值:
例:以下为分享商品详情页面,link 为自己拼接路径的变量
1 | this .wxShare( '商品详情' + ' ' + this .good.goodsInfo.goodsName, this .good.goodsInfo.goodsName, link, this .IMG_BASE_URL + this .good.goodsInfo.goodsImage); |
5,特别注意:在Hash模式下,安卓中会遇到分享到朋友圈之后,点击跳转会首页的情况,此时分享的路径与商品的真实路径是不一致的。需要在服务器端稍微处理一下。即把index文件,重新建一个文件夹,例如static,放进去。此时分享之后的路径,与真实路径才是一致的,也不会发生跳回首页的情况。苹果手机则不会有这个问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异