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一致即可。
至此,問題解決!啦啦啦