微信開發配置JSSDK,注入權限驗證,以及invalid signature簽名錯誤解決


在微信開發中很多功能都要用到微信JSSDK,關於JSSDK的使用,微信官方的文檔已經比較詳細,一定要仔細去看文檔。

<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

我們先進入微信SDK的JS文件。在頁面中使用ajax注入權限驗證,關於后台的驗證以及簽名算法,官方文檔寫的很詳細,也有demo可以查看。

$(function(){  
    //var url = window.location.href; 
    var url=encodeURIComponent(location.href.split('#')[0]); 
    //alert(url);
    //ajax注入權限驗證  
    $.ajax({  
        url:"ajax",  
        //dataType: 'json',  
        type:'POST',
        data: {url:url},   
        error: function(XMLHttpRequest, textStatus, errorThrown){  
            alert("發生錯誤:"+errorThrown);  
        },  
        success: function(res){
            var appId = res.appid;  
            var noncestr = res.noncestr;  
            var jsapi_ticket = res.jsapi_ticket;  
            var timestamp = res.timestamp;  
            var signature = res.signature;  
            wx.config({  
                debug: true, //開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。  
                appId: appId, //必填,公眾號的唯一標識  
                timestamp: timestamp, // 必填,生成簽名的時間戳  
                nonceStr: noncestr, //必填,生成簽名的隨機串  
                signature: signature,// 必填,簽名,見附錄1  
                jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ',  
                            'onMenuShareWeibo','onMenuShareQZone','chooseImage',  
                            'uploadImage','downloadImage','startRecord','stopRecord',  
                            'onVoiceRecordEnd','playVoice','pauseVoice','stopVoice',  
                            'translateVoice','openLocation','getLocation','hideOptionMenu',  
                            'showOptionMenu','closeWindow','hideMenuItems','showMenuItems',  
                            'showAllNonBaseMenuItem','hideAllNonBaseMenuItem','scanQRCode'] //必填,需要使用的JS接口列表,所有JS接口列表 見附錄2  
            });  
        }  
    });  
  
}); 

這里主要的難點在於配置會遇到invalid signature簽名錯誤,官方文檔給出了5條排查的問題。

   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),因為頁面一旦分享,微信客戶端會在你的鏈接末尾加入其它參數,如果不是動態獲取當前鏈接,將導致分享后的頁面簽名失敗。

在仔細排查前5條后,都沒有發現問題,第六條寫的不是很清楚。

這里要注意的是,在微信瀏覽器里,微信客戶端會給你的連接轉碼,這里把連接提交到后台的時候一定要用encodeURIComponent。

var url=encodeURIComponent(location.href.split('#')[0]); 

這個連接提交到后台,后台處理

$url=urldecode($_POST['url']);  //這里轉回后成為簽名的參數
$string="jsapi_ticket={$ticket}&noncestr{$noncestr}&timestamp={$timestamp}&url={$url}";
$signature=sha1($string);

數據轉回到頁面上后就不報簽名錯誤了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM