1212namespace Overtrue \LaravelWeChat \Middleware ;
1313
1414use Closure ;
15- use EasyWeChat \OfficialAccount \Application ;
1615use Event ;
17- use Log ;
16+ use http \ Env \ Request ;
1817use Overtrue \LaravelWeChat \Events \WeChatUserAuthorized ;
18+ use Overtrue \Socialite \User ;
1919
2020/**
2121 * Class OAuthAuthenticate.
2222 */
2323class OAuthAuthenticate
2424{
25- /**
26- * Use Service Container would be much artisan.
27- */
28- private $ wechat ;
29-
30- /**
31- * Inject the wechat service.
32- *
33- * @param \EasyWeChat\OfficialAccount\Application $wechat
34- */
35- public function __construct (Application $ wechat )
36- {
37- $ this ->wechat = $ wechat ;
38- }
39-
4025 /**
4126 * Handle an incoming request.
4227 *
@@ -46,41 +31,42 @@ public function __construct(Application $wechat)
4631 *
4732 * @return mixed
4833 */
49- public function handle ($ request , Closure $ next , $ scopes = null )
34+ public function handle ($ request , Closure $ next , $ account = ' default ' , $ scopes = null )
5035 {
51- $ isNewSession = false ;
52- $ onlyRedirectInWeChatBrowser = config ('wechat.official_account.oauth.only_wechat_browser ' , false );
53-
54- if ($ onlyRedirectInWeChatBrowser && !$ this ->isWeChatBrowser ($ request )) {
55- if (config ('wechat.debug ' )) {
56- Log::debug ('[not wechat browser] skip wechat oauth redirect. ' );
57- }
58-
59- return $ next ($ request );
36+ // $account 与 $scopes 写反的情况
37+ if (is_array ($ scopes ) || (\is_string ($ account ) && str_is ($ account , 'snsapi_* ' ))) {
38+ list ($ account , $ scopes ) = [$ scopes , $ account ];
39+ $ account || $ account = 'default ' ;
6040 }
6141
62- $ scopes = $ scopes ?: config ('wechat.official_account.oauth.scopes ' , ['snsapi_base ' ]);
42+ $ isNewSession = false ;
43+ $ sessionKey = \sprintf ('wechat.oauth_user.%s ' , $ account );
44+ $ config = config (\sprintf ('wechat.official_account.%s ' , $ account ), []);
45+ $ officialAccount = app (\sprintf ('wechat.official_account.%s ' , $ account ));
46+ $ scopes = $ scopes ?: array_get ($ config , 'oauth.scopes ' , ['snsapi_base ' ]);
6347
6448 if (is_string ($ scopes )) {
6549 $ scopes = array_map ('trim ' , explode (', ' , $ scopes ));
6650 }
6751
68- if (!session ('wechat.oauth_user ' ) || $ this ->needReauth ($ scopes )) {
52+ $ session = session ($ sessionKey , []);
53+
54+ if (!$ session ) {
6955 if ($ request ->has ('code ' )) {
70- session ([' wechat.oauth_user ' => $ this -> wechat -> oauth ->user ()]);
56+ session ([$ sessionKey => $ officialAccount -> oauth ->user () ?? [] ]);
7157 $ isNewSession = true ;
7258
73- Event::fire (new WeChatUserAuthorized (session (' wechat.oauth_user ' ), $ isNewSession ));
59+ Event::fire (new WeChatUserAuthorized (session ($ sessionKey ), $ isNewSession, $ account ));
7460
7561 return redirect ()->to ($ this ->getTargetUrl ($ request ));
7662 }
7763
78- session ()->forget (' wechat.oauth_user ' );
64+ session ()->forget ($ sessionKey );
7965
80- return $ this -> wechat ->oauth ->scopes ($ scopes )->redirect ($ request ->fullUrl ());
66+ return $ officialAccount ->oauth ->scopes ($ scopes )->redirect ($ request ->fullUrl ());
8167 }
8268
83- Event::fire (new WeChatUserAuthorized (session (' wechat.oauth_user ' ), $ isNewSession ));
69+ Event::fire (new WeChatUserAuthorized (session ($ sessionKey ), $ isNewSession, $ account ));
8470
8571 return $ next ($ request );
8672 }
@@ -99,18 +85,6 @@ protected function getTargetUrl($request)
9985 return $ request ->url ().(empty ($ queries ) ? '' : '? ' .http_build_query ($ queries ));
10086 }
10187
102- /**
103- * Is different scopes.
104- *
105- * @param array $scopes
106- *
107- * @return bool
108- */
109- protected function needReauth ($ scopes )
110- {
111- return 'snsapi_base ' == session ('wechat.oauth_user.original.scope ' ) && in_array ('snsapi_userinfo ' , $ scopes );
112- }
113-
11488 /**
11589 * Detect current user agent type.
11690 *
@@ -120,6 +94,6 @@ protected function needReauth($scopes)
12094 */
12195 protected function isWeChatBrowser ($ request )
12296 {
123- return false !== strpos ($ request ->header ('user_agent ' ), 'MicroMessenger ' );
97+ return false !== strpos ($ request ->header ('user_agent ' , '' ), 'MicroMessenger ' );
12498 }
12599}
0 commit comments