收藏
回答

公众号 微信配置时,提示签名错误?

我作了以下配置:

1:JS接口安全域名

2:白名单

3:在网站根目前放入验证文件

通过调试工具,可以看到从后台正确取到了返回的数据(数据见下面)

并且通过在线的调试工具,得到的签名也是一样的,但是一直报签名错误

这个问题困扰了我大半个月了,一直没有解决。求大佬指教。

  1. appId"wx3030b9536ac07236"
  2. jsapi_ticket"O3SMpm8bG7kJnF36aXbe89RmCkIdEstJ69OVE3SGrga-j8Ntqv6kyg5sj2DWtcxUtCXOCSBJY-JTrBeaubEJIA"
  3. nonceStr"VF46MfhrLT"
  4. ignature"5b176e77ef12342598e363f1a5f49e047dcbadb5"




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

2 个回答

  • 啊湃
    啊湃
    2021-07-29

    


     $sarr = array();
            $sarr['noncestr'] = substr(str_shuffle($this->s), 0,10);
            $sarr['jsapi_ticket'] = $this->getticket($this->appid,$this->scret);
            $sarr['timestamp'] = ''.time().'';
            //$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
            $protocol = "https://";//由负载均衡负责HTTPS以上判断有误
            //    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
            $url =$this->request->param('url','','string');
    //        $url = encodeURIComponent($url); // 这里务必编码
    //        $sarr['url'] = encodeURIComponent(trim($url));
            ksort($sarr);
            reset($sarr);
    
            $pin = '';
            foreach($sarr as $k=>$v){
                $pin .= $k.'='.$v.'&';
            }
            $pin = substr($pin, 0,-1);
            $sign = sha1($pin);
    
            $return['appId'] = $this->appid;
            $return['timestamp'] = (string)$sarr['timestamp'];
            $return['nonceStr'] = $sarr['noncestr'];
            $return['signature'] = $sign;
       $accsss = $this->getaccess($appid,$scret);
            if(!$accsss)return false;
            $is_exists = $this->getMysql()->name('WechatInfo')->where(array('name'=>'unih5ticket'))->find();
            $sign = 'add';
            if($is_exists){
                if($is_exists['ex_time'] > time()){
                    return $is_exists['cont'];
                }
                $sign = 'save';
            }
    
            $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$accsss.'&type=jsapi';
            $get = curlGet($url);
            $ginfo = json_decode($get,true);
    //        dump($ginfo);
            if($ginfo['errcode'] == 0 && $ginfo['errmsg'] == 'ok'){
                $s_arr = array();
                $s_arr['cont'] = $ginfo['ticket'];
                $s_arr['create_time'] = time();
                $s_arr['ex_time'] = time()+7000;
                if($sign == 'save'){
                    $this->getMysql()->name('WechatInfo')->where(array('name'=>'unih5ticket'))->update($s_arr);
                }else{
                    $s_arr['name'] = 'unih5ticket';
                    $this->getMysql()->name('WechatInfo')->insert($s_arr);
                }
                return $ginfo['ticket'];
            }else{
                return false;
            }
    

    大佬 ,除了前端页面,加入encodeURIComponent 编码,其它你说的,我这边都有处理。而且我刚对前端页面加上了 encodeURIComponent,也还是报签名错误

    2021-07-29
    有用
    回复
  • 凌米
    凌米
    2021-07-29
    1. 确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
    2. 确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
    3. 确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。
    4. 确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
    5. 确保一定缓存access_token和jsapi_ticket。
    6. 确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。


    2021-07-29
    有用
    回复
登录 后发表内容
问题标签