微信獲取jsapi_ticket signature (config:invalid signature)

什麼是臨時票據(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

用第一步拿到的access_token 採用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發者必須在自己的服務全局緩存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

成功返回如下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));//DigestUtils apache common下面的一個加密工具類 微信參數只支持sha1加密
    }

所以我把我的HashMap換成了TreeMap

其他部分的代碼不變

public static void main(String[] args) {
        Map<String, String> wxauth = new TreeMap<String, String>();//TreeMap using the natural ordering of its keys 對key進行了排序
        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));//DigestUtils apache common下面的一個加密工具類 微信參數使用sha1加密
    }

http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign

這個網址可以測試我們加密後的signature和它生成的signature是否相同

開發文檔 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章