求教!关于微信分享的JSSDK错误-invalid signature无效签名的问题

签名已经生成了,并且和微信签名测试工具生成的签名一样,扫码访问页面时,还是弹出invalid signature,该怎么解决?!求指点!
图片描述

图片描述

图片描述

图片描述微信生成的

图片描述
自己生成的与微信的一至

阅读 7.8k
7 个回答

不熟悉php ...

确定一下 是不是 url 的问题?

<?php

class JSSDK {

    private $appId;
    private $appSecret;

    public function __construct($appId, $appSecret) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }

    public function getSignPackage() {
        $jsapiTicket = getJsapiTicket();
        
        if($jsapiTicket&&$jsapiTicket<>''){
                // 注意 URL 一定要动态获取,不能 hardcode.
                $protocol = (!empty($_SERVER ['HTTPS']) && $_SERVER ['HTTPS'] !== 'off' || $_SERVER ['SERVER_PORT'] == 443) ? "https://" : "http://";
                $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

                $timestamp = time();
                $nonceStr = $this->createNonceStr();
                // 这里参数的顺序要按照 key 值 ASCII 码升序排序
                $string = "jsapi_ticket={$jsapiTicket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
      
                $signature = sha1($string);
                $signPackage = array(
                        "appId" => $this->appId,
                        "nonceStr" => $nonceStr,
                        "timestamp" => $timestamp,
                        "url" => $url,
                        "signature" => $signature,
                        "rawString" => $string
                    );

                return $signPackage;

        }else{
            return  false;
        }
        
    }

    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i ++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }

}


上面是开源的库,调用方法就算getSignPackage(),执行之后得到nonceStr、signature、timestamp
  $jssdk =new \JSSDK(C('APPID'), C('APPSECRET'));
               $data=$jssdk->getSignPackage();
               $this->assign('nonceStr', $data['nonceStr']);
               $this->assign('signature', $data['signature']);
               $this->assign('appid', C('APPID'));
               $this->assign('timestamp', $data['timestamp']);
我记得公众平台的后台有个jssdk的安全目录要设置的。

确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致

最好的方法是下载微信开发工具 电脑端debug调试所有参数

请问知道怎么解决了吗?我也遇到这种问题了

你的js中调用了四次wxshare函数。
而你的timestamp,nonceStr每次调用都不同的。
所以签名错误。

<?php
$share = wxshare();
?>
wx.config({
    appId:'xxx',
    timestamp:<?=$share[0]?>,
    nonceStr:'<?=$share[1]?>',
    signature:'<?=$share[2]?>',
    jsApiList:[xxx]
});
新手上路,请多包涵

生成签名只是一种算法,如果你的签名结果和微信提供的签名工具返回的结果一样的话,肯定不需要考虑你的签名方法,因为已经是正确的。
再来考虑签名所需的参数,只有url和jsapi_ticket相对于后端和前端来说是不确定的:
1、看url,根据微信官方文档:前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),确认在微信客户端打开的实际链接是不是你php代码里拿到的url,因为微信客户端打开一个链接的时候它会自己在后面加上很多参数
2、看jsapi_ticket,这个仔细看一下生成的代码有没有错误的地方

新手上路,请多包涵

我现在就是这个问题,所有参数都是对的,但是就是报签名错误!为什么?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题