1. 程式人生 > >JS-SDK分享網頁到微信遇到的坑

JS-SDK分享網頁到微信遇到的坑

現在開發大多都需要用到微信分享,推廣宣傳APP做得有多牛逼,然鵝,微信分享不是簡單的越塔五殺就能搞定的,需要前後臺的協同才能打死這個野怪,開發中遇到的重大問題是一直提示config:invalid signature,先來說說大體開發流程,再說說這問題是怎麼解決的:

1、繫結域名
域名必須ICP備案,在微信公眾平臺的js域名介面處繫結該域名。注意:繫結的域名或者路徑不允許有下劃線,因為公司的專案名帶有下劃線,而專案名已經被APP之前版本引用,所以不能通過修改專案名解決,於是想了另外一個辦法:繫結一個和應用同級目錄的路徑,把需要分享的網頁放到這個路徑下面來訪問,這時候會存在一個問題:分享頁面找不到一些專案資源,這時候可以通過修改頁面的相對路徑來解決。

2、繫結域名的後臺生成簽名信息,包括appId,timestamp,noncestr,signature,校驗簽名信息是否有誤地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign,如果signature一致則說明簽名無誤。

4、通過config介面注入許可權驗證配置

<script type="text/javascript">
        var url = location.href;
        var shareTitle = "";
        var shareDesc = "";
        var
shareImgUrl = ""; var appId; var timestamp; var noncestr; var signature; $.ajax({ url: '/app/getShareMsg/{id}.do', type: "GET", success: function (json) { if (json.errorMsg) { alert(json.errorMsg); return
; } if (json.status == 'success') { console.log("掃碼成功"); shareTitle = json.data.shareTitle; shareDesc = json.data.shareDesc; shareImgUrl = json.data.shareImg; shareImgUrl = "...../app/download.do?fileName=" + shareImgUrl;//絕對路徑 $.ajax({ type: "GET", url: "/app/generateSignature.do", data:{url:url}, success: function(json){ timestamp = json.data.timestamp; noncestr = json.data.noncestr; signature = json.data.signature; appId = json.data.appId; wx.config({ debug: false, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。開發時必須開啟,確認沒問題後再關閉。 appId: appId, // 和獲取Ticke的必須一樣------必填,公眾號的唯一標識 timestamp:timestamp, // 必填,生成簽名的時間戳 nonceStr: noncestr, // 必填,生成簽名的隨機串 signature: signature,// 必填,簽名,見附錄1 jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2 }); } }); } } });
</script>

5、通過ready介面處理成功驗證

頁面拿到伺服器返回的簽名信息後,呼叫微信的wx.ready({})方法介面實現分享功能,程式碼如下(這段程式碼放在標籤最下面):

wx.ready(function(){
            // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
            wx.onMenuShareTimeline({
                title: shareTitle, // 分享標題
                desc: shareDesc, // 分享描述
                link: url, // 分享連結
                imgUrl: shareImgUrl, // 分享圖示
                success: function () {
                    // 使用者確認分享後執行的回撥函式
                },
                cancel: function () {
                    // 使用者取消分享後執行的回撥函式
                }
            });

            wx.onMenuShareAppMessage({
                title: shareTitle, // 分享標題
                desc: shareDesc, // 分享描述
                link: url, // 分享連結
                imgUrl: shareImgUrl, // 分享圖示
                type: '', // 分享型別,music、video或link,不填預設為link
                dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空
                success: function () {
                    // 使用者確認分享後執行的回撥函式
                },
                cancel: function () {
                    // 使用者取消分享後執行的回撥函式
                }
            });
        });

坑:
1、簽名錯誤:這個可以把後臺伺服器生成的簽名信息放到https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign地址上面去校驗signature是否一致,後臺生成簽名的方法在網上很多,在這裡就不多說了。
2、確認簽名沒錯後,仍然彈框config:invalid signature,100%是URL有問題,這裡的url就是分享頁面的url,有三個地方必須完全一致,
1)var url = location.href;
2)後臺接收到的url;
3) link: url;
這三個url必須一致,後臺接收到的url會自動把引數拼接字元&轉義成&amb;,所以要替換成&,確保和前端的URL一致即可。

至此,問題解決!啦啦啦