前端的工作
步骤一:绑定域名
先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。步骤二:引入JS文件
http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。步骤三:通过config接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用)
timestamp,nonceStr,signature这三个值必须后端返回来
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: '', // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
- 步骤四:通过ready接口处理成功验证
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
- 步骤五:通过error接口处理失败验证
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
后端的工作
获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):此处需要用到
appId和appsecret
。用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
生成JS-SDK权限验证的签名:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分)
返回给前端timestamp,nonceStr,signature,前端需要传appId,url给后端
出于安全考虑,开发者必须在服务器端实现签名的逻辑。
最后的样子
const appId = 'xxx';
const url = window.location.href.split('#')[0];
getWxJssdkSignReq({ appId, url})
.then((res) => {
const config = res.result
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,公众号的唯一标识
timestamp: config.timestamp, // 必填,生成签名的时间戳
nonceStr: config.nonceStr, // 必填,生成签名的随机串
signature: config.signature, // 必填,签名,见附录1
jsApiList: [
'updateAppMessageShareData', 'updateTimelineShareData'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
})
wx.ready(() => {
const shareConfig = shareInfo; // 自己定义的分享信息
const title = shareConfig.title || '';
const imgUrl = shareConfig.pic || '';
const desc = shareConfig.content || '';
const link = window.location.href;
// 分享朋友
wx.updateAppMessageShareData({
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
console.log('分享朋友 success')
}
});
// 分享朋友圈
wx.updateTimelineShareData({
title: title,
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
console.log('分享朋友圈 success')
}
});
})
wx.error((err) => {
console.log('----wx error----: ', err)
})
})
.catch(err => {
console.log('----wxconfig catch err----: ', err)
})
遇到的困难
-
config:require subscribe:由于测试环境用的测试公众号,所以需要先关注公众号才行。
- config:invalid signature:签名失败,这个是很磨人而且经常遇到的问题
解决流程:
- 确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
- 确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括
'http(s)://'
部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。确保后端解析到用来签名的url和前端发送的一致
(此处很坑),如果是get方法请求的,根据需要进行encodeURIComponent(location.href.split('#')[0])
处理,后端需要decode(因为url中有&时会被浏览器截断导致签名不正确,如果是post请求也要注意后端是否把&转义成&了)。 - 确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
- 检查当前appId对应的“公众号设置”的“功能设置”里是否填写“JS接口安全域名”。
-
确保一定缓存access_token和jsapi_ticket。
官方的解决方案:
- 分享出去的图片没显示
项目中设置为封面的本地图片较小,在打包过程中被打包成了base64字符串,因此分享参数中拿到的也是base64字符串。所以在配置成imgUrl时,在PC端可以正常显示,但是在手机端显示的就有问题。最后让UI切了超过项目打包文件限制的图片资源作为封面,解决了这个问题。