解決微信授權(quán)回調(diào)頁面域名只能設(shè)置一個的問題
最終的解決方案是:https://github.com/liuyunzhuge/php_weixin_proxy,詳細(xì)的介紹請往下閱讀。
在做項(xiàng)目集成微信登錄以及微信支付的時(shí)候,都需要進(jìn)行用戶授權(quán)。這個授權(quán)的流程可以簡單描述為:
1. 用戶從我們的應(yīng)用觸發(fā)需要授權(quán)的操作,比如點(diǎn)擊微信登錄;
2. 應(yīng)用收到這種用戶請求后,將用戶重定向到微信提供的一個授權(quán)頁面:
或
3. 用戶通過微信掃碼(PC端授權(quán),上邊左圖)或者點(diǎn)擊確認(rèn)按鈕(移動端授權(quán),上邊右圖)告知微信,授權(quán)應(yīng)用訪問自己的微信賬號信息;
4. 微信收到用戶的授權(quán)許可后,生成授權(quán)碼,并把它作為參數(shù)回調(diào)至應(yīng)用的某個頁面;
5. 應(yīng)用的回調(diào)頁面在接收到微信的回調(diào)請求后,拿到其中的授權(quán)碼,并通過微信官方提供的access token api接口獲取access token;
6. 最后通過access token以及微信官方提供的另一個userinfo api接口就能獲取到用戶的微信賬號信息。
為了實(shí)現(xiàn)這個過程,首先要為應(yīng)用申請一個微信公眾號,并將應(yīng)用最終部署的域名設(shè)置到微信公眾號設(shè)置里面的授權(quán)回調(diào)頁面域名這個選項(xiàng)里面。微信官方對這個選項(xiàng)的說明如下:
關(guān)于網(wǎng)頁授權(quán)回調(diào)域名的說明
1、在微信公眾號請求用戶網(wǎng)頁授權(quán)之前,開發(fā)者需要先到公眾平臺官網(wǎng)中的“開發(fā) - 接口權(quán)限 - 網(wǎng)頁服務(wù) - 網(wǎng)頁帳號 - 網(wǎng)頁授權(quán)獲取用戶基本信息”的配置選項(xiàng)中,修改授權(quán)回調(diào)域名。請注意,這里填寫的是域名(是一個字符串),而不是URL,因此請勿加 http:// 等協(xié)議頭;
2、授權(quán)回調(diào)域名配置規(guī)范為全域名,比如需要網(wǎng)頁授權(quán)的域名為:www.qq.com,配置以后此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進(jìn)行OAuth2.0鑒權(quán)。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com無法進(jìn)行OAuth2.0鑒權(quán)
3、如果公眾號登錄授權(quán)給了第三方開發(fā)者來進(jìn)行管理,則不必做任何設(shè)置,由第三方代替公眾號實(shí)現(xiàn)網(wǎng)頁授權(quán)即可
由此可見,這個規(guī)則極其嚴(yán)格。如果說我們的應(yīng)用最終部署的時(shí)候只有一個域名,那么這種規(guī)則不會有什么問題;但是考慮到將來應(yīng)用的復(fù)雜性,我們可能在應(yīng)用設(shè)計(jì)之初就會對應(yīng)用做拆分,然后不同的業(yè)務(wù)采用不同的二級域名來部署。比如一個帶有交易的應(yīng)用,你可能會把登錄注冊,交易管理和常規(guī)業(yè)務(wù)都獨(dú)立出來,然后采用以下的方式來部署它們:
www.your.com 部署常規(guī)業(yè)務(wù);
trade.your.com 部署交易管理的業(yè)務(wù);
passport.your.com 部署登錄注冊的業(yè)務(wù);
在這種模式下,如果集成微信登錄和微信支付,前面說的授權(quán)回調(diào)頁面域名的規(guī)則就會給應(yīng)用帶來問題。在這里:至少可以確認(rèn)trade.your.com和passport.your.com都需要前面的介紹的用戶微信授權(quán),但是它們是兩個不同的子域名,而且我們只有一個公眾號;根據(jù)授權(quán)回調(diào)頁面域名的原則,它只能用一個域名,并且只有回調(diào)地址的域名與該設(shè)置完全相同,才能成功發(fā)起微信授權(quán),否則就會提示rediret_uri參數(shù)錯誤或者引發(fā)無法回調(diào)的問題。
那么這種情況該如何處理?
當(dāng)下的解決方案是引入一個新的非常簡單的應(yīng)用來作為微信授權(quán)的代理服務(wù),可以這么做:
1. 把公眾號的網(wǎng)頁授權(quán)接口域名設(shè)置成另外一個子域名,如proxy.your.com;
2. 然后把php_weixin_proxy里面的index.php部署到proxy.your.com
php_weixin_proxy下的index.php是一個很簡單的php文件,你可以直接查看源碼了解它的實(shí)現(xiàn)方式。因?yàn)楫?dāng)前項(xiàng)目的環(huán)境,我采用php來完成這個代理服務(wù)實(shí)現(xiàn),實(shí)際上,你完全可以用任意平臺語言來完成類似的功能。
當(dāng)其它業(yè)務(wù)需要發(fā)起微信授權(quán)時(shí),將授權(quán)請求先發(fā)到proxy.your.com,然后proxy.your.com會把這個請求轉(zhuǎn)發(fā)到微信;
當(dāng)用戶同意授權(quán)后,proxy.your.com會收到微信的授權(quán)回調(diào),并把回調(diào)結(jié)果(code、state參數(shù))原封不動地再返回給最開始發(fā)起授權(quán)的業(yè)務(wù)。
唯一的區(qū)別在于,在不使用proxy.your.com的時(shí)候,你從應(yīng)用發(fā)起微信授權(quán)的鏈接應(yīng)該是這樣的:
用了proxy.your.com之后,這個授權(quán)鏈接就應(yīng)該是這樣的:
后面這個鏈接跟上面的比:
1. 后面的鏈接中的host變成了proxy.your.com,也就是代理的授權(quán)回調(diào)域名;
2. 后面的多了一個device參數(shù),這個是必要的。因?yàn)槲⑿舙c端跟移動端的授權(quán)地址是不一樣的,而后面的鏈接是發(fā)送個proxy.your.com的,所以需要多加個參數(shù)告訴它在轉(zhuǎn)發(fā)給授權(quán)申請給微信的時(shí)候,是用PC端還是移動端的授權(quán)地址。
整體方案思路:
小結(jié):
這個方案我測試過,是行的通的。雖然說引入了代理服務(wù),增加了一次重定向操作,不過由于這個授權(quán)請求并不是所有請求都需要,所以實(shí)際上也不會對用戶體驗(yàn)產(chǎn)生多大的影響,但是從架構(gòu)上來說,它的好處很明顯,能夠配合著應(yīng)用的拆分邏輯,集成同一個公眾號的登錄及支付功能,不必為每個子應(yīng)用都單獨(dú)申請一個公眾號來開發(fā)了(這種方式從業(yè)務(wù)上來說也不合理,一個公司哪需要運(yùn)營那么多公眾號)。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- 微信公眾平臺網(wǎng)頁授權(quán)獲取用戶基本信息中授權(quán)回調(diào)域名設(shè)置的變動
- 解析微信JS-SDK配置授權(quán),實(shí)現(xiàn)分享接口
- 微信開發(fā) 微信授權(quán)詳解
- 微信公眾號-獲取用戶信息(網(wǎng)頁授權(quán)獲?。?shí)現(xiàn)步驟
- php版微信公眾平臺之微信網(wǎng)頁登陸授權(quán)示例
- MVC微信網(wǎng)頁授權(quán)獲取用戶OpenId
- 微信網(wǎng)頁授權(quán)(OAuth2.0) PHP 源碼簡單實(shí)現(xiàn)
- ASP.NET實(shí)現(xiàn)QQ、微信、新浪微博OAuth2.0授權(quán)登錄
- PHP實(shí)現(xiàn)微信網(wǎng)頁授權(quán)開發(fā)教程
- 微信開發(fā)之網(wǎng)頁授權(quán)獲取用戶信息(二)
- weiphp微信公眾平臺授權(quán)設(shè)置
- 微信開放平臺之網(wǎng)站授權(quán)微信登錄功能
相關(guān)文章
php實(shí)現(xiàn)的SSO單點(diǎn)登錄系統(tǒng)接入功能示例分析
這篇文章主要介紹了php實(shí)現(xiàn)的SSO單點(diǎn)登錄系統(tǒng)接入功能,簡單分析了SSO單點(diǎn)登錄系統(tǒng)接入的原理與php相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-10-10POST一個JSON格式的數(shù)據(jù)給Restful服務(wù)實(shí)例詳解
這篇文章主要介紹了POST一個JSON格式的數(shù)據(jù)給Restful服務(wù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04php通過array_merge()函數(shù)合并兩個數(shù)組的方法
這篇文章主要介紹了php通過array_merge()函數(shù)合并兩個數(shù)組的方法,實(shí)例分析了php中array_merge()函數(shù)合并數(shù)組的使用技巧,需要的朋友可以參考下2015-03-03PHP 使用openssl 擴(kuò)展實(shí)現(xiàn)公鑰加密的方法
下面小編就為大家分享一篇PHP 使用openssl 擴(kuò)展實(shí)現(xiàn)公鑰加密的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03PHP strtok()函數(shù)的優(yōu)點(diǎn)分析
相對于explode()來說,strtok()函數(shù)可以控制節(jié)奏。按需切割字串。2010-03-03PHP中shuffle數(shù)組值隨便排序函數(shù)用法
這篇文章主要介紹了PHP中shuffle數(shù)組值隨便排序函數(shù)用法,可以比較簡單的實(shí)現(xiàn)對數(shù)組的隨機(jī)排序,需要的朋友可以參考下2014-11-11