问答详情
源自:-

signature invalid1求助 弄了好久 不知道出了什么问题 URL也是动态获取的

控制器

<?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"];



             }

}

HTML代码

<!doctype html>

<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-23 22:49

个回答

  • qq_有点感觉_0
    2016-12-28 10:54:18

    要用域名访问你的是本地 ip 吧