微信 JSSDK 報 config:invalid signature 錯誤

在微信公衆號開發中遇到自定義分享內容。使用 JSSDK 的時候一直報 config:invalid signature 錯誤。javascript

你們能夠先參考一下騰訊的官方說明。php

而後需注意一下幾點:html

  • 簽名要用到的jsapi_ticket須要保存的,2小時有效期。若是在2小時內出現問題須要刪除才能工做,通常是自身程序的問題,請檢查。java

  • nonceStr和noncestr的大小寫,小心!ajax

  • url必定要小心,若是是"http://x.com/jspay?oid=0&attr=1#wechat"的形式,那麼應該保留的是"http://x.com/jspay?oid=0&attr=1"。json

  • 據此,url在JavaScript中是location.href.split('#')[0]獲取。api

  • 據此,url在php中用$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]拼裝,微信

  • 聽說會有多餘的80端口問題,可是記錄者沒有遇到過,總之請當心。app

  • url在JavaScript中千萬別忘記「encodeURIComponent」!不然後果很詭異,遇到過初始化的時候報invalid
    signature,可是API接口又能調用的狀況。jsp

一、頁面請求的 url 和生成 signature 的 url 必須一致。

二、url 需去除 # 號後面的內容 (  encodeURIComponent(location.href.split('#')[0])  )

個人是經過 ajax 調用生成簽名來配置 wx.config({ }) 的

<script type="text/javascript">
        $.ajax({
            type: "Get",
            data: "url=" + encodeURIComponent(location.href.split('#')[0]),
            url: "{:U('Index/getSignPackage')}",
            success: function(res){
                var res = eval("(" + res + ")");
//                alert(JSON.stringify(res));
//                console.log(res);
                if(res.code != 0){
                    wx.config({
                        debug: false,
                        appId: res.appId,
                        timestamp: res.timestamp,
                        nonceStr: res.nonceStr,
                        signature: res.signature,
                        jsApiList: [
                            // 全部要調用的 API 都要加到這個列表中
                            'onMenuShareTimeline',
                            'onMenuShareAppMessage',
                            'onMenuShareQQ',
                            'onMenuShareWeibo',
                            'hideMenuItems',
                            'showMenuItems',
                            'hideOptionMenu',
                            'showOptionMenu'
                        ]
                    });
                    wx.ready(function () {
                        // 在這裏調用 API
                        wx.onMenuShareTimeline({
                            title: '丹陽國際眼鏡城歡迎您來開紅包!\n紅包來襲,全民瘋搶中!快來參與吧!', // 分享標題
                            link: 'http://dyyj.vxiaoxiao.cn/index.php?s=/Home/Index/index.html', // 分享連接
                            imgUrl: 'http://dyyj.vxiaoxiao.cn/Public/Home/images/danyang/logo.jpg', // 分享圖標
                            success: function () {
                                // 用戶確認分享後執行的回調函數
                            },
                            cancel: function () {
                                // 用戶取消分享後執行的回調函數
                            }
                        });
                        wx.onMenuShareAppMessage({
                            title: '丹陽國際眼鏡城歡迎您來開紅包!\n紅包來襲,全民瘋搶中!快來參與吧!', // 分享標題
                            desc: '丹陽國際眼鏡城歡迎您來開紅包!\n紅包來襲,全民瘋搶中!快來參與吧!', // 分享描述
                            link: 'http://dyyj.vxiaoxiao.cn/index.php?s=/Home/Index/index.html', // 分享連接
                            imgUrl: 'http://dyyj.vxiaoxiao.cn/Public/Home/images/danyang/logo.jpg', // 分享圖標
                            type: '', // 分享類型,music、video或link,不填默認爲link
                            dataUrl: '', // 若是type是music或video,則要提供數據連接,默認爲空
                            success: function () {
                                // 用戶確認分享後執行的回調函數
                            },
                            cancel: function () {
                                // 用戶取消分享後執行的回調函數
                            }
                        });
                    });
                }
            }
        })
    </script>

後臺php

 //獲取微信JSSDK配置信息
    function getSignPackage($url){
        $jssdk = new JSSDK("addId", "appSecret");
        $signPackage = $jssdk->GetSignPackage($url);
        $signPackage['code']=(empty($signPackage))?0:1;
        $this->ajaxReturn(json_encode($signPackage));
        exit();
    }
ps:
具體怎麼使用微信自定義的分享功能能夠參考
http://www.huceo.com/post/414.html
 
相關文章
相關標籤/搜索