14
14
use Closure ;
15
15
use http \Env \Request ;
16
16
use Illuminate \Support \Arr ;
17
+ use Illuminate \Support \Facades \Session ;
17
18
use Illuminate \Support \Str ;
18
19
use Overtrue \LaravelWeChat \Events \WeChatUserAuthorized ;
19
20
@@ -25,54 +26,58 @@ class OAuthAuthenticate
25
26
/**
26
27
* Handle an incoming request.
27
28
*
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
+ *
32
35
* @return mixed
33
36
*/
34
37
public function handle ($ request , Closure $ next , $ account = 'default ' , $ scope = null , $ type = 'service ' )
35
38
{
36
- $ isNewSession = false ;
37
39
//保证兼容性
38
40
$ class = ('work ' !== $ type ) ? 'wechat ' : 'work ' ;
39
41
$ 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
+
43
47
$ scope = $ scope ?: Arr::get ($ config , 'oauth.scopes ' , ['snsapi_base ' ]);
44
48
45
49
if (is_string ($ scope )) {
46
50
$ scope = array_map ('trim ' , explode (', ' , $ scope ));
47
51
}
48
52
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
+ }
58
57
59
- event (new WeChatUserAuthorized (session ($ sessionKey ), $ isNewSession , $ account ));
58
+ // 是否强制使用 HTTPS 跳转
59
+ $ enforceHttps = Arr::get ($ config , 'oauth.enforce_https ' , false );
60
60
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 ' ));
62
66
}
63
67
64
- session ()->forget ($ sessionKey );
68
+ session ([$ sessionKey => $ user ]);
69
+
70
+ event (new WeChatUserAuthorized (session ($ sessionKey ), true , $ account ));
65
71
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 ));
71
73
}
72
74
73
- event ( new WeChatUserAuthorized ( session ($ sessionKey ), $ isNewSession , $ account ) );
75
+ session ()-> forget ( $ sessionKey );
74
76
75
- return $ next ($ request );
77
+ // 跳转到微信授权页
78
+ return redirect ()->away (
79
+ $ officialAccount ->oauth ->scopes ($ scope )->redirect ($ this ->getRedirectUrl ($ request , $ enforceHttps ))
80
+ );
76
81
}
77
82
78
83
/**
0 commit comments