发布时间:2026-09-28 19:04:52 浏览次数:3
下面是关于“微信二次分享报错invalidsignature问题及解决方法”的完整攻略:
在微信二次分享(通过分享出去的链接再次点击进行分享)时,有时会出现invalidsignature的问题,导致分享失败。
这个问题的原因是由于微信分享的signature签名生成机制,每个URL只能生成一次,但是如果URL参数发生了改变,那么就需要重新生成签名,否则就会出现invalidsignature的错误。
那么,如何避免或解决这个问题呢?有两种方法可以尝试:
第一种方法是设置URL不变,在分享链接中传参数时不改变URL,这样可以保证signature签名能够正确生成。这个方法比较简单,不需要进行特别的操作,只需要在分享链接的时候保证URL的不变性即可。
第二种方法是动态生成signature,即在每次分享时获取到正确的URL参数后再生成signature签名,这样可以避免由于URL改变导致的signature错误。
下面是利用Node.js实现动态生成signature的一个示例:
const crypto = require('crypto');const request = require('request');const appID = 'your appid';const appSecret = 'your appsecret';// 微信JS-SDK签名生成函数function createNonceStr() { return Math.random().toString(36).substr(2, 15);}function createTimestamp() { return parseInt(new Date().getTime() / 1000) + '';}function raw(args) { let keys = Object.keys(args); keys = keys.sort(); let newArgs = {}; keys.forEach(function(key) { newArgs[key.toLowerCase()] = args[key]; }); let string = ''; for (let k in newArgs) { string += '&' + k + '=' + newArgs[k]; } string = string.substr(1); return string;}function sign(jsapiTicket, url) { let nonceStr = createNonceStr(); let timestamp = createTimestamp(); let ret = { jsapi_ticket: jsapiTicket, nonceStr: nonceStr, timestamp: timestamp, url: url }; let string = raw(ret); let sha1 = crypto.createHash('sha1'); sha1.update(string); ret.signature = sha1.digest('hex'); ret.appId = appID; return ret;}// 获取access_token和jsapi_ticketfunction getTokenAndTicket(cb) { const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appID}&secret=${appSecret}`; request(url, function(err, res, body) { const result = JSON.parse(body); const accessToken = result.access_token; const url = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${accessToken}&type=jsapi`; request(url, function(err, res, body) { const result = JSON.parse(body); const ticket = result.ticket; cb(ticket); }); });}// 生成新的签名参数function generateNewSignature(url, cb) { getTokenAndTicket(function(jsapiTicket) { const newSignature = sign(jsapiTicket, url); cb(newSignature); });}// 生成动态签名const dynamicSignature = (req, res) => { const url = req.body.url; generateNewSignature(url, function(newSignature) { res.send(newSignature); });};通过以上两种方法,我们可以避免或解决微信二次分享出现invalidsignature的问题。同时,我们也可以看出,微信开发中,很多问题都可以通过动态生成signature实现,这对于微信开发者来说是非常有用的技巧。