背景
微信公衆平臺體系,大家最爲熟悉的,一個是公衆號,另一個就是小程序。如果需要使用公衆號的高級功能,那麼大家首先想到的就是自組開發團隊來幹這些活兒。絕大多數情況下,公衆號運營方會把這些工作外包出去;但是外包出去之後會有一個風險:賬號的所有權總不能外包出去吧,萬一有風險,我能夠把外包工作收回。
微信公衆號體系原生支持這種 “外包” 思路,那就是微信第三方平臺,公衆號能夠通過這套體系,將公衆號的部分功能和權限開放給第三方。這在微信開放平臺中可以找到相應的文檔。與自有公衆號開發不同,微信三方平臺的授權體系是慎之又慎,筆者第一次接觸的時候,被文檔中提及的各種 token、各種 ticket 搞暈了,於是特意整理了這個流程,以圖表的方式將授權流程說明下來,便於查閱。
已經學習了授權流程的同學,可以直接將本文拉到最後面查看完整圖。本文按照授權順序,一步一步地說明。圖中關鍵的 token 或 ticket 數據,均用彩色標出並一一對應。
希望本文對微信三方平臺開發者能夠有所幫助。
授權步驟
三方平臺數據準備
微信三方平臺也是在微信開放平臺上的賬號,也有 appid
的概念。在微信的文檔中,三方平臺稱爲 “component
”。三方平臺需要實現一個供微信回調的 URL,在平臺中稱爲 “授權事件接收URL”(以下簡稱 “通知回調”),在應用詳情頁中進行配置。
不要被這個名稱誤導了,其實所有和三方平臺直接相關的事件都會經過這個 URL 通知。
獲取 component_access_token
這裏涉及流程中的兩個術語:component_verify_ticket
和 component_access_token
。
微信會每十分鐘往通知回調中發送一個消息,將參數 component_verify_ticket
告知三方平臺後臺。三方平臺拿到這個消息後,則需要使用自己的 app_secret
和 appid
信息,加上微信推送的這個 ticket,通過微信三方平臺的 api_component_token 接口,向微信平臺換取 component_access_token
。
生成授權註冊頁面 URL
讓公衆號點擊授權有兩種模式,一種是引導公衆號所有者掃碼進入一個授權頁;另一種範式是在移動端點擊鏈接來授權。兩種方式對後臺而言大同小異,本文講解第一種。
這裏其實包含了兩個小步驟:首先是三方平臺後臺向微信請求獲得預授權碼 pre_auth_code
;第二步是使用這個預授權碼,來組合成一個 URL 給公衆號所有者掃碼。
關鍵的參數如下(componentloginpage 是用於掃碼的 URL):
公衆號授權
獲取授權的公衆號
公衆號掃碼授權後,微信會向通知回調發送消息,除了告知授權的公衆號(稱爲 “authorizer”)的 appid 之外,最重要的是推送一個新的票據字段 authorization_code
,這個 code 是與授予權限的公衆號綁定的:
拉取公衆號信息及其授予的權限
這分別是兩個 API,其中比較重要的是拉取公衆號授予的權限範圍,調用了接口 “api_query_auth”。除了獲得授權範圍之外,最重要的,是再引入兩個新參數:
-
authorizer_access_token
:用在後文 “代公衆號調用接口” 中,替代微信公衆平臺的access_token
參數。 -
authorizer_refresh_token
:用於定時刷新 access_token
兩個 API 的調用圖如下:
代公衆號實現業務
刷新 authorizer_access_token
前文提到,通過 API:api_query_auth 可以獲得用於替代公衆號的authorizer_access_token
。有了這個之後,就可以代公衆號中使用 access_token 的調用。
同樣地,這個 token 也有過期時間,因此三方平臺需要調用 API,在 token 即將失效時刷新。使用這個 API 循環刷新即可:
獲取微信 JS-SDK 的 ticket
微信 JS-SDK 接口使用的不是 access_token,而是被稱爲 jsapi_ticket
的一個票據。普通的公衆號使用 access_token 來換取,三方平臺則使用 component_access_token
來換取:
其實這個接口已經不是微信三方應用的範圍了,只是普通的微信公衆平臺接口。但是因爲非常常用,所以還是在這裏說明了一下。
授權流程總覽
<span id='總覽'>上面所提及的各個分步驟,組合成一覽圖如下(圖片比較寬,推薦大屏幕查看或者放大查看):<>
圖中各個調用過程的標題,是 API 的名稱,可以作爲關鍵字在微信文檔中搜索。
參考資料
- 第三方平臺概述
- JS-SDK使用權限簽名算法,搜索 “JS-SDK使用權限簽名算法”
本文章採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。
本文地址:https://segmentfault.com/a/1190000017402102。
原文發佈於:https://cloud.tencent.com/developer/article/1368038,也是本人的專欄。