瀏覽代碼

auth reduce redircet debug 1

zz 6 年之前
父節點
當前提交
b23c5fa3b0
共有 3 個文件被更改,包括 150 次插入23 次删除
  1. 117 0
      app/Http/Controllers/Wap/Oauth/UsersV2Controller.php
  2. 30 23
      app/Http/Middleware/ReadOauth.php
  3. 3 0
      app/Http/Routes/Wap/WapRoutes.php

+ 117 - 0
app/Http/Controllers/Wap/Oauth/UsersV2Controller.php

@@ -0,0 +1,117 @@
+<?php
+
+namespace App\Http\Controllers\Wap\Oauth;
+
+use App\Modules\User\Services\WapReaderPageFissionService;
+use Illuminate\Http\Request;
+use App\Http\Controllers\Controller;
+use Cookie;
+use App\Modules\User\Services\UserService;
+use Log;
+use EasyWeChat\Foundation\Application;
+use DB;
+use Hashids;
+
+class UsersV2Controller extends Controller
+{
+    public function user_oauth(Request $request){
+        Log::info('UsersV2Controller--user_oauth--enter-----------');
+        Log::info($request->all());
+        $url = $request->get('redirect_url');
+        $appid = $request->get('gzh_app_id');
+        $channel_id = $request->get('channel_id');
+        $sid = $request->get('sid');
+        $secter = $this->getAppSecretByAppId($appid);
+        $params['appid'] = $appid;
+        $params['redirect_url'] = $url;
+        $params['channel_id'] = $channel_id;
+        $params['sid'] = $sid;
+        $options = [
+            'app_id'=>$appid,
+            'secret'=>$secter,
+            'oauth' => [
+                'scopes'   => ['snsapi_base'],
+                'callback' => env('AUTH_CALLBACK_URL').'?'.http_build_query($params),
+            ],
+        ];
+        Log::info('$options is:');
+        Log::info($options);
+        $app = new Application($options);
+        return $app->oauth->redirect();
+    }
+
+
+    public function wcCallbackParse(Request $request){
+        Log::info('UsersV2Controller--wcCallbackParse--enter-----------');
+        Log::info($request->all());
+        $appid = $request->get('appid');
+        $secret = $this->getAppSecretByAppId($appid);
+        $url = $request->get('redirect_url');
+        $distribution_channel_id = $request->get('channel_id');
+        $send_order_id = $request->get('sid');
+        $url = urldecode($url);
+        $options = [
+            'app_id'=>$appid,
+            'secret'=>$secret,
+        ];
+        $url_info = parse_url($url);
+        $app = new Application($options);
+
+        $user = $app->oauth->user();
+        $user_data = $user['original'];
+        Log::info('$user_data is: ');
+        Log::info($user_data);
+        if(!isset($user_data['unionid'])){
+            $user_data['unionid'] = $user_data['openid'];
+        }
+        $openid = $user_data['openid'];
+        $unionid = $user_data['unionid'];
+        $user = UserService::getUserByUnionAndChannelId($openid,$distribution_channel_id);
+        !isset($url_info['path']) && $url_info['path'] = '/';
+        if(array_key_exists($distribution_channel_id,specialChannelAuthInfo())){
+            //$url = urldecode($url);
+            //return redirect()->to($this->joinUrl($url));
+        }
+        !$user && $user = $this->createUser($openid,$unionid,$distribution_channel_id,$send_order_id);
+
+        $query = ['auth_uid'=>$user->id,'atime'=>time()];
+        $sign = get_sign($query);
+        $query['sign'] = $sign;
+        $url = sprintf('%s://%s%s?%s',$url_info['scheme'],$url_info['hostname'],$url_info['path'],http_build_query($query));
+        Log::info('wcCallbackParse back url is :');
+        Log::info($url);
+        return redirect()->to($url);
+    }
+
+    private function createUser($openid,$unionid,$distribution_channel_id,$send_order_id){
+        $user =  UserService::addUser(
+            ['openid' => $openid,
+                'unionid' => $unionid,
+                'distribution_channel_id' =>$distribution_channel_id,
+                'send_order_id'=>$send_order_id,
+                'is_new'=>1
+            ]);
+        // 注册动作
+        $action_type = 'Register';
+        $param = [
+            'openid' => $openid,
+            'uid' => isset($user->id)?$user->id:'0',
+        ];
+        UserService::PushUserActionToQueue($action_type,$distribution_channel_id,$param);
+        return $user;
+    }
+
+    /**
+     * 根据apid获取secret
+     * @param $appId
+     * @return string
+     */
+    private function getAppSecretByAppId($appId){
+        $info = DB::table('official_setting')->where('appid',$appId)->select('secret')->first();
+        if($info){
+            return $info->secret;
+        }
+        return '';
+    }
+
+}

+ 30 - 23
app/Http/Middleware/ReadOauth.php

@@ -26,6 +26,7 @@ use Hashids;
 use GuzzleHttp\Client;
 use App\Jobs\SendTexts;
 use DB;
+use EasyWeChat\Foundation\Application;
 
 class ReadOauth
 {
@@ -41,6 +42,7 @@ class ReadOauth
         }
 
         $uid_cookie = Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
+        if($uid_cookie) $uid_cookie = $this->authCallBack($request);
         $h5_scheme = env('H5_SCHEME', 'https');
         $params = $request->except('_url');
         $url = str_replace('http://', $h5_scheme . '://', url()->current() . '?' . http_build_query($params));
@@ -65,49 +67,39 @@ class ReadOauth
                 return response($this->notAccessPage())->header('Content-Type', 'text/html');
             }
         }
+        $uri_send_order_id = 0;
         $uri = $request->input('_url');
+        if (strpos($uri, '/yun/') !== false) {
+            $uri_send_order_id = (int)str_ireplace('/yun/', '', $uri);
+        }
+        $yun = $request->get('yun');
+        $yun && $uri_send_order_id = $yun;
         if (!$uid_cookie && $test == 0) {
-            //$url = str_replace('http://','https://',url()->current())."?".http_build_query($params);
-
-            if (strpos($uri, '/yun/') !== false) {
-                $uri_send_order_id = (int)str_ireplace('/yun/', '', $uri);
+            $params = [];
+            if($uri_send_order_id){
                 Cookie::queue('send_order_id', $uri_send_order_id, env('U_COOKIE_EXPIRE'), null, null, false, false);
             }
-
             $this->share($request);
-
             Cookie::queue('auth_redirect', urlencode($url), env('U_COOKIE_EXPIRE'));
-
-            //$params['redirect_url'] = urlencode(env('PUBLIC_BASE_API').'oauthCallBack');
-            //$params['redirect_url'] = urlencode('http://47.96.174.172:8093/oauthCallBack');
-            $domain = _domain();
-            $params['redirect_url'] = urlencode($h5_scheme . '://' . $domain . '/oauthCallBack');
-
+            $params['redirect_url'] = urlencode($url);
             $params['timestamp'] = time();
-
-            //$office_info = $this->getOfficialAccount(_domain());
-            //$params['gzh_app_id'] = $office_info['appid'];
+            $params['channel_id'] = $distribution_channel_id;
             $params['gzh_app_id'] = env('WECHAT_AUTH_APPID');
-
+            $params['sid'] = $uri_send_order_id;
             $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
 
             $redirect = env('AUTH_URL') . '?' . http_build_query($params);
 
-            $auth_v2_url = $this->authV2($request, $distribution_channel_id);
+            /*$auth_v2_url = $this->authV2($request, $distribution_channel_id);
             if ($auth_v2_url) {
                 return redirect()->to($auth_v2_url);
             }
             $redirect_V2 = $this->auth($request, $distribution_channel_id);
             if ($redirect_V2) {
                 return redirect()->to($redirect_V2);
-            }
+            }*/
             return redirect()->to($redirect);
         }
-        $uri_send_order_id = 0;
-        if (strpos($uri, '/yun/') !== false) {
-            $uri_send_order_id = (int)str_ireplace('/yun/', '', $uri);
-            //Redis::hset('book_read:' . $uid_cookie, 'send_order_id', $uri_send_order_id);
-        }
 
         //个性化推送
         $this->stylePush($request,$uid_cookie,$distribution_channel_id);
@@ -1097,4 +1089,19 @@ class ReadOauth
         WapVisitStatService::specialChannelIdStatsMarkUser($uid,$bid,$send_order_id);
         return ;
     }
+
+    private function authCallBack(Request $request){
+        $auth_uid = $request->get('auth_uid');
+        $atime = $request->get('atime');
+        $sign = $request->get('sign');
+        if(!$auth_uid || !$atime || !$sign) return 0;
+
+        if(!is_numeric($auth_uid) || !is_numeric($atime)) return 0;
+
+        if( (time()-$atime) >20) return 0;
+
+        if(get_sign(compact('auth_uid','atime')) !== $sign ) return 0;
+        Cookie::queue(env('COOKIE_AUTH_WEB_WECHAT'), $auth_uid, env('U_COOKIE_EXPIRE'), null, null, false, false);
+        return $auth_uid;
+    }
 }

+ 3 - 0
app/Http/Routes/Wap/WapRoutes.php

@@ -20,6 +20,9 @@ Route::group(['domain'=>env('PAY_WAP_DOMAIN'),'namespace'=>'App\Http\Controllers
 Route::group(['domain'=>env('OFFICIAL_AUTH_FOMAIN'),'namespace'=>'App\Http\Controllers\Wap'],function(){
     Route::any('/user_oauth','Oauth\UsersController@user_oauth');
     Route::get('/wxAuthCallBack','Oauth\UsersController@wcCallbackParse');
+
+    Route::any('/user_oauth_v2','Oauth\UsersV2Controller@user_oauth');
+    Route::get('/wxAuthCallBackv2','Oauth\UsersV2Controller@wcCallbackParse');
 });
 
 Route::group(['domain'=>env('HELP_DOMAIN'),'namespace'=>'App\Http\Controllers\Wap\Help'],function(){