關於前端微信分享jssdk config:invalid signature 簽名錯誤

關於前端微信分享jssdk config:invalid signature 簽名錯誤


這幾天剛剛把微信寫完,說出來你可能不信,我寫個微信分享一起用了2個禮拜。中間各種心酸,一開始後臺老大哥幫我把後臺簽證給寫好了,不過不起作用,想叫他在改,但是後面公司有個項目急着上線,沒有空,產品催的又急,自己沒有辦法,開始自己處理後臺.

好了,話不多說,正文開始

首先微信的的東西看微信SDK文檔是肯定的

因爲我是前端,就只寫關於前端的代碼了,後臺我也涉及了,在文章的最後我會附上我自己改的後臺代碼


$(function() {
//  微信驗證
    var conf = "";
    var urld = window.location.href.split('#')[0];
$.ajax({
        type: "post",
        dataType: 'json',
        url: '接口鏈接',
        data: {
            url: urld
        },

        success: function(conf) {
            console.log(conf);
            configWxAPI(conf);
            var conf = conf.url;
            return conf;


        },
        error: function(event, XMLHttpRequest, ajaxOptions, thrownError) {

        }
    });

    //配置權限
    function configWxAPI(conf) {
        wx.config({
            debug: false, //開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端
            //打開,參數信息會通過log打出,僅在pc端時纔會打印
            appId: "唯一的ID", //必填,公衆號的唯一標識
            timestamp: conf.timestamp, //必填,生成簽名的時間戳
            nonceStr: conf.nonceStr, //必填,生成簽名的隨機串
            signature: conf.signature, //必填,簽名
            jsApiList: [

                'onMenuShareTimeline',
                'onMenuShareAppMessage',
                'onMenuShareQQ',
                'onMenuShareWeibo',
                'previewImage',

            ] //必填,需要使用的JS接口列表,也就是配置你想使用的調用接口
        });
//      微信分享
        wx.ready(function() {
          //分享的圖片
            var imgUrl = ""
                      //分享朋友
            wx.onMenuShareAppMessage({
                title: "標題",
                desc: "內容簡介",
                link: "分享鏈接",
                imgUrl: imgUrl,
                success: function() {
                    //分享成功之後執行的回調函數
                },
                cancel: function() {
                    //取消分享之後執行的回調函數
                }
            });
                             //分享朋友圈
            wx.onMenuShareTimeline({
                title: "標題",
                desc: "內容簡介",
                link: "分享鏈接",
                imgUrl: imgUrl,
                success: function() {
                    //分享成功之後執行的回調函數
                },
                cancel: function() {
                    //取消分享之後執行的回調函數
                }
            });
        });
        wx.error(function(conf) {
            console.log(conf);
            // config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這裏更新簽名。
        });
    };
    });

後臺部分的代碼

public function getSignPackage() {

    if(IS_POST){
        if(!I('post.url')) $this->ajaxReturn(array('status'=>0,'msg'=>'請輸入當前的URL'));
        $jsapiTicket = $this->getJsApiTicket();
          //這句代碼微信SDK上面沒有介紹,但是用來簽證的url裏面就&後面會自動帶有&,所以這裏用了php的字符串替換
        $url =  str_replace("&","&",I('post.url'));

        $timestamp = time();
        $nonceStr = $this->createNonceStr();
      #####個人理解爲,微信的簽證是需要隨機字符串+url+時間+getticket接口獲取的 JSAPI 調用憑證   編碼生成的(不知道對不對)

這裏的時間還有隨機字符串傳給和前臺的一樣,還有url鏈接是由前臺傳給後臺,在由後臺通過這個url進行下面的編碼


記住傳給後臺的url和當前鏈接要一模一樣,記住傳給後臺的url和當前鏈接要一模一樣,記住傳給後臺的url和當前鏈接要一模一樣

    // 這裏參數的順序要按照 key 值 ASCII 碼升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

    $signature = sha1($string);

    $signPackage = array(
    "jsapiTicket" =>$jsapiTicket,
      "appId"     => $this->appId,
      "nonceStr"  => $nonceStr,
      "timestamp" => $timestamp,
      "url"       => $url,
      "signature" => $signature,
      "rawString" => $string
    );
    $this->ajaxReturn($signPackage);

之後就通過微信的驗證OK之後,就可以了分享了 或者調用別的微信接口了

發佈了36 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章