问答详情
源自:2-3 验证分享接口以及实现选择相册接口

报config:invalid signature

<?php//控制器文件
namespace Home\Controller;
use Think\Controller;

class IndexController extends Controller {
    public function index(){
//获得参数 signature nonce token timestamp echostr
        $nonce     = $_GET['nonce'];
        $token     = 'cdbb';
        $timestamp = $_GET['timestamp'];
        $echostr   = $_GET['echostr'];
        $signature = $_GET['signature'];
        //形成数组,然后按字典序排序
        $array = array();
        $array = array($nonce, $timestamp, $token);
        sort($array);
        //拼接成字符串,sha1加密 ,然后与signature进行校验
        $str = sha1( implode( $array ) );
        if( $str  == $signature && $echostr ){
            //第一次接入weixin api接口的时候

            echo  $echostr;
            exit;
        }else{

        }
    }
//获取jsapi-ticket 全局票据
 public   function getJsApiTicket(){
        //如果session中保存有效的jsapi-ticket 
        if($_SESSION['jsapi-ticket-expire_time']>time() && $_SESSION['jsapi-ticket']){
            $jsapi=$_SESSION['jsapi-ticket'];
            echo "aba";
        }else{
            echo "aaa";
            $access_token= $this->getWxAccessToken();
            var_dump($access_token);
            $url='https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi';
            $re=$this->http_curl($url);
            $jsapi=$re['ticket'];
            $_SESSION['jsapi-ticket']=$jsapi;
            $_SESSION['jsapi-ticket-expire_time']=time()+7000;
        }
        var_dump($access_token);
            return $jsapi;
    }
  /*  public   function a(){
        //如果session中保存有效的jsapi-ticket 
        if($_SESSION['expire_time']>time() && $_SESSION['access_token']){
            $access_token=$_SESSION['access_token'];
        }else{
            

            $appid = 'wxd1157c516b3578d8';
            $appsecret =  '26afef5b19e1ebfc3382604908460aa9';
            $url= "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
            $re=$this->http_curl($url);
            $re = json_decode($re, true);
            $access_token=$re['access_token'];
            var_dump($access_token);
            $_SESSION['access_token']=$access_token;
            $_SESSION['expire_time']=time()+7200;
        }
       
        
            return $access_token;
    }*/
    //获取16位随机码
  public  function getRandCode(){
        $num=16;
        $array=array(
            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
            'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
            '0','1','2','3','4','5','6','7','8','9'
        );
        $tmpstr='';
        $max=count($array);
        for($i=1;$i<=$num;$i++){
            $key = rand(0,$max-1);
            $tmpstr.=$array[$key];
        };
         
         
        return $tmpstr;
    }
    //js-sdk  分享朋友圈
 public    function share(){
        //获取jsapi-ticket 票据
        $jsapi=$this->getJsApiTicket();
        $timestamp=time();
        $nonceStr=$this->getRandCode();
        //$url='http://114.215.134.149/dashboard/project/TP/weixin.php?a=share';
        $protocol = (!empty($_SERVER[HTTPS]) && $_SERVER[HTTPS] !== off || $_SERVER[SERVER_PORT] == 443) ? "https://" : "http://";
          $url = $protocol.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];
          var_dump($url);
        //获取signature
        $signature='jsapi_ticket='.$jsapi.'&noncestr='.$nonceStr.'&timestamp='.$timestamp.'&url='.$url;

        $signature=sha1($signature);
        $this->assign('name','慕课');
        $this->assign('timestamp',$timestamp);
        $this->assign('nonceStr',$nonceStr);
        $this->assign('signature',$signature);
        $this->display();
    }
   public function http_curl($url,$type='get',$res='json',$arr=''){

           //1.初始化curl
           $ch  =curl_init();
           //2.设置curl的参数
           curl_setopt($ch,CURLOPT_URL,$url);
           curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查  

          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
           if($type == 'post'){
               curl_setopt($ch,CURLOPT_POST,1);
               curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
           }
           //3.采集
           $output =curl_exec($ch);
           echo (curl_error($ch));
           //4.关闭
           curl_close($ch);
           if($res=='json'){
               if(curl_error($ch)){
                   //请求失败,返回错误信息

                   return curl_error($ch);
               }else{
                   //请求成功,返回错误信息

                   return json_decode($output,true);
               }
           }
           echo var_dump( $output );
       }
public       function getWxAccessToken(){
               //1.请求url地址
        $appid = 'wxd1157c516b3578d8';
        $appsecret =  '26afef5b19e1ebfc3382604908460aa9';
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
               //2初始化
        $ch = curl_init();
               //3.设置参数
        curl_setopt($ch , CURLOPT_URL, $url);
        curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
                 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查  

                 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
               //4.调用接口 
                 $res = curl_exec($ch);
               //5.关闭curl
                 echo $res ;
                 curl_close( $ch );
                 if( curl_errno($ch) ){
                    var_dump( curl_error($ch) );
                 }
                 $arr = json_decode($res, true);
               var_dump($arr["access_token"]);
                 return $arr["access_token"];


             }
}
<!doctype html>//VIEW文件 
<html>
<head>
    <title>微信js分享接口</title>
    <meta name="viewpoint" content = "initial-scale=1.0;width=device-width"/>
    <meta http-equiv="content" content = "text/html;charset=utf-8"/>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <uses-permission android:name="android.permission.INTERNET"/>
</head>
<body>
   
   <script>

   wx.config({
   
    debug: true,  
        appId: 'wxd1157c516b3578d8', // 必填,公众号的唯一标识
        timestamp:'<{$timestamp}>' , // 必填,生成签名的时间戳
        nonceStr: '<{$nonceStr}>', // 必填,生成签名的随机串
        signature: '<{$signature}>',// 必填,签名,见附录1
        jsApiList: [
        "onMenuShareTimeline",
        "onMenuShareAppMessage"
        ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    });

   wx.ready(function(){
        //分享到朋友圈
        alert(location.href.split('#')[0]);

        wx.onMenuShareTimeline({
           title: 'test1', // 分享标题
      link: 'http://www.baidu.com', // 分享链接
    imgUrl: 'https://www.baidu.com/img/bd_logo1.png', // 分享图标
    success: function () { 
        // 用户确认分享后执行的回调函数
        alert("success");
    },
    cancel: function () { 
        // 用户取消分享后执行的回调函数
        alert("cancle");
    }
});
    //分享给朋友
    wx.onMenuShareAppMessage({
    title: 'test1', // 分享标题
    desc: 'test xjy', // 分享描述
    link: 'http://www.baidu.com', // 分享链接
    imgUrl: 'https://www.baidu.com/img/bd_logo1.png', // 分享图标
    type: 'link', // 分享类型,music、video或link,不填默认为link
    dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
    success: function () { 
        // 用户确认分享后执行的回调函数

    },
    cancel: function () { 
        // 用户取消分享后执行的回调函数
    }
});
});
   wx.error(function(res){
    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    alert("shibai");
});
   </script>
</body>
</html>



提问者:qq_玻璃娃娃_1 2016-10-24 10:06

个回答

  • Echocc
    2016-10-25 13:41:52
    已采纳

    模板输出的问题,

    1. 把TP中的模板标签改为<{}>,这样和老师的一样,通过设置 TMPL_L_DELIM 和 TMPL_R_DELIM 进行更改。在项目配置文件中定义: 'TMPL_L_DELIM'=>'<{',       'TMPL_R_DELIM'=>'}>'

    2. 也可以在html中输出的时候改为这样 {$timestamp},{$noncestr},{$signature}


  • 慕尼黑8125242
    2018-07-23 00:03:09

    我也遇到了同样的问题

  • Wcg1988
    2017-06-09 00:25:06

    前后分离的情况下。android,正常,ios却invalid signature 

    前端是vue, vue-router ,后端是koa.

    这个url打印window.location.href时没有带#的。直接传给koa服务器去算。

    android正常使用jsdk,

    ios报:invalid signature 

    打印出两部机子的请求url都是一模一样,没有# http://xxxx.xxx.cn/kqdd/kq


  • GatsbyJh
    2017-05-02 20:27:31

    config:invalid signature