Vue项目history模式下微信分享总结
每回遇到微信分享都是一个坑,目前的商城项目使用Vue开发,采用history的路由模式,配置微信分享又遇到了很多问题,最后终于解决了,现将解决的过程分享一下。
技术要点
Vue,history模式
常见问题及说明
debug模式下报false
这个没得说,就是调用wx.config
方法的参数错误造成的,请确认以下事项:
- 是否成功绑定了域名(域名校验文件要能被访问到)
- 使用最新的js-sdk文件,因为微信会改部分api
- config方法的参数是否传正确了(拼写错误、大小写...)
- 需要使用的方法是否写在了
jsApiList
中 - 获取签名的url需要
decodeURIComponent
- 后台的生成签名的加密方法需要对照官方文档
debug返回ok,分享不成功
- 确保代码拼写正确
- 分享链接域名或路径必须与当前页面对应的公众号JS安全域名一致
- 接口调用需要放在
wx.ready
方法中
单页项目(SPA)中的一些要点
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
上面那段话摘自官方文档
开发者需要注意的事项:
- android和ios需要分开处理
- 需要在页面url变化的时候重新调用
wx.config
方法,android获取签名的url就传window.location.href
- Vue项目在切换页面时,IOS中浏览器的url并不会改变,依旧是第一次进入页面的地址,所以IOS获取签名的url需要传第一次进入的页面url
Code
router/index.js
......
|
|
import { wechatAuth } from "@/common/wechatConfig.js";
|
|
......
|
|
const router = new Router({
|
|
mode: "history",
|
|
base: process.env.BASE_URL,
|
|
routes: [
|
|
{
|
|
path: "/",
|
|
name: "home",
|
|
meta: {
|
|
title: "首页",
|
|
showTabbar: true,
|
|
allowShare: true
|
|
},
|
|
},
|
|
{
|
|
path: "/cart",
|
|
name: "cart",
|
|
meta: {
|
|
title: "购物车",
|
|
showTabbar: true
|
|
},
|
|
component: () => import("./views/cart/index.vue")
|
|
}
|
|
......
|
|
]
|
|
});
|
|
router.afterEach((to, from) => {
|
|
let authUrl = `${window.location.origin}${to.fullPath}`;
|
|
let allowShare = !!to.meta.allowShare;
|
|
if (!!window.__wxjs_is_wkwebview) {// IOS
|
|
if (window.entryUrl == "" || window.entryUrl == undefined) {
|
|
window.entryUrl = authUrl; // 将后面的参数去除
|
|
}
|
|
wechatAuth(authUrl, "ios", allowShare);
|
|
} else {
|
|
// 安卓
|
|
setTimeout(function () {
|
|
wechatAuth(authUrl, "android", allowShare);
|
|
}, 500);
|
|
}
|
|
});
|
代码要点:
- meta中的allowShare用于判断页面是否可分享
- window.__wxjs_is_wkwebview可用来判断是否是微信IOS浏览器
- entryUrl是项目第一次进入的页面的地址,将其缓存在window对象上
- 为什么安卓的时候要增加一个延时器,因为安卓会存在一些情况,就是即便签名成功,但是还是会唤不起功能,这个貌似是一个比较稳妥的解决办法
wechatConfig.js
import http from "../api/http";
|
|
import store from "../store/store";
|
|
export const wechatAuth = async (authUrl, device, allowShare) => {
|
|
let shareConfig = {
|
|
title: "xx一站式服务平台",
|
|
desc: "xxxx",
|
|
link: allowShare ? authUrl : window.location.origin,
|
|
imgUrl: window.location.origin + "/share.png"
|
|
};
|
|
let authRes = await http.get("/pfront/wxauth/jsconfig", {
|
|
params: {
|
|
url: decodeURIComponent(device == "ios" ? window.entryUrl : authUrl)
|
|
}
|
|
});
|
|
if (authRes && authRes.code == 101) {
|
|
wx.config({
|
|
//debug: true,
|
|
appId: authRes.data.appId,
|
|
timestamp: authRes.data.timestamp,
|
|
nonceStr: authRes.data.nonceStr,
|
|
signature: authRes.data.signature,
|
|
jsApiList: ["updateAppMessageShareData", "updateTimelineShareData", "onMenuShareAppMessage", "onMenuShareTimeline"]
|
|
});
|
|
wx.ready(() => {
|
|
wx.updateAppMessageShareData({
|
|
title: shareConfig.title,
|
|
desc: shareConfig.desc,
|
|
link: shareConfig.link,
|
|
imgUrl: shareConfig.imgUrl,
|
|
success: function () {//设置成功
|
|
//shareSuccessCallback();
|
|
}
|
|
});
|
|
wx.updateTimelineShareData({
|
|
title: shareConfig.title,
|
|
link: shareConfig.link,
|
|
imgUrl: shareConfig.imgUrl,
|
|
success: function () {//设置成功
|
|
//shareSuccessCallback();
|
|
}
|
|
});
|
|
wx.onMenuShareTimeline({
|
|
title: shareConfig.title,
|
|
link: shareConfig.link,
|
|
imgUrl: shareConfig.imgUrl,
|
|
success: function () {
|
|
shareSuccessCallback();
|
|
}
|
|
});
|
|
wx.onMenuShareAppMessage({
|
|
title: shareConfig.title,
|
|
desc: shareConfig.desc,
|
|
link: shareConfig.link,
|
|
imgUrl: shareConfig.imgUrl,
|
|
success: function () {
|
|
shareSuccessCallback();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
};
|
|
function shareSuccessCallback() {
|
|
if (!store.state.user.uid) {
|
|
return false;
|
|
}
|
|
store.state.cs.stream({
|
|
eid: "share",
|
|
tpc: "all",
|
|
data: {
|
|
uid: store.state.user.uid,
|
|
truename: store.state.user.truename || ""
|
|
}
|
|
});
|
|
http.get("/pfront/member/share_score", {
|
|
params: {
|
|
uid: store.state.user.uid
|
|
}
|
|
});
|
|
}
|
总结
原先计划不能分享的页面就使用hideMenuItems方法隐藏掉相关按钮,在ios下试了一下,有些bug:显示按钮的页面切换的影藏按钮的页面,分享按钮有时依然存在,刷新就没问题,估计又是一个深坑,没精力在折腾了,就改为隐私页面分享到首页,公共页面分享原地址,如果有什么好的解决办法,请联系我!
一开始我有参考sf上的一篇博客https://segmentfault.com/a/1190000014455713,按照上面的代码,android手机都能成功,但是IOS有一个奇怪的问题,就是分享间歇性的失效,同一个页面,刚刚调起分享成功,再试一次就失败(没有图标、title,只能跳转到首页),经过“不断”努力的尝试,应该是解决了问题,说一下过程:
- 一开始以为是异步唤起没成功的问题,就和android一样给IOS调用wechatAuth方法也加了个定时器,测了一遍没效果,放弃
- 起始js-sdk是通过npm安装的,版本上带了个test,有点不放心,改为直接使用script标签引用官方的版本
- 重新读了一遍文档,发现onMenuShareTimeline等方法即将废弃,就把jsApiList改为
jsApiList:['updateAppMessageShareData','updateTimelineShareData']
,改后就变成了IOS可以成功,android分享失败
- 百度updateAppMessageShareData安卓失败原因,参考这个链接https://www.jianshu.com/p/1b6e04c2944a,把老的api也加到jsApiList中,仔细、反复试了试两种设备都ok,好像是成功了,说"好像"是因为心里没底啊,各种“魔法”代码!
最后,在这里希望腾讯官方能不能走点心,更新文档及时点,demo能不能提供完整点....
参考链接
https://segmentfault.com/a/1190000014455713
https://www.jianshu.com/p/1b6e04c2944a
原文地址:https://www.cnblogs.com/guiyishanren/p/12695925.html
- 【AngularJS】—— 5 表单
- 【AngularJS】—— 1 初识AngularJs
- 【AngularJS】—— 2 初识AngularJs(续)
- 【AngularJS】—— 3 我的第一个AngularJS小程序
- 【Spring实战】—— 2 构造注入
- 共享单车运维“朋友圈”越来越宽,乱停乱放现象有望改善吗?
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 基于AngularJS的过滤与排序
- 【Spring实战】—— 5 设值注入
- 科学家预测:未来100万年人类将变成半机械人类
- 【Spring实战】—— 8 自动装配
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 案例:归档自动清理脚本失效及连带影响
- R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖
- R语言使用 LOWESS技术图分析逻辑回归中的函数形式
- R语言在逻辑回归中求R square R方
- R语言Poisson回归的拟合优度检验
- R语言ROC曲线下的面积-评估逻辑回归中的歧视
- 东芝MCU实现位带操作
- 单向链表的一点儿感悟
- rt-thread的内存管理分析
- R平方/相关性取决于预测变量的方差
- stata具有异方差误差的区间回归
- R语言用于线性回归的稳健方差估计
- 用SAS进行泊松,零膨胀泊松和有限混合Poisson模型分析
- 东芝开发板驱动OLED模块显示LOGO图片
- sas文本挖掘案例:如何使用SAS计算Word Mover的距离