官网
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
参考博客
// 错误汇总
https://segmentfault.com/q/1010000002520634
http://blog.csdn.net/u011743396/article/details/62427452
// PC 端微信分享 二次分享失败解决之法
https://www.cnblogs.com/lpggo/p/7818491.html
Angular JS 分享,由于路由中的自带的# 导致微信分享出现问题。
下面的这个方式并不能解决的问题
最后这里我的问题是传回给后台交给微信审核认证的连接和我准备分享的连接有一些不一致导致的。
下面是前端分享的例子:
1、引入微信JSSDK
2、配置微信分享配置
function fnGetQueryString(key) { //正则获取url后面的参数值,如?env=dev&exp=123中可以通过fnGetQueryString('exp')=>得到123 var reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)"); var result = window.location.search.substr(1).match(reg); return result ? decodeURIComponent(result[2]) : false; } function funcUrlDel(name) { //删除url指定参数名并返回新的url var loca = window.location; var baseUrl = loca.origin + loca.pathname + "?"; var query = loca.search.substr(1); if (query.indexOf(name) > -1) { var obj = {}; var arr = query.split("&"); for (var i = 0; i < arr.length; i++) { arr[i] = arr[i].split("="); obj[arr[i][0]] = arr[i][1]; } delete obj[name]; var url = baseUrl + JSON.stringify(obj).replace('/[\"\{\}]/g', "").replace('/\:/g', "=").replace('/\,/g', "&"); return url } } function getlinkSearch(key, reqStr) { //这个作用同fnGetQueryString(key)函数差不多,不过它将reqStr参数替代了window.searsh获取的东西,因为上个函数在删除了url的某一参数后会返回一个新的带?参数查询的链接 var reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)"); var result = reqStr.substr(1).match(reg); return result ? decodeURIComponent(result[2]) : false; } // 这里的JS 是为了解决微信再进行第二次分享的时候会追加fromXXXXX等参数,导致二次分享失败。 function refreshUrl() { //强制刷新到不带二次分享参数页面 var url = "", reqStr = ""; if (fnGetQueryString('from')) { //from为微信二次分享自带参数 url = funcUrlDel('from'); var reqIndex = url.indexOf('?'); reqStr = url.substr(reqIndex); //截取去除from参数后的地址 console.log(url, reqStr); if (getlinkSearch('isappinstalled', reqStr)) { //isappinstalled为微信二次分享自带参数 url = url.substr(0, url.indexOf('?')); //截取去除isappinstalled参数后的地址 console.log(url); window.location.href = url; } else { window.location.href = url; } } } refreshUrl(); /** * 初始化微信签名 */ function initWechatShare() { var shareTitle = '校名册'; var shareDesc = $("#shareDesc").val(); // 分享的简介 可以由页面定制然后重新获取 var shareLinkUrl = "http://www.baidu.com/rosterIndex.htm"; var shareImgUrl = "http://www.baidu.com/update/logo.jpg"; //分享图标 var siteUrl = location.href; // 获取的连接必须和传回后台交个微信认证的url一致。 var requestUrl = "http://jrnbafinal.blazechina.com/wechat/web/jssdk/getSignature.htm"; $.post(requestUrl, {"jssdkUrl": siteUrl}, function(data){ console.log("JSSDK"+JSON.stringify(data)); if (data.status !== "success") { console.log(data.message); } var wechatConfig = data.data; var jsApiList = ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ','translateVoice','chooseImage']; /** * 初始化微信配置 * @param wechatConfig */ wx.config({ debug: true, appId: wechatConfig.wechatAppid, timestamp: wechatConfig.timestamp, nonceStr: wechatConfig.nonceStr, signature: wechatConfig.signature, jsApiList: jsApiList, }); wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 wx.checkJsApi({ jsApiList: jsApiList, // 需要检测的JS接口列表,所有JS接口列表见附录2, success: function(res) { // 以键值对的形式返回,可用的api值true,不可用为false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} console.log(res); } }); //分享到朋友圈 wx.onMenuShareTimeline({ title: shareTitle, // 分享标题 link: shareLinkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: shareImgUrl, // 分享图标 success: function () { console.log("分享到朋友圈成功"); // 用户确认分享后执行的回调函数 }, cancel: function () { console.log("分享到朋友圈失败"); // 用户取消分享后执行的回调函数 } }); //分享给朋友 wx.onMenuShareAppMessage({ title: shareTitle, // 分享标题 desc: shareDesc, // 分享描述 link: shareLinkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: shareImgUrl, // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { console.log("分享给朋友成功"); // 用户确认分享后执行的回调函数 }, cancel: function () { console.log("分享给朋友失败"); // 用户取消分享后执行的回调函数 } }); //分享到QQ wx.onMenuShareQQ({ title: shareTitle, // 分享标题 desc: shareDesc, // 分享描述 link: shareLinkUrl, // 分享链接 imgUrl: shareImgUrl, // 分享图标 success: function () { console.log("分享给QQ成功"); // 用户确认分享后执行的回调函数 }, cancel: function () { console.log("分享给QQ失败"); // 用户取消分享后执行的回调函数 } }); wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 console.log("错误"); console.log(res); }); }); }) } initWechatShare();
记一个错误:
我公司是外包公司,当时后台认证微信的服务端我没有更换,但是看第一次分享是没有问题的,但是连接连接参数中是没有fromXXXX 的 ,而是%72/dXXXX 这一种我看分享完了没有问题,就没有管,但是后面发现二次分享没有办法处理了,排查没有发现问题,最后修改了请求认证的服务端url才解决