1. 程式人生 > >獲取企業微信的jsapi_ticket許可權簽名演算法

獲取企業微信的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

返回結果:

  1. {
  2. "errcode":0,
  3. "errmsg":"ok",
  4. "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
  5. "expires_in":7200
  6. }
引數 說明
ticket 生成簽名所需的jsapi_ticket,最長為512位元組
expires_in 憑證的有效時間(秒)

簽名演算法

簽名生成規則如下: 參與簽名的引數有四個: noncestr(隨機字串), jsapi_ticket, timestamp(時間戳), url(當前網頁的URL, 不包含#及其後面部分

將這些引數使用URL鍵值對的格式 (即 key1=value1&key2=value2…)拼接成字串string1。 有兩個注意點:1. 欄位值採用原始值,不要進行URL轉義;2. 必須嚴格按照如下格式拼接,不可變動欄位順序。

  1. jsapi_ticket=JSAPITICKET&noncestr=NONCESTR&timestamp=TIMESTAMP&url=URL

然後對string1作sha1加密即可。示例 :

假如有如下引數:

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

步驟1. 將這些引數拼接成字串string1:

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

步驟2. 對string1進行sha1簽名,得到signature:

  1. 0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事項

  1. 簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
  2. 簽名用的url必須是呼叫JS介面頁面的完整URL。
  3. 出於安全考慮,開發者必須在伺服器端實現簽名的邏輯。

如出現invalid signature 等錯誤詳見附錄4常見錯誤及解決辦法。

獲取應用的jsapi_ticket

應用的jsapi_ticket用於計算agentConfig(參見“通過agentConfig注入應用的許可權”)的簽名,簽名計算方法與上述介紹的config的簽名演算法完全相同,但需要注意以下區別:

  1. 簽名的jsapi_ticket必須使用以下介面獲取。且必須用wx.agentConfig中的agentid對應的應用secret去獲取access_token。
  2. 簽名用的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

返回結果:

  1. {
  2. "errcode":0,
  3. "errmsg":"ok",
  4. "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
  5. "expires_in":7200
  6. }
引數 說明
ticket 生成簽名所需的jsapi_ticket,最長為512位元組
expires_in 憑證的有效時間(秒)