刚入门前端的时候写过很多的微信H5页面,时隔多年感觉应该是手到擒来,不曾想竟很是费了一些功夫。现在把本次开发过程中遇到的问题以及如何解决的,做个记录。希望对前端小伙伴有所帮助。
一、微信分享文档及配置(基础)
1、微信分享官网文档
重要说明:分享接口:
请注意,不要有诱导分享等违规行为,对于诱导分享行为将永久回收公众号接口权限,详细规则请查看:朋友圈管理常见问题。
请注意,原有的 wx.onMenuShareTimeline(分享到朋友圈)、wx.onMenuShareAppMessage(分享给朋友)、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即将废弃。请尽快迁移使用客户端6.7.2及JSSDK 1.4.0以上版本支持的 wx.updateAppMessageShareData(分享到朋友)、wx.updateTimelineShareData(分享到朋友圈)接口。
微信官网文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html。
2、appid对应的公众号是否有分享接口权限
接口状态为已获得,表示有权限。如下图 (重要)。
3、设置白名单和绑定域名
(1)分享的服务器外网ip地址,需要添加到白名单中,如下图:
(2)绑定域名先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。
二、JSSDK使用步骤(进阶)
正常流程 按照 官方文档的步骤。
1、绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。
2、引入 JS 文件
在需要调用 JS 接口的页面引入如下 JS 文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载。
3、通过 config 接口注入权限验证配置
所有需要使用 JS-SDK 的页面必须先注入配置信息,否则将无法调用(同一个 url 仅需调用一次,对于变化 url 的SPA的web app可在每次 url 变化时进行调用,目前 Android 微信客户端不支持 pushState 的H5新特性,所以使用 pushState 来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
wx.config({
debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的 JS 接口列表
});
4、通过 ready 接口处理成功验证
wx.ready(function(){
// config信息验证后会执行 ready 方法,所有接口调用都必须在 config 接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在 ready 函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在 ready 函数中。
});
三、Vue分享好友和朋友圈(实践)
项目场景:一个h5界面要求点击右上角三个点后点击微信好友分享带标题和图片给好友。vue项目中,分享携带头部标题、简介和缩略图等信息。
操作流程
1、下载微信的 weixin-js-sdk
npm install weixin-js-sdk --save
2、在需要分享的页面引入
import wx from 'weixin-js-sdk'; // 引入wxjs
import { shares } from '@/api/index'; // 分享的接口 传给后端一个地址(与域名一致)
3、在methods写调用的方法
// vue调用微信的自定义分享
getShareInfo() {
this.save = {
url: location.href.split('#')[0] // 只需要传当前页面地址
};
shares(this.save).then(res => {
const config = res.data;
wx.config({
appId: config.appId, // appID 公众号的唯一标识
timestamp: config.timestamp, // 生成签名的时间戳
nonceStr: config.nonceStr, // 生成签名的随机串
signature: config.signature, // 生成的签名
jsApiList: [
'updateAppMessageShareData', // 分享到朋友
'updateTimelineShareData', // 分享到朋友圈
]
});
wx.ready(() => {
var shareData = {
title: '王者归来-王者突破特训营',
desc: '帮助青铜早日登上王者之路',
link: https://www.baidu.com/, // 分享后的地址
imgUrl:
'分享出去的图片地址'
};
//点击要去分享
wx.updateAppMessageShareData(shareData);
wx.updateTimelineShareData(shareData);
});
});
}
4、在 mounted 中调用分享的方法
mounted() {
this.getShareInfo(); // 调用分享的事件
},
5、判断微信浏览器打开
分享的时候要去判断是否是微信浏览器打开,如果不是要提示不能分享。
var broser = window.navigator.userAgent.toLowerCase();
//通过正则表达式匹配broser 中是否含有MicroMessenger字符串
if (broser.match(/MicroMessenger/i) == 'micromessenger') {
console.log('微信浏览器');
// this.weixin();
this.showContent = true;
} else {
this.$toast.warn('请使用微信浏览器打开');
}
重要说明:注意h5分享是使用微信浏览器右上角的三个点进行分享的,在点击右上角之前要先注入config/ready,官网已说明。自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)*需在用户可能点击分享按钮前就先调用。
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
wx.updateAppMessageShareData({
title: '', // 分享标题
desc: '', // 分享描述
link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
imgUrl: '', // 分享图标
success: function () {
// 设置成功
}
})
});
扩展知识点:
//使用后端拿到的数据配置wxconfig
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: res.appId, // 必填,公众号的唯一标识,填自己的!
timestamp: res.timestamp, // 必填,生成签名的时间戳,刚才接口拿到的数据
nonceStr: res.nonceStr, // 必填,生成签名的随机串
signature: res.signature, // 必填,签名,见附录1
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage'
]
});
wx.ready(function () { //如果wx.config配置正常,会自动走此处
console.log('ready执行完毕')
//自定义“分享给朋友”及“分享到QQ”按钮的分享内容
wx.updateAppMessageShareData({
title: option.shareTitle,//分享的标题
desc: option.shareDesc,//分享的描述信息
link: option.shareUrl,//分享的url
imgUrl: option.shareImg//分享的图片
});
//自定义“分享到朋友圈”及“分享到QQ空间”按钮的分
wx.updateTimelineShareData({
title: option.shareTitle,
desc: option.shareDesc,
link: option.shareUrl,
imgUrl: option.shareImg,
});
});
四、要点和踩坑日志(深度与广度)
1、H5 微信分享,点击分享的时候无法调起微信分享?(自己写的分享按钮)
解决方案:H5不能调起微信分享,H5 需要引导用户点击右上角进行分享。
2、测试号需要关注,才可以调用js接口?
解决方案:设置JS接口安全域后,通过关注该测试号,开发者即可在该域名下调用微信开放的JS接口,请阅读微信JSSDK开发文档。
3、wx.config初始化失败
情况有很多种,主要如下:
(1)Java后台前面的url与分享的url不一致,需要完全一致。例如后台是http,分享地址是https。
(2)参数不对。
4、分享接口没有权限
这错误有2种情况,1是参数不对;2是公众号中分享接口的状态为未获得。
5、短链接造成系统不能正常使用微信分享
分析原因:因为在初始化的时候是进来的时候是短链接,是通过script在开头引入的,所以微信sdk已经监控到了,但是我们 wxsdk 配置里面的 link 是我们要分享的长链接,微信会认为这是无效配置,所以微信分享不生效。
6、微信分享链接出现config:invalid signature错误的解决方法
分享时提示错误“{"errMsg":"config:invalid signature"}”一般出现这个错误多半是签名获取失败,而造成签名获取失败的原因各种各种,子钦在开发的时候也遇到过这种情况,搜索了不少网上教程,解决了自己的问题。invalid signature签名错误。建议按如下顺序检查:
- 确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
- 确认 config 中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应 noncestr , timestamp一致。
- 确认 url 是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的 GET 参数部分,但不包括'#'hash后面的部分。
- 确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
- 确保一定缓存access_token和jsapi_ticket。
- 确保你获取用来签名的 url 是动态获取的,动态页面可参见实例代码中 php 的实现方式。如果是 html 的静态页面在前端通过 ajax 将url传到后台签名,前端需要用 js 获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
相关技术点:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html。
查找:附录5-常见错误及解决方法。