@@ -24,11 +24,10 @@ class OAuthAuthenticate
2424    /** 
2525     * Handle an incoming request. 
2626     * 
27-      * @param \Illuminate\Http\Request $request 
28-      * @param \Closure                 $next 
29-      * @param string|null              $scope 
30-      * @param string|null              $type    : service(服务号), subscription(订阅号), work(企业微信) 
31-      * 
27+      * @param  \Illuminate\Http\Request  $request 
28+      * @param  \Closure  $next 
29+      * @param  string|null  $scope 
30+      * @param  string|null  $type : service(服务号), subscription(订阅号), work(企业微信) 
3231     * @return mixed 
3332     */ 
3433    public  function  handle ($ request , Closure   $ next , $ account  = 'default ' , $ scope  = null , $ type  = 'service ' )
@@ -37,9 +36,9 @@ public function handle($request, Closure $next, $account = 'default', $scope = n
3736        //保证兼容性 
3837        $ class  = ('work '  !== $ type ) ? 'wechat '  : 'work ' ;
3938        $ 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 ));
39+         $ sessionKey  = \sprintf ($ class .  '.oauth_user.%s ' , $ account );
40+         $ config  = config (\sprintf ('wechat. '  .  $ prefix .  '.%s ' , $ account ), []);
41+         $ officialAccount  = app (\sprintf ('wechat. '  .  $ prefix .  '.%s ' , $ account ));
4342        $ scope  = $ scope  ?: Arr::get ($ config , 'oauth.scopes ' , ['snsapi_base ' ]);
4443
4544        if  (is_string ($ scope )) {
@@ -49,18 +48,25 @@ public function handle($request, Closure $next, $account = 'default', $scope = n
4948        $ session  = session ($ sessionKey , []);
5049
5150        if  (!$ session ) {
51+             // 是否强制使用 HTTPS 跳转 
52+             $ enforceHttps  = Arr::get ($ config , 'oauth.enforce_https ' , false );
53+ 
5254            if  ($ request ->has ('code ' )) {
5355                session ([$ sessionKey  => $ officialAccount ->oauth ->user () ?? []]);
5456                $ isNewSession  = true ;
5557
5658                event (new  WeChatUserAuthorized (session ($ sessionKey ), $ isNewSession , $ account ));
5759
58-                 return  redirect ()->to ($ this  ->getTargetUrl ($ request ));
60+                 return  redirect ()->to ($ this  ->getTargetUrl ($ request,  $ enforceHttps  ));
5961            }
6062
6163            session ()->forget ($ sessionKey );
6264
63-             return  $ officialAccount ->oauth ->scopes ($ scope )->redirect ($ request ->fullUrl ());
65+             // 跳转到微信授权页 
66+             return  redirect ()->away (
67+                 $ officialAccount ->oauth ->scopes ($ scope )
68+                                        ->redirect ($ this  ->getRedirectUrl ($ request , $ enforceHttps ))
69+             );
6470        }
6571
6672        event (new  WeChatUserAuthorized (session ($ sessionKey ), $ isNewSession , $ account ));
@@ -71,14 +77,37 @@ public function handle($request, Closure $next, $account = 'default', $scope = n
7177    /** 
7278     * Build the target business url. 
7379     * 
74-      * @param Request $request 
75-      * 
80+      * @param  \Illuminate\Http\ Request   $request 
81+      * @param  bool  $https  
7682     * @return string 
7783     */ 
78-     protected  function  getTargetUrl ($ request )
84+     protected  function  getTargetUrl ($ request,  $ https  =  false )
7985    {
8086        $ queries  = Arr::except ($ request ->query (), ['code ' , 'state ' ]);
87+         $ url  = $ request ->url ();
88+ 
89+         if  ($ https  && Str::startsWith ($ url , 'http:// ' )) {
90+             $ url  = Str::replaceFirst ('http ' , 'https ' , $ url );
91+         }
92+ 
93+         return  $ url  . (empty ($ queries ) ? ''  : '? '  . http_build_query ($ queries ));
94+     }
95+ 
96+     /** 
97+      * generate the redirect url 
98+      * 
99+      * @param  \Illuminate\Http\Request  $request 
100+      * @param  bool  $https 
101+      * @return string 
102+      */ 
103+     protected  function  getRedirectUrl ($ request , $ https  = false )
104+     {
105+         if  (!$ https ) {
106+             return  $ request ->fullUrl ();
107+         }
81108
82-         return  $ request ->url ().(empty ($ queries ) ? ''  : '? ' .http_build_query ($ queries ));
109+         return  Str::startsWith ($ request ->fullUrl (), 'http:// ' )
110+             ? Str::replaceFirst ('http ' , 'https ' , $ request ->fullUrl ())
111+             : $ request ->fullUrl ();
83112    }
84113}
0 commit comments