公众号,小程序里面使用H5页面基本都会有分享H5的功能,这时候使用JS-SDK签名
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
html:
axios.get('https://gzh.jskoa.com/getjsapi_ticket?url='+window.location.href).then((res)=>{ //**注意这里的url不能带有#的hash,具体看文档
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: 'wx1d062c6797dd4774', // 必填,公众号的唯一标识
timestamp: res.data.timestamp, // 必填,生成签名的时间戳
nonceStr: res.data.noncestr, // 必填,生成签名的随机串
signature: res.data.signature, // 必填,签名
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'updateTimelineShareData',
'updateAppMessageShareData',
'onMenuShareQQ',
'onMenuShareWeibo',
'hideMenuItems',
'chooseImage',
'updateAppMessageShareData',
'scanQRCode'
] // 必填,需要使用的JS接口列表
});
//分享功能
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
var shareData = {
title: '分享标题', // 分享标题
desc: '分享描述', // 分享描述
link: 'https://gzh.jskoa.com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: 'https://gzh.jskoa.com/images/1.png', // 分享图标
success: function (res) {
// 设置成功
},
error:function(res){
}
};
//自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)
wx.updateAppMessageShareData(shareData);
//自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)
wx.updateTimelineShareData(shareData);
});
// wx.error(function(res){
// alert(JSON.stringify(res))
// console.log(JSON.stringify(res))
// })
})
node.js后台
//signature签名算法
*需要把access_token和ticket存在服务器上,它们2个小时后才过期,不能每次请求一次页面都要重新获取,有次数限制的
var sign = require('./sign.js');
router.get('/getjsapi_ticket', async (ctx, next) => {
let tokenInfo = fs.existsSync('token_info.json')
? JSON.parse(fs.readFileSync('token_info.json', 'utf-8'))
: null
let expires_time = tokenInfo ? tokenInfo.expires_time : ''
let cache_access_token =
tokenInfo && tokenInfo.access_token ? tokenInfo.access_token : ''
let cache_ticketjson = fs.existsSync('ticket.json')
? JSON.parse(fs.readFileSync('ticket.json', 'utf-8'))
: null
if (
parseInt(Date.now() / 1000) > expires_time + 3600 || //设置1个小时就更新
tokenInfo == null ||
cache_access_token == ''
) {
//拿token
var gettoken = await new Promise(function (resolve, reject) {
axios.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}` ).then(function (response2) {
fs.writeFileSync(
'token_info.json',
JSON.stringify({
access_token: response2.data.access_token,
expires_time: parseInt(Date.now() / 1000),
})
)
resolve(response2.data.access_token)
})
.catch(function (error) {
console.log(error);
});
});
//拿ticket
var ticketjson = await new Promise((a,b)=>{
axios.get(`https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${gettoken}&type=jsapi` ).then(function (response2) {
// {
// errcode: 0,
// errmsg: 'ok',
// ticket: 'O3SMpm8bG7kJnF36aXbe8_JQGXJ4DukP3a02ntc7x9lrWoqujnAjetfpaZzA1XGF6G9SVgw8M-W1Cpn7sfA0ZA',
// expires_in: 7200
// }
fs.writeFileSync(
'ticket.json',
JSON.stringify(sign(response2.data.ticket, ctx.request.query.url))
)
a(sign(response2.data.ticket, ctx.request.query.url)) //ticket换取signature签名
})
.catch(function (error) {
console.log(error);
});
})
await new Promise((a,b)=>{
ctx.body = ticketjson //wx.config配置返回给前端
a(1)
})
} else {
ctx.body = sign(cache_ticketjson.jsapi_ticket, ctx.request.query.url) //有缓存就拿缓存数据 wx.config配置返回给前端
}
})
展示一个分享案例:

一定要在微信上操作,或者开发者工具