在微信浏览器内打开任何网页,若不配置分享接口,微信会默认使用以下信息做为分享信息:javascript
即在微信里打开一个不对微信浏览器作特殊处理的网站,点击右上角分享,分享出去的消息就是下面这样的:html
在不少时候,默认的分享的图片和摘要都是达不到预期的。本篇文章就记录个人作微信分享信息定制的过程和踩坑总结。java
说明:appId和signature都应后台获得,具体的写法能够参考官方文档。算法
参考:https://mp.weixin.qq.com/wiki(微信网页开发->微信JS-SDK说明文档->附录6-DEMO页面和示例代码)api
先登陆微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。浏览器
在须要调用JS接口的页面引入以下JS文件,(支持https):http://res.wx.qq.com/open/js/...安全
说明:在angular2中,可直接在index.html页面中引入,这样每一个页面都会引入。微信
全部须要使用JS-SDK的页面必须先注入配置信息,不然将没法调用。angular2
wx.config({ debug: true, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数 appId: '', // 必填,公众号的惟一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填。注意,signature应由后台返回 jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ'] // 必填 });
wx.ready(function () { wx.onMenuShareAppMessage({ //配置分享给朋友接口 title: '分享的标题', // 分享标题 desc: '这是一个测试分享', // 分享描述 link: location.href, // 分享连接 imgUrl: '', // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 若是type是music或video,则要提供数据连接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }) });
至此,分享功能大功告成。可是,这就要求在每一个组件中都加微信分享代码,会致使维护困难。app
因为Angular2加载每一个组件都被包在根组件里,所以能够只在根组件中配置公共的分享配置信息,便可给全部的页面添加优化的分享操做。配置思路以下:
基于以上思路,最终的实现代码以下:
//*说明:AppComponent必须为根组件 export class AppComponent implements OnInit,AfterViewInit { ... ngAfterViewInit() { this.configWXShare(); //在根组件中配置分享 } //配置分享 private configWX() { this.router.events.subscribe((val) => { if (val instanceof NavigationEnd) { //绑定路由变化事件,每次新转到一个页面即 let page = this; page.commonService.getWXJsInitConfig().then(obj => { page.commonService.configWXJs(obj, [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ']); }); setTimeout(function () { //默认的分享信息 let shareData = {title: '分享的标题' , link: location.href , desc: '分享的描述' , imgUrl: page.getShareImgUrl() }; //获取页面中配置的分享信息,如未配置则使用默认信息 shareData['title'] = document.getElementById('shareTitle') ?document.getElementById('shareTitle').innerText : shareData.title; shareData['imgUrl'] = document.getElementById('shareImg') ? document.getElementById('shareImg').getAttribute('src') : shareData.imgUrl; shareData['desc'] = document.getElementById('shareDesc') ? document.getElementById('shareDesc').innerText : shareData.desc; wx.ready(function () { wx.onMenuShareAppMessage(shareData); // 分享微信 wx.onMenuShareTimeline(shareData); // 分享到朋友圈 wx.onMenuShareQQ(shareData); // 分享到QQ }); }, 2000); //说明:根组件初始化完成,子组件的异步请求数据可能还未返回,所以在2秒后注册分享。 } }); } //自动获取分享的缩略图 private getDefaultShareImgUrl() { let shareImg = document.getElementById('shareImg'); if (shareImg) { return shareImg.getAttribute('src'); } let imgList = document.querySelectorAll('img'); for (let i = 0; imgList[i]; i++) { var imgSrc = imgList[i].getAttribute('src'); if (imgSrc.startsWith('http://') || imgSrc.startsWith('https://')) { return imgSrc } } }
至此,只在一处配置,能够灵活配置的分享完成了。
完成:最终的分享是这样:
{"errMsg":"config:invalid signature"}
形成这个状况的可能性比较多。不过主要有如下三个缘由:
wx.config
中nonceStr
和timestamp
的字母大小写是否正确【常见错误】config
中的 appid
与用来获取 jsapi_ticket
的 appid
一致