收藏
回答

调用wx.config方法后报"config:invalid signature"错误?

按当前构思的流程,我们在服务器上部署了一个PHP文件,前端访问这个文件的时候把URL带过去,PHP获取授权后返回给前端


当前PHP返回给前端的数据都是有的,但是会报错:errMsg: "config:fail,invalid signature"


PHP后端文件代码:

<?php
    $url = $_GET['url'];
    class JSSDK {
        private $appId;
        private $appSecret;
        private $url;
        public function __construct($appId, $appSecret,$url) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
        $this->url = $url;
     }
     public function getSignPackage() {
         $jsapiTicket = $this->getJsApiTicket();
         $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
         // $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
         $url =$this->url;
         $timestamp = time();
         $nonceStr = $this->createNonceStr();
         // 这里参数的顺序要按照 key 值 ASCII 码升序排序
         $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&tamp=$timestamp&url=$url";
         $signature = sha1($string);
         $signPackage = array(
          "appId"  => $this->appId,
          "nonceStr" => $nonceStr,
          "timestamp" => $timestamp,
          "url"  => $url,
          "signature" => $signature,
          "rawString" => $string,
          "jsapiTicket" => $jsapiTicket
         );
         return $signPackage;
     }
     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 getJsApiTicket() {
     // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
         $data = json_decode(file_get_contents("jsapi_ticket.json"));
         if ($data->expire_time < time()) {
              $accessToken = $this->getAccessToken();
              // 如果是企业号用以下 URL 获取 ticket
              $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
              // $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
              $res = json_decode($this->httpGet($url));
              $ticket = $res->ticket;
              if ($ticket) {
                  $data->expire_time = time() + 7000;
                  $data->jsapi_ticket = $ticket;
                  $fp = fopen("jsapi_ticket.json", "w");
                  fwrite($fp, json_encode($data));
                  fclose($fp);
              }
         } else {
          $ticket = $data->jsapi_ticket;
         }
         return $ticket;
     }
     private function getAccessToken() {
     // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
         $data = json_decode(file_get_contents("access_token.json"));
         if ($data->expire_time < time()) {
              // 如果是企业号用以下URL获取access_token
              // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
                  $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
                  $res = json_decode($this->httpGet($url));
                  $access_token = $res->access_token;
                  if ($access_token) {
                      $data->expire_time = time() + 7000;
                      $data->access_token = $access_token;
                      $fp = fopen("access_token.json", "w");
                      fwrite($fp, json_encode($data));
                      fclose($fp);
                  }
             } else {
                 $access_token = $data->access_token;
             }
             return $access_token;
         }
         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;
         }
    }
    $jssdk = new JSSDK("xxx", "xxx",$url);
    $signPackage = $jssdk->GetSignPackage();
    $tmp=json_encode(array ('appId'=>$signPackage["appId"],'timestamp'=>$signPackage["timestamp"],'nonceStr'=>$signPackage["nonceStr"],'signature'=>$signPackage["signature"],'url'=>$signPackage["url"],'jsapiTicket'=>$signPackage["jsapiTicket"]));
    $callback = $_GET['callback'];
    echo $callback.'('.$tmp.')';
    exit;
?> 

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

1 个回答

  • 养乐多💍
    养乐多💍
    2023-02-10

    好好看看您写的这个,确定没问题?

    2023-02-10
    有用 2
    回复 3
    • 。
      2023-02-10
      人傻了,谢谢大哥,忙的头都晕了
      2023-02-10
      回复
    • 。
      2023-02-10
      已经可以了
      2023-02-10
      回复
    • 养乐多💍
      养乐多💍
      2023-02-10回复
      哈哈
      2023-02-10
      回复
登录 后发表内容