Vue+Vue-router微信分享功能
在使用vue和vue-router路由框架已经开发过好几个项目了,其中也遇到不少坑,有些坑各种搜也没有找到非常理想的答案。
vue学习相对来说还是比较简单,官方文档说明非常清楚(https://cn.vuejs.org/v2/guide/),多做一些Demo就可以熟练上手了,并且现在也有好多框架(vuex,MintUI,Element,iView等),根据项目需要自行学则,因此本人也就没有怎么写过关于vue这方面的文章。
这次主要是把自己在微信中分享遇到的问题分享一下,Android机器中分享不会存在问题,主要是IOS分享各种签名,标题、内容、图片不改变问题。
1.微信分享当然要引入微信JS-SDK
微信JS-SDK说明文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
分享页面引入:http://res.wx.qq.com/open/js/jweixin-1.2.0.js
vue框架可以使用:https://github.com/yanxi-me/weixin-js-sdk 命令:npm install weixin-js-sdk
2.封装一下微信分享的功能,如下:
import wx from 'weixin-js-sdk';
import apiUrl from "@/config/apiUrl.js";
export default {
wxChat : ($vue, param) => {
let appId = "";
let timestamp="";
let nonceStr = "";
let signature = "";
let options = {
title: "",
desc: "",
link: "",
imgUrl: "",
type: "link",
dataUrl: "",
localUrl: ""
};
options = Object.assign({}, options, param);
//
$vue.$httpPost(apiUrl.weChatShare, {shareLink: options.localUrl}).then((res) => {
if(res.data&&res.data.status==="1000") {
wx.config({
debug: false,
appId: res.data.appId, // 和获取Ticke的必须一样------必填,公众号的唯一标识
timestamp: res.data.timestamp, // 必填,生成签名的时间戳
nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
signature: res.data.signature, // 必填,签名
jsApiList: [
'onMenuShareAppMessage', 'onMenuShareTimeline',
'onMenuShareQQ', 'onMenuShareQZone'
]
});
//处理验证失败的信息
wx.error(function (res) {
console.log('验证失败返回的信息:', res);
});
//处理验证成功的信息
wx.ready(function () {
//分享到朋友圈
wx.onMenuShareTimeline({
title: options.title, // 分享标题
link: options.link, // 分享链接
imgUrl: options.imgUrl, // 分享图标
success: function (res) {
// 用户确认分享后执行的回调函数
console.log("分享到朋友圈成功返回的信息为:", res);
showMsg("分享成功!");
},
cancel: function (res) {
// 用户取消分享后执行的回调函数
console.log("取消分享到朋友圈返回的信息为:", res);
}
});
//分享给朋友
wx.onMenuShareAppMessage({
title: options.title,
desc: options.desc,
link: options.link,
imgUrl: options.imgUrl,
type: options.type, // 分享类型,music、video或link,不填默认为link
dataUrl: options.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空
success: function (res) {
// 用户确认分享后执行的回调函数
console.log("分享给朋友成功返回的信息为:", res);
showMsg(JSON.stringify(options));
},
cancel: function (res) {
// 用户取消分享后执行的回调函数
console.log("取消分享给朋友返回的信息为:", res);
}
});
//分享到QQ
wx.onMenuShareQQ({
title: options.title,
desc: options.desc,
link: options.link,
imgUrl: options.imgUrl,
success: function (res) {
// 用户确认分享后执行的回调函数
console.log("分享到QQ好友成功返回的信息为:", res);
},
cancel: function (res) {
// 用户取消分享后执行的回调函数
console.log("取消分享给QQ好友返回的信息为:", res);
}
});
//分享到QQ空间
wx.onMenuShareQZone({
title: options.title,
desc: options.desc,
link: options.link,
imgUrl: options.imgUrl,
success: function (res) {
// 用户确认分享后执行的回调函数
console.log("分享到QQ空间成功返回的信息为:", res);
},
cancel: function (res) {
// 用户取消分享后执行的回调函数
console.log("取消分享到QQ空间返回的信息为:", res);
}
});
});
} else {
console.log(res.data.msg);
}
}).catch((err) => {
console.log(err);
});
}
};
3.如何使用封装的分享
如果使用vue路由hash模式,IOS中打开页面获取的地址永远都是一开始打开的地址,不是跳转后的当前页面地址,所以可以在打开的页面进行初始化调用或者在分享页面初始化满足(android),可以获取不同内核区分;要不就在跳转页面的时候使用location.href = "",不要使用路由,这样只需要在分享页面调用微信初始化。为了保险可以在router.beforeEach钩子里面保存跳转后的地址到localStorage.set("LocalUrl",document.URL)。
跳转页面:location.href = "?#/invite?userId=3" ;
import weixin from "@/utils/wechat.js";
initWxChat: function() {
let url = window.localStorage.getItem("LocalUrl")||window.location.href;
let param = {
title: "邀请有礼",
desc: "欢迎您参加邀请有礼",
link: window.location.href,
imgUrl: this.headPortrait,
localUrl: url
};
weixin.wxChat(this, param);
}
4.微信签名认证可以通过,但是自定义分享的内容不一定好使
这个问题主要是分享的页面带参数,由于路由Hash模式自动会加入#号,微信在IOS中自动加入了自己的内容,然后把#后面的内容放在了它的后面所以获取参数就会出现问题,或许签名认证也会出现问题,这样就想到了加入一个特殊符号去处理,在传入地址的参数#号前面加入一个?号,并且传递的参数最好只有一个,如果是多个话还是会存在问题。
获取当前页面地址:let url = window.localStorage.getItem("LocalUrl")||window.location.href;
分享授权认证页面localUrl:http://localhost:9000/?#/invite?userId=3;
真正要分享的页面link:window.location.href.split('#')[0] + "#/invite_share?userId=3";
如过没有看明白的可以私信我,或者大家有其它更好的解决办法欢迎留言,共同学习。
Vue+Vue-router微信分享功能的更多相关文章
- AndroidStudio用微信官方方法接入微信分享功能
转载请注明出处:http://www.cnblogs.com/wangoublog/p/5367950.html 现在微信的功能众所周知,用户量.影响力也是惊人,很多应用接入微信的功能已成为一种不可缺 ...
- 微信分享功能引入页面-控制分享时候调用的标题、图片、url和微信按钮隐藏显示控制
1.设置分享调用的标题.图片.url预览. 2.控制右上角三个点按钮的隐藏显示(和底部工具栏的显示隐藏--未测试). 3.判断网页是否在微信中被调用. <!doctype html> &l ...
- android APP 中微信分享功能实现 的总结
//花了很长时间最终完成了微信分享功能,中间走了很多弯路,在此做一下小结,希望对在应用中使用到微信分享的朋友有所帮助. 主要问题就是下面两个: 1.为什么运行了项目之后,微信分享只是闪了一下就没有了? ...
- 微信开发】【Asp.net MVC】-- 微信分享功能
[微信开发][Asp.net MVC]-- 微信分享功能 2017-01-15 09:09 by stoneniqiu, 12886 阅读, 15 评论, 收藏, 编辑 内嵌在微信中的网页,右上角都会 ...
- AndroidStudio怎么实现微信分享功能
在应用中添加微信分享功能,需要在微信开放平台上传你的应用,审核通过后方可使用此功能. https://open.weixin.qq.com/网址 申请的过程比较简单,这里就不追溯了,贴一个友情链接 h ...
- Android微信分享功能实例+demo
Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...
- php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义
https://blog.csdn.net/weixin_42231483/article/details/81585322 最近用PHP的tp3.2.3框架和js写的微信分享功能心得,分享的标题内容 ...
- VueJs单页应用实现微信网页授权及微信分享功能
在实际开发中,无论是做PC端.WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的功能及微信分享的功能,现在总算 ...
- 【微信开发】【Asp.net MVC】-- 微信分享功能
内嵌在微信中的网页,右上角都会有一个默认的分享功能.如下图所示,第一个为自定义的效果,第二个为默认的效果.实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程. 一.准备,设置js接口 ...
随机推荐
- JN5139 zigbee 资料
JN5139模块是一系列可以使使用者在最短的时间内在最低的成本下实现IEEE802.15.4或ZigBee兼容系统的表贴模块.此款模块减少了用户对于RF板设计和测试框架的昂贵漫长的开发时间.这些模块利 ...
- Mysql建库建用户建表等常用命令
格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...
- Django——权限
在models中为user添加权限,permissions第二个参数可指定权限的别名 创建的各种用户user保存在auth_user表中 创建的各种用户user的对应权限permission_id保存 ...
- 学习Struts--Chap07:Struts2文件上传和下载
1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...
- 多个string数组组装成一个List<Object>
最近遇到一个问题,数据库里面的数据存了一个多图字段和一个图片对应的排序,然后输出的时候需要按排序处理下. 当然,最容易想到的办法是遍历,然后添加,这次不想玩这么低级的代码,而且类似的需求项目中有好几个 ...
- SqlHelper分享
using Model; using System; using System.Collections.Generic; using System.Configuration; using Syste ...
- GMA Round 1 逃亡
传送门 逃亡 你在森林中,遇到了一只老虎.此时此刻,老虎在(0,0)的位置,你在(2,1)的位置. 你开始沿着一条林间小路逃亡,移动向量是$(\frac{\sqrt{6}}{2},\frac{\sqr ...
- poj1182 食物链(并查集 好题)
https://vjudge.net/problem/POJ-1182 并查集经典题 对于每只动物创建3个元素,x, x+N, x+2*N(分别表示x属于A类,B类和C类). 把两个元素放在一个组代表 ...
- .net core中的对象池
asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...
- React组件通信技巧
效果图 communication.gif 点击查看Github完整源码 1.父向子通信 直接标签中插入参数即可 //number只是个例子 let _number = this.state.numb ...