diff --git a/app/Http/Home/Controllers/AccountController.php b/app/Http/Home/Controllers/AccountController.php index 8dc2d285..888deac1 100644 --- a/app/Http/Home/Controllers/AccountController.php +++ b/app/Http/Home/Controllers/AccountController.php @@ -4,6 +4,7 @@ namespace App\Http\Home\Controllers; use App\Http\Home\Services\Account as AccountService; use App\Services\Logic\Account\EmailUpdate as EmailUpdateService; +use App\Services\Logic\Account\OAuthProvider as OAuthProviderService; use App\Services\Logic\Account\PasswordReset as PasswordResetService; use App\Services\Logic\Account\PasswordUpdate as PasswordUpdateService; use App\Services\Logic\Account\PhoneUpdate as PhoneUpdateService; @@ -62,8 +63,13 @@ class AccountController extends Controller $captcha = $service->getSettings('captcha'); + $service = new OAuthProviderService(); + + $oauthProvider = $service->handle(); + $returnUrl = $this->request->getHTTPReferer(); + $this->view->setVar('oauth_provider', $oauthProvider); $this->view->setVar('return_url', $returnUrl); $this->view->setVar('captcha', $captcha); } diff --git a/app/Http/Home/Controllers/ConnectController.php b/app/Http/Home/Controllers/ConnectController.php index d5dc0a74..49da1270 100644 --- a/app/Http/Home/Controllers/ConnectController.php +++ b/app/Http/Home/Controllers/ConnectController.php @@ -52,20 +52,7 @@ class ConnectController extends Controller */ public function qqCallbackAction() { - $service = new ConnectService(); - - if ($this->authUser->id > 0) { - - $service->bindUser(ConnectModel::PROVIDER_QQ); - - return $this->response->redirect(['for' => 'home.uc.account']); - } - - $captcha = $service->getSettings('captcha'); - - $this->view->pick('connect/bind'); - $this->view->setVar('captcha', $captcha); - $this->view->setVar('provider', ConnectModel::PROVIDER_QQ); + $this->handleCallback(ConnectModel::PROVIDER_QQ); } /** @@ -73,20 +60,7 @@ class ConnectController extends Controller */ public function weixinCallbackAction() { - $service = new ConnectService(); - - if ($this->authUser->id > 0) { - - $service->bindUser(ConnectModel::PROVIDER_WEIXIN); - - return $this->response->redirect(['for' => 'home.uc.account']); - } - - $captcha = $service->getSettings('captcha'); - - $this->view->pick('connect/bind'); - $this->view->setVar('captcha', $captcha); - $this->view->setVar('provider', ConnectModel::PROVIDER_QQ); + $this->handleCallback(ConnectModel::PROVIDER_WEIXIN); } /** @@ -94,20 +68,7 @@ class ConnectController extends Controller */ public function weiboCallbackAction() { - $service = new ConnectService(); - - if ($this->authUser->id > 0) { - - $service->bindUser(ConnectModel::PROVIDER_WEIBO); - - return $this->response->redirect(['for' => 'home.uc.account']); - } - - $captcha = $service->getSettings('captcha'); - - $this->view->pick('connect/bind'); - $this->view->setVar('captcha', $captcha); - $this->view->setVar('provider', ConnectModel::PROVIDER_QQ); + $this->handleCallback(ConnectModel::PROVIDER_WEIBO); } /** @@ -127,7 +88,7 @@ class ConnectController extends Controller $service->bindLogin(); - $location = $this->url->get(['for' => 'home.uc.index']); + $location = $this->url->get(['for' => 'home.uc.account']); return $this->jsonSuccess(['location' => $location]); } @@ -141,9 +102,38 @@ class ConnectController extends Controller $service->bindRegister(); - $location = $this->url->get(['for' => 'home.uc.index']); + $location = $this->url->get(['for' => 'home.uc.account']); return $this->jsonSuccess(['location' => $location]); } + protected function handleCallback($provider) + { + $code = $this->request->getQuery('code'); + $state = $this->request->getQuery('state'); + + $service = new ConnectService(); + + $openUser = $service->getOpenUserInfo($code, $state, $provider); + + $connect = $service->getConnectRelation($openUser['id'], $provider); + + if ($connect && $connect->deleted == 0) { + if ($this->authUser->id > 0) { + $service->bindUser($openUser, $provider); + return $this->response->redirect(['for' => 'home.uc.account']); + } else { + $service->authLogin($connect); + return $this->response->redirect(['for' => 'home.index']); + } + } + + $captcha = $service->getSettings('captcha'); + + $this->view->pick('connect/bind'); + $this->view->setVar('captcha', $captcha); + $this->view->setVar('provider', $provider); + $this->view->setVar('open_user', $openUser); + } + } diff --git a/app/Http/Home/Controllers/OrderController.php b/app/Http/Home/Controllers/OrderController.php index acf797a8..6cd6e310 100644 --- a/app/Http/Home/Controllers/OrderController.php +++ b/app/Http/Home/Controllers/OrderController.php @@ -7,6 +7,7 @@ use App\Services\Logic\Order\OrderCancel as OrderCancelService; use App\Services\Logic\Order\OrderConfirm as OrderConfirmService; use App\Services\Logic\Order\OrderCreate as OrderCreateService; use App\Services\Logic\Order\OrderInfo as OrderInfoService; +use App\Services\Logic\Order\PayProvider as PayProviderService; use Phalcon\Mvc\Dispatcher; use Phalcon\Mvc\View; @@ -82,6 +83,10 @@ class OrderController extends Controller { $sn = $this->request->getQuery('sn', 'string'); + $service = new PayProviderService(); + + $payProvider = $service->handle(); + $service = new OrderInfoService(); $order = $service->handle($sn); @@ -90,6 +95,7 @@ class OrderController extends Controller $this->response->redirect(['for' => 'home.uc.orders']); } + $this->view->setVar('pay_provider', $payProvider); $this->view->setVar('order', $order); } diff --git a/app/Http/Home/Controllers/UserConsoleController.php b/app/Http/Home/Controllers/UserConsoleController.php index fcd07636..2b56c475 100644 --- a/app/Http/Home/Controllers/UserConsoleController.php +++ b/app/Http/Home/Controllers/UserConsoleController.php @@ -2,6 +2,7 @@ namespace App\Http\Home\Controllers; +use App\Services\Logic\Account\OAuthProvider as OAuthProviderService; use App\Services\Logic\User\Console\AccountInfo as AccountInfoService; use App\Services\Logic\User\Console\ConnectDelete as ConnectDeleteService; use App\Services\Logic\User\Console\ConnectList as ConnectListService; @@ -69,6 +70,10 @@ class UserConsoleController extends Controller $account = $service->handle(); + $service = new OAuthProviderService(); + + $oauthProvider = $service->handle(); + $service = new ConnectListService(); $connects = $service->handle(); @@ -83,9 +88,10 @@ class UserConsoleController extends Controller $this->view->pick('user/console/account_password'); } + $this->view->setVar('oauth_provider', $oauthProvider); + $this->view->setVar('connects', $connects); $this->view->setVar('captcha', $captcha); $this->view->setVar('account', $account); - $this->view->setVar('connects', $connects); } /** diff --git a/app/Http/Home/Services/Connect.php b/app/Http/Home/Services/Connect.php index 5cd53a95..15816c1f 100644 --- a/app/Http/Home/Services/Connect.php +++ b/app/Http/Home/Services/Connect.php @@ -2,14 +2,15 @@ namespace App\Http\Home\Services; -use App\Library\OAuth\QQ as QQAuth; -use App\Library\OAuth\WeiBo as WeiBoAuth; -use App\Library\OAuth\WeiXin as WeiXinAuth; use App\Models\Connect as ConnectModel; use App\Models\User as UserModel; use App\Repos\Connect as ConnectRepo; use App\Repos\User as UserRepo; +use App\Services\Auth\Home as AuthService; use App\Services\Logic\Account\Register as RegisterService; +use App\Services\OAuth\QQ as QQAuth; +use App\Services\OAuth\WeiBo as WeiBoAuth; +use App\Services\OAuth\WeiXin as WeiXinAuth; use App\Validators\Account as AccountValidator; class Connect extends Service @@ -19,22 +20,32 @@ class Connect extends Service { $post = $this->request->getPost(); + $auth = $this->getConnectAuth($post['provider']); + + $auth->checkState($post['state']); + $validator = new AccountValidator(); $user = $validator->checkUserLogin($post['account'], $post['password']); - $openUser = $this->getOpenUserInfo($post['code'], $post['stats'], $post['provider']); + $openUser = json_decode($post['open_user'], true); - $this->handleBindRelation($user, $openUser, $post['provider']); + $this->handleConnectRelation($user, $openUser, $post['provider']); - $this->auth->saveAuthInfo($user); + $auth = $this->getAppAuth(); + + $auth->saveAuthInfo($user); } public function bindRegister() { $post = $this->request->getPost(); - $openUser = $this->getOpenUserInfo($post['code'], $post['state'], $post['provider']); + $auth = $this->getConnectAuth($post['provider']); + + $auth->checkState($post['state']); + + $openUser = json_decode($post['open_user'], true); $registerService = new RegisterService(); @@ -44,31 +55,59 @@ class Connect extends Service $user = $userRepo->findById($account->id); - $this->handleBindRelation($user, $openUser, $post['provider']); + $this->handleConnectRelation($user, $openUser, $post['provider']); - $this->auth->saveAuthInfo($user); + $auth = $this->getAppAuth(); + + $auth->saveAuthInfo($user); } - public function bindUser($provider) + public function bindUser($openUser, $provider) { - $code = $this->request->getQuery('code', 'trim'); - $state = $this->request->getQuery('state', 'trim'); - $user = $this->getLoginUser(); - $openUser = $this->getOpenUserInfo($code, $state, $provider); + $this->handleConnectRelation($user, $openUser, $provider); + } - $this->handleBindRelation($user, $openUser, $provider); + public function authLogin(ConnectModel $connect) + { + $userRepo = new UserRepo(); + + $user = $userRepo->findById($connect->user_id); + + $auth = $this->getAppAuth(); + + $auth->saveAuthInfo($user); } public function getAuthorizeUrl($provider) { - $auth = $this->getAuth($provider); + $auth = $this->getConnectAuth($provider); return $auth->getAuthorizeUrl(); } - public function getAuth($provider) + public function getOpenUserInfo($code, $state, $provider) + { + $auth = $this->getConnectAuth($provider); + + $auth->checkState($state); + + $token = $auth->getAccessToken($code); + + $openId = $auth->getOpenId($token); + + return $auth->getUserInfo($token, $openId); + } + + public function getConnectRelation($openId, $provider) + { + $connectRepo = new ConnectRepo(); + + return $connectRepo->findByOpenId($openId, $provider); + } + + public function getConnectAuth($provider) { $auth = null; @@ -124,20 +163,17 @@ class Connect extends Service ); } - protected function getOpenUserInfo($code, $state, $provider) + protected function getAppAuth() { - $auth = $this->getAuth($provider); + /** + * @var $auth AuthService + */ + $auth = $this->getDI()->get('auth'); - $auth->checkState($state); - - $token = $auth->getAccessToken($code); - - $openId = $auth->getOpenId($token); - - return $auth->getUserInfo($token, $openId); + return $auth; } - protected function handleBindRelation(UserModel $user, array $openUser, $provider) + protected function handleConnectRelation(UserModel $user, array $openUser, $provider) { $connectRepo = new ConnectRepo(); @@ -145,6 +181,11 @@ class Connect extends Service if ($connect) { + if (time() - $connect->update_time > 86400) { + $connect->open_name = $openUser['name']; + $connect->open_avatar = $openUser['avatar']; + } + if ($connect->deleted == 1) { $connect->deleted = 0; $connect->update(); diff --git a/app/Http/Home/Views/account/login.volt b/app/Http/Home/Views/account/login.volt index d1066422..34641c28 100644 --- a/app/Http/Home/Views/account/login.volt +++ b/app/Http/Home/Views/account/login.volt @@ -28,9 +28,15 @@ 忘记密码