1414use Closure ;
1515use http \Env \Request ;
1616use Illuminate \Support \Arr ;
17+ use Illuminate \Support \Facades \Session ;
1718use Illuminate \Support \Str ;
1819use Overtrue \LaravelWeChat \Events \WeChatUserAuthorized ;
1920
@@ -25,54 +26,58 @@ class OAuthAuthenticate
2526 /**
2627 * Handle an incoming request.
2728 *
28- * @param \Illuminate\Http\Request $request
29- * @param \Closure $next
30- * @param string|null $scope
31- * @param string|null $type : service(服务号), subscription(订阅号), work(企业微信)
29+ * @param \Illuminate\Http\Request $request
30+ * @param \Closure $next
31+ * @param string $account
32+ * @param string|null $scope
33+ * @param string|null $type : service(服务号), subscription(订阅号), work(企业微信)
34+ *
3235 * @return mixed
3336 */
3437 public function handle ($ request , Closure $ next , $ account = 'default ' , $ scope = null , $ type = 'service ' )
3538 {
36- $ isNewSession = false ;
3739 //保证兼容性
3840 $ class = ('work ' !== $ type ) ? 'wechat ' : 'work ' ;
3941 $ prefix = ('work ' !== $ type ) ? 'official_account ' : 'work ' ;
40- $ sessionKey = \sprintf ($ class . '.oauth_user.%s ' , $ account );
41- $ config = config (\sprintf ('wechat. ' . $ prefix . '.%s ' , $ account ), []);
42- $ officialAccount = app (\sprintf ('wechat. ' . $ prefix . '.%s ' , $ account ));
42+ $ sessionKey = \sprintf ('%s.oauth_user.%s ' , $ class , $ account );
43+ $ service = \sprintf ('wechat.%s.%s ' , $ prefix , $ account );
44+ $ config = config ($ service , []);
45+ $ officialAccount = app ($ service );
46+
4347 $ scope = $ scope ?: Arr::get ($ config , 'oauth.scopes ' , ['snsapi_base ' ]);
4448
4549 if (is_string ($ scope )) {
4650 $ scope = array_map ('trim ' , explode (', ' , $ scope ));
4751 }
4852
49- $ session = session ($ sessionKey , []);
50-
51- if (!$ session ) {
52- // 是否强制使用 HTTPS 跳转
53- $ enforceHttps = Arr::get ($ config , 'oauth.enforce_https ' , false );
54-
55- if ($ request ->has ('code ' )) {
56- session ([$ sessionKey => $ officialAccount ->oauth ->user () ?? []]);
57- $ isNewSession = true ;
53+ if (Session::has ($ sessionKey )) {
54+ event (new WeChatUserAuthorized (session ($ sessionKey ), false , $ account ));
55+ return $ next ($ request );
56+ }
5857
59- event (new WeChatUserAuthorized (session ($ sessionKey ), $ isNewSession , $ account ));
58+ // 是否强制使用 HTTPS 跳转
59+ $ enforceHttps = Arr::get ($ config , 'oauth.enforce_https ' , false );
6060
61- return redirect ()->to ($ this ->getTargetUrl ($ request , $ enforceHttps ));
61+ if ($ request ->has ('code ' )) {
62+ if (\is_callable ($ officialAccount ->oauth , 'user ' )) {
63+ $ user = $ officialAccount ->oauth ->user ();
64+ } else {
65+ $ user = $ officialAccount ->oauth ->userFromCode ($ request ->query ('code ' ));
6266 }
6367
64- session ()->forget ($ sessionKey );
68+ session ([$ sessionKey => $ user ]);
69+
70+ event (new WeChatUserAuthorized (session ($ sessionKey ), true , $ account ));
6571
66- // 跳转到微信授权页
67- return redirect ()->away (
68- $ officialAccount ->oauth ->scopes ($ scope )
69- ->redirect ($ this ->getRedirectUrl ($ request , $ enforceHttps ))
70- );
72+ return redirect ()->to ($ this ->getTargetUrl ($ request , $ enforceHttps ));
7173 }
7274
73- event ( new WeChatUserAuthorized ( session ($ sessionKey ), $ isNewSession , $ account ) );
75+ session ()-> forget ( $ sessionKey );
7476
75- return $ next ($ request );
77+ // 跳转到微信授权页
78+ return redirect ()->away (
79+ $ officialAccount ->oauth ->scopes ($ scope )->redirect ($ this ->getRedirectUrl ($ request , $ enforceHttps ))
80+ );
7681 }
7782
7883 /**
0 commit comments