首先贴上必要信息:
开发者ID(AppID):wx3806a4c78e7bf173
原始ID:gh_2314fcde77a4
以上是公众号本身的配置
接下来放一下,我这边的config代码
const modeList = [ 'updateAppMessageShareData' , 'updateTimelineShareData' , 'onMenuShareAppMessage' , 'onMenuShareTimeline' , ]; const initConfig = async (res) => { const options = { debug: !isProd, appId: res.appId, // 必填,公众号的唯一标识 timestamp: res.timestamp, // 必填,生成签名的时间戳 nonceStr: res.nonceStr, // 必填,生成签名的随机串 signature: res.signature, // 必填,签名,见附录1 jsApiList: modeList, } console.log( 'config options::----------------------------' , options); wx.config(options); // ready wx.ready(() => { console.log( 'config success::----------------------------' ); // 分享到朋友圈 wx.updateTimelineShareData({ title: '' , // 分享标题 link: '' , // 分享链接 imgUrl: '' , // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 }, }); // 分享给朋友 wx.updateAppMessageShareData({ title: '' , // 分享标题 link: '' , // 分享链接 imgUrl: '' , // 分享图标 desc: '' , // 分享描述 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 }, }); }) // error wx.error((res) => { console.log( 'catch config error :: =============== ::' , res); }) } |
以上代码执行之后出现如下问题
{ errMsg: "config:fail,Error: 系统错误,错误码:63002,invalid signature [20190919 17:06:41][]" jsApiList: [] } |
差了错误代码之后,发现是非法签名,好了,我先去了https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign这个校验网站校验了,signature 没有问题两边一致,但是config一直提示非法。
然后我去了https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html这边看常见解决办法。试了个遍。然而并没有效果,另外,恕我直言这个文档真实辣鸡。可能你们的核心已经是小程序了,但是小程序的BUG也一堆没修。
然后吐槽一下,这个错误码的返回,之前有返回过config:fail,Error: 系统错误,错误码:63002,invalid signature [20190919 17:06:41][undefind] 这样的格式,还不容易变成 config:fail,Error: 系统错误,错误码:63002,invalid signature [20190919 17:06:41][] 这样我也不知道啥问题,就这几个参数,咱写写明白行不,URL错就提示URL错,就一个签名错误???wtf,这里太笼统了!
好了说到URL错,好网上说99%的错误都是URL导致的,好的尝试了各种办法,并没有什么用,已经调试了不知道几天了,最后只能哀求官方帮我解决一下,帮我看看问题到底在哪里,头发都要秃了。
我用的是SPA (vue) HASH模式(https://xxx.com/#/)取得地址为 https://xxx.com/
单凡我有一点办法都不会来这请教
综上,请赐教!求快速反馈!
顺便吐槽,标题为什么一定要问号,我就是个陈述句,阐述问题而已!
你凶啥子凶嘛,这么多程序员读着屎一样的破文档,重来没有说不开发了,还是得一段乱试,都是过来人,习惯就好了嘛。嗯,屎一样的破文档
留给后人的评论:若出现
错误,要么是生成signature的算法有问题,要么是用来生成的参数有问题。
用微信 JS 接口签名校验工具https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign核对一下。如果核对结果一致,代表你用这些参数拼接并sha1签名的过程没有错,问题就出现在这些参数身上。
noncestr,timestamp一般没啥问题。其他参数可能的问题:
'http(s)://'
部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。)楼主 我现在也是 生成的签名和微信工具生成的签名一样 就还是invalid signature,有时间回答一下吗
首先确定问题,如果是前后端分离,前端的小伙伴一般只有那个URL是动态的参数,其他90%都是后端的问题!!!这一点要明确!
//其次前端的URL基本是这两种,后端不用再做转译,保持前后端一致就行,都试试 // shareUrl: encodeURIComponent(window.location.href.split('#')[0]), //shareUrl: window.location.href.split('#')[0],
还有一点非常重要,后端一般来说不要混淆appId和secret,不要觉得没有错,除非你们公司只有一个公众号或者小程序或者APP(前往不要混淆)
还有就是后端生成签名算法是不是接口调错了
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"%(access_token)
注意type值
再者就是ip是不是在白名单了什么的这些评论区有很多人都说了剩下的就好排查了!
确认一下微信公众号的appId是否对应
jsapi_ticket是否过期
url传的是否有问题,先urlencode一下再给后端
const timestamp = parseInt(
new
Date().getTime()/1000)
const nonceStr = uuid.v1().replace(/-/g,
''
)
const sha1 = jsapiTicket => {
const url = params.url
const md5sum = crypto.SHA1(`jsapi_ticket=${jsapiTicket}&noncestr=${nonceStr}×tamp=${timestamp}&url=${url}`)
return
md5sum.toString()
}
sha1(jsapiTicket)
有时候...
生成签名传过去的 URL 末尾加个「/」就解决了...日内瓦,退钱
http://example.com/ http://m.example.com/a/b/c/
如果签名算法验证过没有问题,url也是一致的,appid也是正确的,那么看看你获取jsapi_ticket的链接中的type是不是jsapi,可能多数人都是这个问题。
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"%(access_token)
已解决 我这里的问题是生成签名要当前页面完整的url,开始只传了host。。。。
我的原因是服务器时间调到过去的时间了,你可以确认一下
分享一下我的解决方法,PHP写的.URL需要的是发起调用的页面URL,我错误的使用了wxconfig.php的URL.导致一直报签名错误.改为获取请求页面的URL就解决了.
function getCurrentUrl() { //$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; // return $protocol . $_SERVER['HTTP_HOST'] . strtok($_SERVER['REQUEST_URI'], '#'); // 忽略 URL 中的 `#` 部分 return $_SERVER['HTTP_REFERER']; }