問題
在實際的需求中,我們常常遇到多個部署在不同域名下的業(yè)務(wù),想使用同一個「微信服務(wù)號」進(jìn)行微信網(wǎng)頁授權(quán)。但是微信的網(wǎng)頁授權(quán)只能設(shè)置一個回調(diào)地址。為了滿足業(yè)務(wù)需求,有人想到給每個業(yè)務(wù)部門配置一個微信服務(wù)號,但是這樣的成本太高昂。每個服務(wù)號需要定期繳納年檢費用,而且每一個網(wǎng)頁授權(quán)都需要配置相應(yīng)后端。
那么,如何解決多個域名使用同一個微信服務(wù)號進(jìn)行網(wǎng)頁授權(quán)呢?
解決辦法
假設(shè)我們有 A.example.com 、 B.example.com、C.example.com域名想使用微信授權(quán),我們可以將網(wǎng)頁授權(quán)域名設(shè)置為A.example.com。
步驟如下:
- 設(shè)置回調(diào)域名。將域名
A.example.com
微信公眾平臺->設(shè)置->公眾號設(shè)置->功能設(shè)置->網(wǎng)頁授權(quán)域名
- 在域名
A.example.com添加中間頁 get-weixin-code.html
中間頁不一定在根域名下。在這里我們放在根域名下。中間頁的訪問地址如下,https://A.example.com/get-weixin-code.html
- 假設(shè)域名
B.example.com/game需要進(jìn)行網(wǎng)頁授權(quán)。我們可以使用下面鏈接進(jìn)行授權(quán),獲取微信的授權(quán)code
https://A.example.com/get-weixin-code.html?appid=XXXX&scope=snsapi_base&state=hello-world&redirect_uri=https%3A%2F%2FB.example.com%2Fgame

最終會回調(diào)到這個地址
https://B.example.com/game?code=XXXXXXXXXXXXXXXXX&state=hello-world,這樣就可以拿到授權(quán)code和state參數(shù)。利用授權(quán)
code,請求自己后端服務(wù)器,獲取微信用戶信息。
原理
從原理圖中可以看到,我們還是以類型直接授權(quán)的方式獲取微信的授權(quán)code。但是,我們增加了一次跳轉(zhuǎn),以滿足多個不同域名使用同一微信號進(jìn)行授權(quán)。

中間頁的原理
中間頁主要做了依次做了兩件事情:
- 跳轉(zhuǎn)到微信授權(quán)頁
- 授權(quán)成功,重定向到目標(biāo)頁。
微信后端邏輯
微信授權(quán)流程
- 第一步:用戶同意授權(quán),獲取code
- 第二步:通過code換取網(wǎng)頁授權(quán)access_token
- 第三步:刷新access_token(如果需要)
- 第四步:拉取用戶信息(需scope為 snsapi_userinfo)
總結(jié)
使用中間頁的方式,雖然多了一次請求。但是滿足了多個域名使用同一個微信號進(jìn)行網(wǎng)頁授權(quán)。在實際的使用過程中,我們將get-weixin-code.html頁,放在了nginx所在的服務(wù)器上。經(jīng)測試,跳轉(zhuǎn)都在毫秒級完成,用戶幾乎無感知。
但是,也有不足的地方。使用中間頁后,當(dāng)用戶不想進(jìn)行授權(quán)時,微信授權(quán)頁不會自動關(guān)閉,而是停留在中間頁。直接授權(quán)方式,卻可以自動關(guān)閉授權(quán)流程,回到原位置(聊天窗口或朋友圈)。相關(guān)issue