欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

微信公眾號中的JSSDK接入及invalid signature等常見錯誤問題分析(全面解析)

 更新時間:2020年04月11日 10:53:58   作者:哈利法塔  
這篇文章主要介紹了微信公眾號中的JSSDK接入及invalid signature等常見錯誤問題分析(全面解析),需要的朋友可以參考下

最近在搞微信公眾號開發(fā),進行到網(wǎng)頁開發(fā)部分被坑了一天,最坑的問題就是invalid signature,而網(wǎng)上大部分解答這個問題的都沒有說清楚,都直接丟文檔。博主認為這樣很不好。本文是博主結(jié)合自身遇到的問題所寫,整個流程跟問題都很詳細,雖然排版可能有點不好。但是絕對對遇到類似問題的朋友有所幫助。請認真看下去

一、綁定JS接口安全域名

生產(chǎn)號綁定方法:登錄微信公眾平臺進入“公眾號設置”的“功能設置”里填寫“JS接口安全域名”。
測試號綁定方法:進入測試號管理頁面,找到JS接口安全域名項綁定
JS接口安全域名官方說法是:開發(fā)者可在該域名下調(diào)用微信開放的JS接口
域名格式:如果你的項目域名是http://test.domain.com,那么JS接口安全域名為test.domain.com。切記!
域名綁定失敗或者域名不存在會報錯誤:invalid url domain

二、引入微信js文件

引入方法:在需要調(diào)用JS接口的頁面引入JS文件,用script標簽引入即可
JS文件路徑:http://res.wx.qq.com/open/js/jweixin-1.2.0.js(支持https)

三、通過wx.config接口注入權(quán)限驗證

1、每個需要使用jssdk的頁面都要使用config接口注入配置信息,wx.config調(diào)用方法如下:

wx.config({
 debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
 appId: '', // 必填,公眾號的唯一標識
 timestamp: , // 必填,生成簽名的時間戳,精確到秒
 nonceStr: '', // 必填,生成簽名的隨機串
 signature: '',// 必填,簽名
 jsApiList: [] // 必填,需要使用的JS接口列表,例如:['chooseImage','previewImage','uploadImage']
})

其中appId,timestamp,nonceStr,signature必須從后臺獲取

四、后臺生成并返回前端所需參數(shù)

1、jsapi_ticket

jsapi_ticket是公眾號用于調(diào)用js接口的臨時票據(jù)。有效期7200秒,跟公眾號普通access_token一樣,必須全局緩存起來,因為這個ticket獲取次數(shù)有限,超過次數(shù)將無法使用。建議設置緩存時間為7198秒,因為當請求微信端生成jsapi_ticket返回給后臺保存這個動作需要時間,如果設置7200秒,實際上最后一兩秒時,緩存里面還存在,但實際在微信那邊已經(jīng)過期了,再拿這個ticket會出錯。生成jsapi_ticket如下:

(1)獲取普通access_token(GET請求): 

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

(2)用第一步獲取的access_token使用GET請求獲取jsapi_ticket

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

正確獲取信息如下:

{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}

2、生成簽名(signature)

簽名規(guī)則:
1、參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網(wǎng)頁的URL,不包含#及其后面部分)。
2、對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序,sort()即可)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串(string)。
3、使用sha1加密拼接成的字符串string。
注意:字段名和字段值都要使用原值,不要進行url轉(zhuǎn)義

參與的字段示例:

noncestr=Wm3WZYTPz0wzccnW
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
timestamp=1414587457
url=http://mp.weixin.qq.com?params=value

拼接完成的字符串:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value

使用sha1加密后的signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

3、簽名生成完后將appId、timestamp、nonceStr、signature一起返回到前端。格式示例:

{
	appId:appId,
	timestamp:timestamp,
	nonceStr: noncestr,
	signature: signature
}

前端拿到值后,寫入到wx.config中相應字段即可

注意:

1、前端wx.config配置中的nonceStr字段名稱的's'是大寫。但是后臺生成簽名的noncestr字段的‘s'是小寫,千萬要注意,博主在這里浪費了不少時間。囧囧

2、時間戳(timestamp)值要記住精確到秒,不是毫秒。

3、生成簽名的url(使用jssdk的頁面地址,這個頁面地址可以在瀏覽器訪問),包含“?”號后面的所有參數(shù),不包含“#”號后面的值。

如果是靜默授權(quán)或者授權(quán)頁面同意授權(quán)后跳轉(zhuǎn)到的頁面,頁面路徑會添加兩個參數(shù):code和state。

即授權(quán)后跳轉(zhuǎn)頁面為http://redirect.page.com,則完整路徑為

http://redirect.page.com?code=kdijafdhjaikeiu20kaiela&state=STATE。

那么生成簽名的url必須為授權(quán)后跳轉(zhuǎn)頁面的完整路徑。前端獲取這個路徑:location.href.split('#')[0]

注意注意:這里有個大坑。。如果前端使用ajax(使用jquery)獲取wx.config配置所需的幾個參數(shù)的值,可以這樣做:

$.ajax({
	url: 'http://backend.com?fullUrl=' + location.href.split('#')[0], //這里的參數(shù)fullUrl是當前頁面的完整url(除去#后面部分)
	type: 'GET',
	success: function(res) {
		//操作后臺返回值
	}
})

后臺要怎么操作前端傳過來的query值呢?大家肯定一眼看出來 獲取query中的fullUrl字段不就行了。

博主也是這么做的,請看博主后臺代碼(使用nodejs的koa框架)

let query = this.request.query;//獲取查詢字符串
let fullUrl = query.fullUrl;//獲取查詢字符串中的fullUrl字段

怎么樣,有沒有看出什么不對勁的地方?沒有?

博主把所有后續(xù)的獲取access_token、jsapi_ticket、計算簽名、返回值到前端、前端wx.config配置好這些所有操作做完,信心滿滿的開始用測試號訪問頁面。結(jié)果直接彈出config: invalid signature(開啟debug模式)。WTF ???

當然,搞這一行早就做好了遇到問題的心理準備。。。。開始排錯唄。。

首先在后臺將獲取access_token、jsapi_ticket、計算簽名的參數(shù)字典序排序后的字符串、sha1加密后的字符串全部console.log出來。

發(fā)現(xiàn),沒有錯誤的地方。那行,看來有可能是我代碼那個地方寫錯了,或者簽名算錯了?

到微信在線接口調(diào)試把剛剛打印的計算簽名的幾個參數(shù)分別填好。生成。。。發(fā)現(xiàn)跟我的代碼生成的是一樣的。

結(jié)果博主是各種排錯,各種百度,各種google。結(jié)果還是config: invalid signature...................................此處省略博主心里一萬句話

又這樣過了一個多小時,無果。。。。。。博主一臉頹廢的到茶水間泡了杯咖啡。。提提神。。又回到了崗位,準備從頭開始跑一遍再仔細看看。

從前端請求獲取簽名接口開始,博主打印了query的值。。也就是let query  = this.request.query的值。。結(jié)果發(fā)現(xiàn)。query值為:

{
	fullUrl: 'http://redirect.page.com?code=kdijafdhjaikeiu20kaiela',
	state: 'STATE'
}

好吧,問題在這里,有沒有人早就看出來的?前面說過,微信網(wǎng)頁授權(quán)后跳轉(zhuǎn)的頁面完整路徑為

http://redirect.page.com?code=kdijafdhjaikeiu20kaiela&state=STATE

有沒有注意路徑最后面的'&state=STATE'。當我們把這個完整路徑當做查詢字符串傳到后臺的時候,因為沒有對這個路徑進行encodeURIComponent.所以后臺將'&state=STATE'單獨看成了一個查詢字符串參數(shù),問題點在這里。。

后來查看公眾號文檔發(fā)現(xiàn)'附錄5-常見錯誤及解決方法'第六條有說明

問題解決

使用encodeURIComponent(location.href.split('#')[0])即可

五、調(diào)用接口

wx.config配置完成后會執(zhí)行wx.ready方法,所有接口必須要在config返回結(jié)果之后操作。config是一個客戶端的異步操作,所以如果需要在頁面加載時就調(diào)用相關接口,則須把相關接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。當前頁面要使用的接口,要寫入到config配置中的jsApiList中

1、拍照或從手機相冊中選圖接口

document.getElementById('chooseImage').onclick = function(){
 wx.chooseImage({
 count: 1, // 默認9
 sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有
 sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有
 success: function (res) {
 var localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標簽的src屬性顯示圖片
 }
 });
}

六、常見問題

1、invalid url domain:

js接口安全域名錯誤。可以看看第一項

2、invalid signature:

要么是jsapi_ticket錯誤,要么是簽名算法問題,要么是算法的參數(shù)有問題,注意noncestr中的's'是小寫的。如果都是對的。那就是前端傳的url有問題了。。。好好檢查一下,不要像博主一樣啊。。。。

3、permission denied:

這個問題一般是沒有接口權(quán)限的問題,有的接口是要認證之后才可以使用,當然,測試號不會有這個問題

總結(jié)

到此這篇關于微信公眾號中的JSSDK接入及invalid signature等常見錯誤問題分析(全面解析)的文章就介紹到這了,更多相關微信公眾號JSSDK接入invalid signature錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 選擇復選框按鈕置灰否則按鈕可用

    選擇復選框按鈕置灰否則按鈕可用

    這篇文章主要介紹了使用js實現(xiàn)選擇復選框按鈕置灰否則按鈕可用,需要的朋友可以參考下
    2014-05-05
  • JS基于正則實現(xiàn)數(shù)字千分位用逗號分隔的方法

    JS基于正則實現(xiàn)數(shù)字千分位用逗號分隔的方法

    這篇文章主要介紹了JS基于正則實現(xiàn)數(shù)字千分位用逗號分隔的方法,涉及javascript正則表達式操作數(shù)字的相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • javascript實現(xiàn)英文首字母大寫

    javascript實現(xiàn)英文首字母大寫

    本文給大家總結(jié)了幾種可以實現(xiàn)英文首字母大寫的javascript腳本,另附上一個CSS的實現(xiàn)方法,非常的簡單實用,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-04-04
  • JS動態(tài)解析多層級json數(shù)據(jù)生成html頁面

    JS動態(tài)解析多層級json數(shù)據(jù)生成html頁面

    在Web前端開發(fā)中,動態(tài)解析JSON數(shù)據(jù)并生成HTML頁面是一項常見的任務,通過JavaScript處理多層級的JSON數(shù)據(jù)結(jié)構(gòu),不僅可以提升用戶體驗,還能實現(xiàn)靈活的內(nèi)容展示和交互功能,本文將深入探討如何使用JavaScript解析復雜的JSON數(shù)據(jù),并將其動態(tài)渲染為HTML頁面
    2025-02-02
  • javascript結(jié)合fileReader 實現(xiàn)上傳圖片

    javascript結(jié)合fileReader 實現(xiàn)上傳圖片

    FileReader具體支持哪些方法和事件,這里就不介紹了,有興趣的可以去w3c官網(wǎng)上看看FileReader介紹,這里主要介紹一下FileReader常見應用,以及fileReader 實現(xiàn)上傳圖片示例分享。
    2015-01-01
  • window.onload的頁面加載技巧

    window.onload的頁面加載技巧

    大家仔細看下面兩段代碼,代碼一的window.onload = doIt()函數(shù)后面有();而代碼二的window.onload = doIt函數(shù)名后面沒有括號。
    2008-09-09
  • js檢查是否關閉瀏覽器的方法

    js檢查是否關閉瀏覽器的方法

    這篇文章主要介紹了js檢查是否關閉瀏覽器的方法,涉及javascript針對窗口事件的判定與操作相關技巧,需要的朋友可以參考下
    2016-08-08
  • JS+CSS實現(xiàn)的日本門戶網(wǎng)站經(jīng)典選項卡導航效果

    JS+CSS實現(xiàn)的日本門戶網(wǎng)站經(jīng)典選項卡導航效果

    這篇文章主要介紹了JS+CSS實現(xiàn)的日本門戶網(wǎng)站經(jīng)典選項卡導航效果,涉及JavaScript針對頁面元素的動態(tài)遍歷及樣式動態(tài)修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 詳解如何使用JSZip實現(xiàn)在瀏覽器中操作文件與文件夾

    詳解如何使用JSZip實現(xiàn)在瀏覽器中操作文件與文件夾

    這篇文章主要介紹了如何使用JSZip實現(xiàn)在瀏覽器中操作文件與文件夾,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-04-04
  • JS截取與分割字符串常用技巧總結(jié)

    JS截取與分割字符串常用技巧總結(jié)

    這篇文章主要介紹了JS截取與分割字符串常用技巧,以實例形式分析你了JavaScript針對字符串的截取與分割常用函數(shù)的定義、功能及使用技巧,并補充分析了substr和substring方法的區(qū)別,需要的朋友可以參考下
    2015-11-11

最新評論