大家都知道,微信公衆號不同於企業微信(原企業號),一個公衆號只有一個應用,只能配一個服務器地址。另一個不同就是,在刷新access_token時,公衆號的access_token會更新,舊的會失效。因此,微信平臺建議使用一箇中控服務器來定時刷新access_token,可以使用內存存儲或持久化到數據庫中。保證在有效時間內,所調用的token相同。
我做了一個微信中控的小應用,將所有公衆號的消息及事件請求接收後,根據消息轉發功能,轉發到不同的業務系統中。由它定時獲取access_token,其它業務系統只有讀取的接口,沒有刷新的功能,這樣保證各個系統在同一時間的access_token都是有效的。
但對於微信網頁授權時,一時找不到思路。後來從網上看了別人的解決思路,試着弄成功了(抱歉時間久遠,已經不知道文章來源是哪了)。這裏把我自己的實現方法分享給大家,大家如果有更好的思路,歡迎交流。
所謂網頁授權,其實就是用戶在微信瀏覽器中打開頁面時,獲取到當前登錄微信的用戶信息。
對於公衆號而言,每個用戶對應唯一的openId,這是根據某種算法生成的字符串,即便用戶是否關注。
除了openId這最基本的信息以外,還包括暱稱、性別、地區、頭像等信息。
獲取用戶的信息,有這麼幾種方式:
•用戶關注某個公衆號後,根據API獲取用戶openId列表,根據openId獲取其它基本信息。
•用戶給公衆號發送消息或觸發事件,後臺解析發送者的openId,根據API獲取用戶信息
•網頁授權只獲取用戶的openId或包括openId在內的基本信息
下面介紹微信中控如何接入網頁授權的功能,比如我的中控地址爲:http://dulinan.cn/wechatserver(真實的沒有給提供)
1.接入網頁授權
微信服務號平臺地址:https://mp.weixin.qq.com/
登入後在 公衆號設置->功能設置中,將中控地址填入
上面設置業務域名,可使得不出現安全提示(輸入賬號密碼之類的)
上面設置JS接口安全域名,可在該域名下調用微信開放的JS接口
上面設置網頁授權域名,防止與服務器地址不一致時出現redirect_url錯誤
前兩個可同時設置三個,每月修改三次,最後一個最多隻能設置一個。三個要保證和服務器域名相同,通過ICP的備案驗證,並.txt文件放根目錄下
2.微信網頁授權時序圖(具體的代碼將在後面介紹,方便大家理解)
在公衆號直接接入業務系統時,時序圖是這樣的:
在公衆號接入中控時,時序圖是這樣的:
時序圖中的1、4、6需要開發者自行開發,2、3、5在中控中已處理好。
比如有個掃碼獲取門票的場景:
1)用戶在填寫預約信息後,點擊預約,後臺對預約信息進行保存,同時生成二維碼並與此預約信息綁定作爲門票進行。
2)用戶掃碼後,公衆號對此用戶發送預約成功的模版消息。
3)用戶點擊模版消息,跳轉到驗票頁面。
其中第3步對應網頁授權的點擊鏈接那個環節。
實現步驟:
1.填寫預約信息進行預約
2.生成二維碼
3.用戶掃碼獲取預約信息
4.點擊鏈接進入驗票頁面
代碼說明:
1.用戶在點擊場景3中的模版消息時,模版消息帶着一個鏈接,鏈接地址爲中控的地址的一個方法(這個地址是自平臺生成《時序圖那塊》,直接由自平臺發的模版消息),中控根據獲取的appid,重定向地址(肯定是業務系統的地址),以及業務系統中的參數(比如這個例子是二維碼的ticket),獲取code值,並重定向到中控的另一個方法中。
2.另一個方法接收到code值、重定向地址,以及業務系統中的參數。帶着code及業務系統中的參數,重定向到重定向地址中(比如叫a地址的b方法)
3.進入到業務系統的a地址的b方法後,它需要根據code獲取網頁授友的access_token,這樣帶着code,進入到中控中,通過code獲取網頁授權的access_token,獲取到access_token,就可以處理相應的業務了