在H5页面中禁止微信分享给好友和朋友圈,需要通过微信JS-SDK实现。 由于微信官方已经不再支持直接通过meta标签的方式禁用分享,必须通过JS-SDK的wx.hideMenuItems或wx.hideAllNonBaseMenuItem接口来实现。
以下是具体的步骤:
引入微信JS-SDK:
(建议使用最新版本的JS-SDK)
配置微信JS-SDK:
你需要通过后端接口获取签名等配置信息。后端需要使用你的AppID和AppSecret调用微信接口获取access_token,然后使用access_token获取jsapi_ticket,最后根据jsapi_ticket、当前页面的URL以及其他参数计算签名。
前端JS代码示例:
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时有效。
appId: '你的AppId', // 必填,公众号的唯一标识
timestamp: '时间戳', // 必填,生成签名的时间戳
nonceStr: '随机字符串', // 必填,生成签名的随机串
signature: '签名',// 必填,签名,见附录1
jsApiList: ['hideMenuItems', 'hideAllNonBaseMenuItem'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
处理wx.config的回调:
在wx.config的回调函数中,调用wx.ready来确保配置成功后才执行隐藏菜单的逻辑。
wx.config({
// ... (config parameters)
});
wx.ready(function () {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.hideMenuItems({
menuList: [
'menuItem:share:appMessage', // 分享给朋友
'menuItem:share:timeline', // 分享到朋友圈
'menuItem:share:qq', // 分享到QQ
'menuItem:share:weiboApp', // 分享到微博
'menuItem:favorite', // 收藏
'menuItem:share:QZone' // 分享到QQ空间
],
success: function (res) {
// alert('已隐藏菜单项');
},
fail: function (res) {
// alert('隐藏菜单项失败:' + JSON.stringify(res));
}
});
// 或者隐藏所有非基础按钮
// wx.hideAllNonBaseMenuItem({
// success: function (res) {
// // alert('已隐藏所有非基础按钮');
// },
// fail:function(res){
// // alert('隐藏所有非基础按钮失败:' + JSON.stringify(res));
// }
// });
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
// alert("配置失败:" + JSON.stringify(res));
});
关键点和注意事项:
签名算法: 签名算法比较复杂,建议使用后端语言提供的SDK来生成签名,避免出错。
URL: wx.config 中的 url 参数必须与当前页面的URL完全一致,包括参数,但不包括#后面的部分。 获取url的最佳实践是使用 location.href.split('#')[0]。
JS接口列表: jsApiList 参数必须包含你将要使用的所有JS接口,否则调用会失败。
测试: 在微信开发者工具中测试,并最终在真实的微信环境中验证功能。
hideMenuItems 和 hideAllNonBaseMenuItem 的区别: hideMenuItems 可以选择性地隐藏某些菜单项,而 hideAllNonBaseMenuItem 会隐藏所有非基础菜单项,包括分享