收藏
回答

微信公众号开发调用jssdk,配置时总是 invalid signature ,提示非法签名?

首先贴上必要信息:

开发者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/

单凡我有一点办法都不会来这请教

综上,请赐教!求快速反馈!

顺便吐槽,标题为什么一定要问号,我就是个陈述句,阐述问题而已!

回答关注问题邀请回答
收藏

27 个回答

  • 梦想家haima
    梦想家haima
    2020-01-01

    你凶啥子凶嘛,这么多程序员读着屎一样的破文档,重来没有说不开发了,还是得一段乱试,都是过来人,习惯就好了嘛。嗯,屎一样的破文档

    2020-01-01
    有用 8
    回复 1
    • Iuhuy
      Iuhuy
      2020-06-22
      你凶啥子个嘛
      2020-06-22
      回复
  • 浅羊
    浅羊
    2021-07-02

    留给后人的评论:若出现

    invalid signature
    

    错误,要么是生成signature的算法有问题,要么是用来生成的参数有问题。

    用微信 JS 接口签名校验工具https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign核对一下。如果核对结果一致,代表你用这些参数拼接并sha1签名的过程没有错,问题就出现在这些参数身上。

    noncestr,timestamp一般没啥问题。其他参数可能的问题:

    1. url有没有正确处理。url为当前网页的URL,不包含#及其后面部分。(确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。)
    2. jsapi_ticket获取错误。可能因为获取ticket的access_token有问题。比如获取token的算法有误,用来获取的AppId或AppSecret错了(比如配置了多个公众号,写错了等等)
    2021-07-02
    有用 4
    回复 3
    • 江南
      江南
      2021-08-09
      我报错的原因:我传成了分享指定的URL了。应当是:当前网页的URL,不包含#及其后面部分。
      2021-08-09
      回复
    • 壹个头两个大คิดถึง
      壹个头两个大คิดถึง
      2023-07-28
      检索了那么多,就你这个回复最靠谱。因为你的这个回复让我24小时内完成了排查,我的原因属于你回复里的第1条,是http和https头的原因,只是没想到的是官方验签校验工具这两个头出来的值也是一样的,郁闷。
      2023-07-28
      回复
    • 格机格机
      格机格机
      07-11
      谢谢谢谢谢!终于找到问题了,history模式需要传完整的路径,包括url的参数
      07-11
      回复
  • 馠金
    馠金
    2020-02-16

    楼主 我现在也是 生成的签名和微信工具生成的签名一样 就还是invalid signature,有时间回答一下吗

    2020-02-16
    有用 3
    回复
  • 愿世界回归自然
    愿世界回归自然
    2021-12-15

    首先确定问题,如果是前后端分离,前端的小伙伴一般只有那个URL是动态的参数,其他90%都是后端的问题!!!这一点要明确!

    //其次前端的URL基本是这两种,后端不用再做转译,保持前后端一致就行,都试试
    // shareUrl: encodeURIComponent(window.location.href.split('#')[0]),
    //shareUrl: window.location.href.split('#')[0],
    

    还有一点非常重要,后端一般来说不要混淆appIdsecret,不要觉得没有错,除非你们公司只有一个公众号或者小程序或者APP(前往不要混淆)

    还有就是后端生成签名算法是不是接口调错了

    "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"%(access_token)

    注意type值

    再者就是ip是不是在白名单了什么的这些评论区有很多人都说了剩下的就好排查了!


    2021-12-15
    有用 2
    回复 4
    • Jay
      Jay
      2023-03-16
      大神,我谢谢你,你一句注意type值,把我从8个小时的噩梦里拽了出来 555555555555555
      2023-03-16
      1
      回复
    • 翼翼
      翼翼
      2023-03-25
      同楼上,大神,我谢谢你,72小时噩梦,搞遍了网上所有前端方法,过于信赖微信提供的官方工具,过于信赖后端,最后毁在一个小小type值上
      2023-03-25
      回复
    • qp
      qp
      2023-08-11
      使用encodeURIComponent终于可以了
      2023-08-11
      回复
    • 张文阁
      张文阁
      2023-11-27
      我擦,终于解决了,一个小小的type,困扰了好久,谢谢大神了
      2023-11-27
      回复
  • Crowley
    Crowley
    2019-09-19
    1. 确认一下微信公众号的appId是否对应

    2. jsapi_ticket是否过期

    3. url传的是否有问题,先urlencode一下再给后端

    2019-09-19
    有用 2
    回复 16
    • \^gjy$\
      \^gjy$\
      2019-09-19
      appId对应;jsapi_ticket定时刷新;url不管是encode的还是没encode的都试过了,常规方法我都试过,我需要一些有突破性的建议
      2019-09-19
      1
      回复
    • Crowley
      Crowley
      2019-09-19回复\^gjy$\
      前端一般保证url没有问题就不会有问题,贴一下后端生成签名的代码
      2019-09-19
      回复
    • \^gjy$\
      \^gjy$\
      2019-09-19
      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}&timestamp=${timestamp}&url=${url}`)
            return md5sum.toString()
      }
      sha1(jsapiTicket)


      2019-09-19
      回复
    • Crowley
      Crowley
      2019-09-19回复\^gjy$\
      前端传encode的过去,后端decode一下,推荐顺序不要写死,微信验签都这一套写个公用方法好一点,再有就是把jsapiTicket的appid一起传过去吧,尽量不要前端写死
      2019-09-19
      回复
    • Crowley
      Crowley
      2019-09-19
      测试的时候你每次都把相关的所有变量都返回给前端,看一下有没有不对应的
      2019-09-19
      回复
    查看更多(11)
  • Max Sky™
    Max Sky™
    2021-08-03

    有时候...

    生成签名传过去的 URL 末尾加个「/」就解决了...日内瓦,退钱

    http://example.com/
    http://m.example.com/a/b/c/
    


    2021-08-03
    有用 1
    回复 1
    • 烈日融雪
      烈日融雪
      2022-08-17
      这个对大部分人来说其实是正解
      2022-08-17
      回复
  • 孙志钢¹¹
    孙志钢¹¹
    2021-06-21

    如果签名算法验证过没有问题,url也是一致的,appid也是正确的,那么看看你获取jsapi_ticket的链接中的type是不是jsapi,可能多数人都是这个问题。

    "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"%(access_token)

    2021-06-21
    有用 1
    回复 1
    • 孝^_^
      孝^_^
      2022-10-17
      jsapi_ticket的链接中的type是jsapi,依旧签名失败
      2022-10-17
      回复
  • 故
    2020-12-26

    已解决 我这里的问题是生成签名要当前页面完整的url,开始只传了host。。。。

    2020-12-26
    有用 1
    回复 1
    • 散人
      散人
      2022-02-09
      谢谢老哥,受你启发
      2022-02-09
      回复
  • Jacob
    Jacob
    2020-01-14

    我的原因是服务器时间调到过去的时间了,你可以确认一下

    2020-01-14
    有用 1
    回复 3
    • Immortal
      Immortal
      2020-05-06
      调到过去是啥意思?
      2020-05-06
      回复
    • .
      .
      2021-04-28
      老哥,我服务器时间也调过,因为要测试活动时间,后来再调回去还是不行,请问下你是怎么好的
      2021-04-28
      回复
    • .
      .
      2021-04-28
      改好了,谢谢老哥,启发很大
      2021-04-28
      回复
  • 田輝 🔅
    田輝 🔅
    12-16

    分享一下我的解决方法,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'];
          }
    
    12-16
    有用
    回复

正在加载...

登录 后发表内容
问题标签