最終的解決方案是:https://github.com/liuyunzhuge/php_weixin_provider,詳細的介紹請往下閱讀。php
本文面向的是php語言laravel框架的用戶,介紹的是基於該框架實現的一個簡易集成微信登陸的方法。使用方法以下:html
1. 安裝php_weixin_providerlaravel
在項目下運行composer require thirdproviders/weixin,便可完成安裝。安裝成功後,在項目的vendor目錄下應該能看到php_weixin_provider的庫文件:git
2. 配置微信登陸的參數github
一共有7個參數能夠配置,分別是:設計模式
這七個參數有2種設置方式。數組
第一種是把這些參數以大寫的形式配置到.env配置文件裏面:微信
注:一、每一個配置項都是大寫,且以WEIXIN_開頭;二、前三個配置項與前面介紹的參數名稱不徹底一致,KEY對應client_id,SECRET對應client_secret,REDIRECT_URI對應redirect;三、其它的與前面介紹的參數名稱一致。cookie
第二種是把這些參數配置到config/services.php文件裏面去:併發
這種方式的配置,每一個配置項的名稱與前面介紹的一致。
要注意的內容:
3. 註冊php_weixin_provider
在項目的config/app.php文件裏面,找到providers配置節,把以下代碼加到它的配置數組裏面:
4. 註冊第三方登陸事件的監聽
在項目的app/Providers/EventServiceProvider.php裏面加入如下代碼:
laravel框架總體上是一種IOC跟事件驅動的思想,熟悉js就會對事件驅動很是熟悉,熟悉設計模式,就會對IOC(控制反轉,也稱爲DI:依賴注入)比較熟悉,這個是理解第3步和第4步配置做用的關鍵。
5. 編寫微信登陸的接口
舉例以下:
//採用代理跳轉,從PC端微信登陸 Route::get('/login', function () { return Socialite::with('weixin') ->setProxyUrl('http://proxy.your.com') ->setRedirectUrl(url('/login/notify')) ->redirect(); }); //採用代理跳轉,從手機端微信登陸 Route::get('/login2', function () { return Socialite::with('weixin') ->setProxyUrl('http://proxy.your.com') ->setDevice('') ->setRedirectUrl(url('/login/notify')) ->redirect(); }); //不採用代理跳轉,從PC端微信登陸 Route::get('/login', function () { return Socialite::with('weixin') ->setRedirectUrl(url('/login/notify')) ->redirect(); }); //不採用代理跳轉,從手機端微信登陸 Route::get('/login4', function () { return Socialite::with('weixin') ->setDevice('') ->setRedirectUrl(url('/login/notify')) ->redirect(); });
Socialite::with('weixin')會返回php_weixin_provider的實例,也就是它:
拿到這個實例以後,就能夠採用鏈式的方式調用它提供的全部public方法,好比設置配置參數,setDevice等等。
6. 編寫微信登陸回調的接口
舉例以下:
//登陸回調 Route::get('/login/notify', function () { $user = null; try { $user = Socialite::with('weixin')->user(); } catch(\Exception $e) { return '獲取微信用戶異常'; } return $user->nickname; });
經過Socialite::with('weixin')拿到php_weixin_provider實例後,調用user方法,就會自動跟微信調用相關接口,並把微信的返回值封裝成對象返回。若是在此過程當中,有任何錯誤都會以異常的形式拋出,好比state參數校驗失敗,好比code失效等。
返回的$user對象包含的有效屬性有:
小結:
這個方案是基於laravel/socialite實現,併發布到composer來使用的。laravel/socialite是laravel官方提供的第三方登陸的模塊,基於它能夠很方便的集成大部分第三方平臺的認證,目前它官方已經提供不少第三方的登陸實現:https://socialiteproviders.github.io/。除了國外的facebook,google,github等,國內的微信,微博,qq也都有提供。我在一開始也用的是它官方提供的默認的微信登陸provider來作的,可是後來我發現瞭如下幾個問題:
1. 不支持微信受權的代理;
3. 它封裝的user對象里居然不包含unionid
因此我就在它官方的微信登陸provider基礎上,按照本身的想法,從新實現了一個來解決我發現的這些問題。