微信公众平台一直都是invalid signature

simechiang
  • 23

最近在研究微信公众平台开发,在配置的时候遇到问题了(按照官方文档上操作的),一直都是提示:error: invalid signature

回复
阅读 32.6k
14 个回答

最近刚使用了微信的 JS SDK,对这块的注意事情大概说下,希望能帮到大家:

signature 的值是用多个参数 sha1 加密的结果,详细流程即:

1, 通过 appid + appsecert 获取公众号的 access_token(不是用户的 access_token)
2, 根据 1 的access_token 来获取 jsapi_ticket
3, 生成一个随机字符串 nonceStr(16)位
4, 生成一当前时间缀 timestamp
5, 获取当前网页 URL(#号后不要)

获取到以上 5 步之后,将 jsapi_ticket,nonceStr, timestamp,URL 组成 Query String(GET 参数),即:

$queryString = "jsapi_ticket=XXX&noncestr=XXX&timestamp=XXX&url=XXX";

生成 Query String 要注意:
1,Query String 的顺序不能变(按我给的示例)
2,Query String 中的 key 要全小写
3,Query String 中的 value 区分大小写
4,URL 要确保只获取 # 号之前部分(有 # 号的话)
5,Query String 要确保没有被 urlencode(如果使用 http_build_query 的话需要 urldecode 一次)

signature 的值就是 sha1 加密后的结果,即:

$signature = sha1($queryString);

详见微信官方文档 - JS-SDK使用权限签名算法:
http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#....

6-30日更新:

参考:https://github.com/thenbsp/Wechat

APPIDAccessToken你有给接口了吗?

1,确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
jsapi_ticket=m7RQzjA_ljjEkt-JCoklRFn4ng0t78GNnd2EBFnDN7CYV-VmU0O_lSlt6vKlfGP41XVD3esEcc_ek6xhKXkwZQ&noncestr=e94671a4-adca-44b9-8551-d4657accdbf0&timestamp=1423967660&url=http://gk.suyi.org/i?t=kHQm;signature:23953b957cb820d4a457c04ec7942f06248d3a94

检查下来的程序生成的签名是正确的

2,确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
图片描述

以上是js里面的,满足驼峰命名规则

3,确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。

URL是本地获取的,因此是完整的(参考上图的js)

4,确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
因为在服务端硬编码了appid,所以全局的appid都是一样的

5,确保一定缓存access_token和jsapi_ticket。
access_token 和jsapi_ticket在工具类里面都是静态变量
图片描述
因此是有全局缓存的
5,确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
参见第三点的备注,url是动态获取的

结论:微信的JSSDK在生成签名的时候,要么是由于过度复杂致使其中任何一个环节有延迟或者别的原因而出现认证失败,要么就是有bug。

检查代码 如果存在 缓存 了 jsapi_ticket 和 access_token 的文件,在 测试号转向 正式 公众号的 时候 务必保证这两个缓存文件重新生成。

从百度搜这个问题,就进来了。 你们特么就会copy官方文档,有钱赚吗? 没看见lz已经去 接口签名校验工具 验证过了吗? 官方demo有问题,至少php的有问题, 动态取url的时候自动给加了80端口。 比如一般我们访问 www.sss.com/dir/1.php 他会在getSignPackage() 里"$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" 变成 www.sss.com:80/dir/1.php ,所以就一直报invalid signature 。 这是我遇到的问题,上来搜,没找到答案,又自己解决了。 我说的不一定跟lz遇到的问题一样,但比你们这些瞎瘠薄拷贝耽误老子时间的强。

cnhans
  • -4
新手上路,请多包涵

生成一当前时间缀 timestamp

你确定这个时间戳是到秒级别吗,一般是这个错了。

我也出了这个问题了,签名和官方测试接口一模一样,后来发现是打开的页面URL和分享的不一样的问题,但是改成一样的还是不可以。这时候看了share112的回复,把这两个文件删掉,从新打开页面,就解决了!!

ringingclock
  • 2
新手上路,请多包涵

都是没有找到要点的回答,你们亲测过吗,我是这样解决的,取消验证ssl。在官方例子的:httpGet这个函数中,将下面两行代码中的true改为false解决问题:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

三丰张
  • 2
新手上路,请多包涵

首先可以确定的是你的签名算法有问题,很有可能是前端url与参与生成签名的url不一致。具体可以看我的解决总结
http://www.jianshu.com/p/341e...

微信签名不正确,一般原因是,传给服务器端的url和分享的link不一致导致。所以务必保证一致。
eg: 分享的信息

 wx.onMenuShareTimeline({
            title: '上南瓜租房,找品牌公寓',
            link: window.location.href.split('#')[0],
            imgUrl: 'https://pic.kuaizhan.com/g3/42/d4/5a65-2d67-4947-97fd-9844135d1fb764/imageView/v1/thumbnail/200x200',
            desc: '南瓜租房,只租真房源!',
}); //分享到朋友圈

和调用接口以获取签名信息,传递的url参数

    Service.get('https://wx-open-api.focus.cn/ajax/wxJsConfig', {
        url: encodeURIComponent(window.location.href.split('#')[0]),
        sceneType: 6,
    })

两个url要保持一致。注意给接口传递url参数时,要对url编码,要不然接收的参数会由于特殊字符(eg: &)给中断
项目展示(spa,路由h5 history):https://m.focus.cn/bj/nangua/...

名残雪
  • 1
新手上路,请多包涵
你知道吗?

宣传栏