什麼是臨時票據(jsapi_ticket)
官方是這麼說的
jsapi_ticket
生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公衆號用於調用微信JS接口的臨時票據。正常情況下,jsapi_ticket的有效期爲7200秒,通過access_token來獲取。由於獲取jsapi_ticket的api調用次數非常有限,頻繁刷新jsapi_ticket會導致api調用受限,影響自身業務,開發者必須在自己的服務全局緩存jsapi_ticket 。
參考以下文檔獲取access_token(有效期7200秒,開發者必須在自己的服務全局緩存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
成功返回如下JSON:
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
獲得jsapi_ticket之後,就可以生成JS-SDK權限驗證的簽名了
開發微信分享的時候需要wx.config 需要signature 但是
返回的json
config:invalid signature
後來仔細讀開發文檔發現下面那麼一段話
簽名算法
簽名生成規則如下:
參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這裏需要注意的是所有參數名均爲小寫字符。對string1作sha1加密,字段名和字段值都採用原始值,不進行URL 轉義
原來是我的參數沒有安按照從小到大的順序
以前我是怎麼弄的
public static void main(String[] args) {
Map<String, String> wxauth = new HashMap<String, String>()
wxauth.put("noncestr", CommonUtils.getUUID32())
wxauth.put("timestamp", System.currentTimeMillis() / 1000+"")
wxauth.put("jsapi_ticket", "bxLdikRXVbTPdHSM05e5u5sUoXNKd8")
wxauth.put("url", "url")
StringBuffer wxsignature = new StringBuffer()
for (Entry<String, String> entry : wxauth.entrySet()) {
wxsignature.append(entry.getKey()).append("=")
.append(entry.getValue()).append("&")
}
String signature = wxsignature.substring(0, wxsignature.length() - 1)
System.out.println(DigestUtils.sha1Hex(signature))
}
所以我把我的HashMap換成了TreeMap
其他部分的代碼不變
public static void main(String[] args) {
Map<String, String> wxauth = new TreeMap<String, String>()
wxauth.put("noncestr", CommonUtils.getUUID32())
wxauth.put("timestamp", System.currentTimeMillis() / 1000+"")
wxauth.put("jsapi_ticket", "bxLdikRXVbTPdHSM05e5u5sUoXNKd8")
wxauth.put("url", "url")
StringBuffer wxsignature = new StringBuffer()
for (Entry<String, String> entry : wxauth.entrySet()) {
wxsignature.append(entry.getKey()).append("=")
.append(entry.getValue()).append("&")
}
String signature = wxsignature.substring(0, wxsignature.length() - 1)
System.out.println(DigestUtils.sha1Hex(signature))
}
這個網址可以測試我們加密後的signature和它生成的signature是否相同