vue引入微信jssdk / SDK
JavaScript Code复制内容到剪贴板
- npm i -S weixin-js-sdk
引入:
JavaScript Code复制内容到剪贴板
- import wx from 'weixin-js-sdk'
踩坑一:
微信分享:
QAQ1、router模式请改为hash:
JavaScript Code复制内容到剪贴板
- export default new Router({
- mode: 'hash',
- base:'/test/', // 根路径,可自定义
- routes: [
- // 用户部分
- {
- path: '/',
- name: 'userPetSelect',
- components: {
- main: userPetSelect,
- }
- },
QAQ2、关于网上资料说,IOS的请求页面权限需要使用入口记录第一次的url(在改为哈希模式后,这条不成立):
关于分享后的链接被微信添加了微信的自定义参数,如:
http://test.aaa.bbbb.com/?from=singlemessage&isappinstalled=0#/details?id=2
// 原本链接 http://test.aaa.bbbb.com/#/details?id=2
找了资料发现有小伙伴提供的一个方案很好用,在#前面加一个?号
JavaScript Code复制内容到剪贴板
- wxShare({state,commit},params) {
- let desc = params.desc, //分享的简介
- title = params.title,//params.title, //分享的标题
- shareUrl = params.link, //分享的链接
- imgUrl = params.imgUrl; //分享的缩略图
- let link = window.location.href; // 请求JSSDK的页面路径
- link = link.split('#')[0]; //签名需要传当前页面的url
- let linkEndString = link.charAt(link.length-1);
- if(linkEndString == '?'){
- link=link.substring(0,link.length-1)
- }
- shareUrl = link + "?#"+ shareUrl; //重新拼接分享的链接
- alert(shareUrl);
- request.post(global.shareUrl,{url:link}).then(response => {
- if(!response) {
- return false;
- }
- // 请求成功后保存
- let appId = response.appId;
- let timeStamp = response.timeStamp;
- let nonceStr = response.nonceStr;
- let signature = response.signature;
- wx.config({
- debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
- appId: appId,
- timestamp: timeStamp,
- nonceStr: nonceStr,
- signature: signature,
- jsApiList: [
- 'checkJsApi',
- 'onMenuShareTimeline', //分享到朋友圈
- 'onMenuShareAppMessage', //分享给朋友
- 'onMenuShareQQ', //分享到QQ
- 'onMenuShareWeibo', //分享到腾讯微博
- 'onMenuShareQZone', //分享到QQ空间
- ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
- });
- let share_config = {
- "imgUrl": imgUrl,//分享图,默认当相对路径处理,所以使用绝对路径的的话,“http://”协议前缀必须在。
- "desc" : desc,//摘要,如果分享到朋友圈的话,不显示摘要。
- "title" : title,//分享卡片标题
- "link": shareUrl,//分享出去后的链接,这里可以将链接设置为另一个页面。
- "success":function(){
- //分享成功后的回调函数
- commit("changeIfShare",true);
- let instance = Toast('分享成功');
- setTimeout(() => {
- instance.close();
- }, 1000);
- },
- 'cancel': function () {
- // 用户取消分享后执行的回调函数
- let instance = Toast('您已取消分享');
- setTimeout(() => {
- instance.close();
- }, 1000);
- }
- };
- wx.ready(function() {
- //分享给朋友
- wx.onMenuShareAppMessage(share_config);
- wx.onMenuShareAppMessage(share_config);
- wx.onMenuShareTimeline(share_config);
- wx.onMenuShareQQ(share_config);
- wx.onMenuShareWeibo(share_config);
- wx.onMenuShareQZone(share_config);
- })
- wx.error(function(res){
- // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
- alert.log(res);
- });
- });
- },
上面的放在action方法中,回调以后 可以通过变量值currentIfShare来控制
JavaScript Code复制内容到剪贴板
- const state = {
- currentIfShare:false, //当前页面是否已分享
- }
- const mutations = {
- changeIfShare(state,value){
- state.currentIfShare = value;
- },
- }
方法使用:
JavaScript Code复制内容到剪贴板
- data() {
- return {
- },
- mounted() {
- this.wxShare(); //执行微信分享
- },
- computed:{
- ifShare(){
- return this.$store.state.common.currentIfShare;
- },
- },
- watch:{
- ifShare(){
- if(this.ifShare){
- this.closePopup(); //如果ifShare参数为true,关闭遮罩层
- }
- },
- },
- methods: {
- openPopup(val) {
- this.popupVisible = true;//打开遮罩
- },
- closePopup(val) {
- //关闭遮罩层的同时,将当前分享状态设为false,分享成功后回调为true
- this.popupVisible = val;
- this.$store.commit('common/changeIfShare', false);
- },
- wxShare() {
- let defaultImg = this.$store.state.common.LOGOImg;console.log(defaultImg);
- var shareUrl = "/yoyo/user-homepage/"+sessionStorage.getItem("userId"); //分享链接
- let params = {
- title: 'yoyo个人博客', //分享的标题
- desc:'想要站在巨人的肩膀上,就从关注他开始!', // 分享的简介
- link: shareUrl, //分享链接
- imgUrl: defaultImg //分享默认图片
- };
- this.$store.dispatch("common/wxShare",params); // 进入方法,调取分享SDK接口
- }
- },
PS:改为哈希模式后,发现不需要判断设备了,该方法通用
QAQ3:路由中包含code参数?
在微信浏览器中,如果要获取用户授权,会自带一个code参数,这种情况,vue的分享路由就会出现问题,针对code 改一下截取:
JavaScript Code复制内容到剪贴板
- wxShare({state,commit},params) {
- let desc = params.desc, //分享的简介
- title = params.title,//params.title, //分享的标题
- shareUrl = params.link, //分享的链接
- imgUrl = params.imgUrl; //分享的缩略图
- let link = window.location.href; // 请求JSSDK的页面路径
- link = link.split('#')[0]; //签名需要传当前页面的url
- request.post(global.shareUrl,{url:link}).then(response => {
- if(!response) {
- return false;
- }
- // 请求成功后保存
- let appId = response.appId;
- let timeStamp = response.timeStamp;
- let nonceStr = response.nonceStr;
- let signature = response.signature;
- wx.config({
- debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
- appId: appId,
- timestamp: timeStamp,
- nonceStr: nonceStr,
- signature: signature,
- jsApiList: [
- 'checkJsApi',
- 'onMenuShareTimeline', //分享到朋友圈
- 'onMenuShareAppMessage', //分享给朋友
- 'onMenuShareQQ', //分享到QQ
- 'onMenuShareWeibo', //分享到腾讯微博
- 'onMenuShareQZone', //分享到QQ空间
- ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
- });
- let code = global.GetQueryString('code'); // 定义GET参数
- if(code !=null && code.toString().length>1)
- {
- link = link.split('?')[0];//如果有code值要截取?之前
- }else{
- link = link.split('#')[0]; //签名需要传当前页面的url
- }
- let linkEndString = link.charAt(link.length-1);
- if(linkEndString == '?'){
- link=link.substring(0,link.length-1)
- }
- shareUrl = link + "?#"+ shareUrl; //重新拼接分享的链接
- let share_config = {
- "imgUrl": imgUrl,//分享图,默认当相对路径处理,所以使用绝对路径的的话,“http://”协议前缀必须在。
- "desc" : desc,//摘要,如果分享到朋友圈的话,不显示摘要。
- "title" : title,//分享卡片标题
- "link": shareUrl,//分享出去后的链接,这里可以将链接设置为另一个页面。
- "success":function(){
- //分享成功后的回调函数,改变当前分享状态为true,默认为false
- commit("changeIfShare",true);
- let instance = Toast('分享成功');
- setTimeout(() => {
- instance.close();
- }, 1000);
- return true;
- },
- 'cancel': function () {
- // 用户取消分享后执行的回调函数
- let instance = Toast('您已取消分享');
- setTimeout(() => {
- instance.close();
- }, 1000);
- return false;
- }
- };
- wx.ready(function() {
- //分享给朋友
- wx.onMenuShareAppMessage(share_config);
- wx.onMenuShareAppMessage(share_config);
- wx.onMenuShareTimeline(share_config);
- wx.onMenuShareQQ(share_config);
- wx.onMenuShareWeibo(share_config);
- wx.onMenuShareQZone(share_config);
- })
- // wx.error(function(res){
- // // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
- // alert.log(res.errMsg);
- // });
- });
- },
获取地址栏的GET参数方法:
JavaScript Code复制内容到剪贴板
- GetQueryString(name){
- //js获取地址栏的GET参数
- var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
- var r = window.location.search.substr(1).match(reg);
- if(r!=null)return unescape(r[2]); return null;
- },
在安卓的分享成功后的回调中,不仅有自己配置的分享成功,还会出现安卓本身的,已分享字样,故,增加判断设备 :
踩坑二:微信支付
不需要使用预先SDK的接口支持,直接引入SDK后,加点击事件:
JavaScript Code复制内容到剪贴板
- wx.chooseWXPay({
- appId: data.appId,
- timestamp: data.timeStamp, // 支付签名时间戳,最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
- nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位
- package: data.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
- signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
- paySign: data.paySign, // 支付签名
- success: function(res) {
- // 支付成功后的回调函数
- alert("支付成功");
- this.intoByType();
- }
- });
这里对这个timestamp字段,有一个争议,看到有的文档中是S大写,有的是小写,在vue的脚手架上项目开启了debug后,发现该字段赋值为underfined,在微信的debug中,也是timeStamp,在JS中却要使用小写的,具体看使用情况吧!
上一篇 vue 富文本编辑器
下一篇 动态立体盒子效果