獲取企業微信的jsapi_ticket許可權簽名演算法
獲取企業的jsapi_ticket
生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是H5應用呼叫企業微信JS介面的臨時票據。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取。由於獲取jsapi_ticket的api呼叫次數非常有限(一小時內,一個企業最多可獲取400次,且單個應用不能超過100次),頻繁重新整理jsapi_ticket會導致api呼叫受限,影響自身業務,開發者必須在自己的服務全域性快取jsapi_ticket。
請求方式:GET(HTTPS)請求URL:https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN
引數說明:
引數 | 必須 | 說明 |
---|---|---|
access_token | 是 |
返回結果:
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
引數 | 說明 |
---|---|
ticket | 生成簽名所需的jsapi_ticket,最長為512位元組 |
expires_in | 憑證的有效時間(秒) |
簽名演算法
簽名生成規則如下:
參與簽名的引數有四個: noncestr(隨機字串), jsapi_ticket, timestamp(時間戳), url(當前網頁的URL, 不包含#及其後面部分
將這些引數使用URL鍵值對的格式 (即 key1=value1&key2=value2…)拼接成字串string1。 有兩個注意點:1. 欄位值採用原始值,不要進行URL轉義;2. 必須嚴格按照如下格式拼接,不可變動欄位順序。
jsapi_ticket=JSAPITICKET&noncestr=NONCESTR×tamp=TIMESTAMP&url=URL
然後對string1作sha1加密即可。示例 :
假如有如下引數:
noncestr=Wm3WZYTPz0wzccnW
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3
timestamp=1414587457
url=http://mp.weixin.qq.com?params=value
步驟1. 將這些引數拼接成字串string1:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
步驟2. 對string1進行sha1簽名,得到signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed
注意事項
- 簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
- 簽名用的url必須是呼叫JS介面頁面的完整URL。
- 出於安全考慮,開發者必須在伺服器端實現簽名的邏輯。
如出現invalid signature 等錯誤詳見附錄4常見錯誤及解決辦法。
獲取應用的jsapi_ticket
應用的jsapi_ticket用於計算agentConfig(參見“通過agentConfig注入應用的許可權”)的簽名,簽名計算方法與上述介紹的config的簽名演算法完全相同,但需要注意以下區別:
- 簽名的jsapi_ticket必須使用以下介面獲取。且必須用wx.agentConfig中的agentid對應的應用secret去獲取access_token。
- 簽名用的noncestr和timestamp必須與wx.agentConfig中的nonceStr和timestamp相同。
請求方式:GET(HTTPS)請求URL:https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=ACCESS_TOKEN&type=agent_config
引數說明:
引數 | 必須 | 說明 |
---|---|---|
access_token | 是 |
返回結果:
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
引數 | 說明 |
---|---|
ticket | 生成簽名所需的jsapi_ticket,最長為512位元組 |
expires_in | 憑證的有效時間(秒) |