1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-27 21:10:24 +08:00

初步完成开放登录,待线上测试7

This commit is contained in:
xiaochong0302 2020-12-07 10:39:51 +08:00
parent 4fa02f34bb
commit bf84732375
16 changed files with 222 additions and 92 deletions

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
}
/**

View File

@ -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();

View File

@ -28,9 +28,15 @@
<a class="forget-link" href="{{ url({'for':'home.account.forget_pwd'}) }}">忘记密码</a>
</div>
<div class="oauth">
<a class="layui-icon layui-icon-login-qq login-qq" href="{{ url({'for':'home.oauth.qq'}) }}"></a>
<a class="layui-icon layui-icon-login-wechat login-wechat" href="{{ url({'for':'home.oauth.weixin'}) }}"></a>
<a class="layui-icon layui-icon-login-weibo login-weibo" href="{{ url({'for':'home.oauth.weibo'}) }}"></a>
{% if oauth_provider.qq.enabled == 1 %}
<a class="layui-icon layui-icon-login-qq login-qq" href="{{ url({'for':'home.oauth.qq'}) }}"></a>
{% endif %}
{% if oauth_provider.weixin.enabled == 1 %}
<a class="layui-icon layui-icon-login-wechat login-wechat" href="{{ url({'for':'home.oauth.weixin'}) }}"></a>
{% endif %}
{% if oauth_provider.weibo.enabled == 1 %}
<a class="layui-icon layui-icon-login-weibo login-weibo" href="{{ url({'for':'home.oauth.weibo'}) }}"></a>
{% endif %}
</div>
</div>

View File

@ -15,6 +15,7 @@
<input type="hidden" name="provider" value="{{ provider }}">
<input type="hidden" name="code" value="{{ request.get('code') }}">
<input type="hidden" name="state" value="{{ request.get('state') }}">
<input type="hidden" name="open_user" value='{{ open_user|json_encode }}'>
</div>
</div>
</form>

View File

@ -23,6 +23,7 @@
<input type="hidden" name="provider" value="{{ provider }}">
<input type="hidden" name="code" value="{{ request.get('code') }}">
<input type="hidden" name="state" value="{{ request.get('state') }}">
<input type="hidden" name="open_user" value='{{ open_user|json_encode }}'>
<input id="cv-app-id" type="hidden" value="{{ captcha.app_id }}">
<input id="cv-ticket" type="hidden" name="ticket">
<input id="cv-rand" type="hidden" name="rand">

View File

@ -17,8 +17,12 @@
支付金额:<span class="amount">{{ '¥%0.2f'|format(order.amount) }}</span>
</div>
<div class="channel">
<a class="alipay btn-pay" href="javascript:" data-channel="alipay">{{ image('home/img/alipay.png') }}</a>
<a class="wxpay btn-pay" href="javascript:" data-channel="wxpay">{{ image('home/img/wxpay.png') }}</a>
{% if pay_provider.alipay.enabled == 1 %}
<a class="alipay btn-pay" href="javascript:" data-channel="alipay">{{ image('home/img/alipay.png') }}</a>
{% endif %}
{% if pay_provider.wxpay.enabled == 1 %}
<a class="wxpay btn-pay" href="javascript:" data-channel="wxpay">{{ image('home/img/wxpay.png') }}</a>
{% endif %}
</div>
<div class="footer">
<span class="tips">友情提示请在12小时内完成支付有问题请联系客服</span>

View File

@ -89,9 +89,15 @@
{% endif %}
<div class="connect-tips">支持绑定的第三方帐号</div>
<div class="oauth-list">
<a class="layui-icon layui-icon-login-qq login-qq" href="{{ url({'for':'home.oauth.qq'}) }}"></a>
<a class="layui-icon layui-icon-login-wechat login-wechat" href="{{ url({'for':'home.oauth.weixin'}) }}"></a>
<a class="layui-icon layui-icon-login-weibo login-weibo" href="{{ url({'for':'home.oauth.weibo'}) }}"></a>
{% if oauth_provider.qq.enabled == 1 %}
<a class="layui-icon layui-icon-login-qq login-qq" href="{{ url({'for':'home.oauth.qq'}) }}"></a>
{% endif %}
{% if oauth_provider.qq.enabled == 1 %}
<a class="layui-icon layui-icon-login-wechat login-wechat" href="{{ url({'for':'home.oauth.weixin'}) }}"></a>
{% endif %}
{% if oauth_provider.qq.enabled == 1 %}
<a class="layui-icon layui-icon-login-weibo login-weibo" href="{{ url({'for':'home.oauth.weibo'}) }}"></a>
{% endif %}
</div>
</div>
</div>

View File

@ -0,0 +1,23 @@
<?php
namespace App\Services\Logic\Account;
use App\Services\Logic\Service;
class OAuthProvider extends Service
{
public function handle()
{
$weixin = $this->getSettings('oauth.weixin');
$weibo = $this->getSettings('oauth.weibo');
$qq = $this->getSettings('oauth.qq');
return [
'weixin' => ['enabled' => $weixin['enabled']],
'weibo' => ['enabled' => $weibo['enabled']],
'qq' => ['enabled' => $qq['enabled']],
];
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Services\Logic\Order;
use App\Services\Logic\Service;
class PayProvider extends Service
{
public function handle()
{
$alipay = $this->getSettings('pay.alipay');
$wxpay = $this->getSettings('pay.wxpay');
return [
'alipay' => ['enabled' => $alipay['enabled']],
'wxpay' => ['enabled' => $wxpay['enabled']],
];
}
}

View File

@ -1,18 +1,37 @@
<?php
namespace App\Library;
namespace App\Services;
use GuzzleHttp\Client as HttpClient;
use Phalcon\Crypt;
use Phalcon\Di;
abstract class OAuth
abstract class OAuth extends Service
{
/**
* @var string
*/
protected $clientId;
/**
* @var string
*/
protected $clientSecret;
/**
* @var string
*/
protected $redirectUri;
/**
* @var string
*/
protected $accessToken;
/**
* @var string
*/
protected $openId;
public function __construct($clientId, $clientSecret, $redirectUri)

View File

@ -1,8 +1,8 @@
<?php
namespace App\Library\OAuth;
namespace App\Services\OAuth;
use App\Library\OAuth;
use App\Services\OAuth;
class QQ extends OAuth
{
@ -18,8 +18,8 @@ class QQ extends OAuth
'client_id' => $this->clientId,
'redirect_uri' => $this->redirectUri,
'state' => $this->getState(),
'scope' => 'get_user_info',
'response_type' => 'code',
'scope' => 'get_user_info',
];
return self::AUTHORIZE_URL . '?' . http_build_query($params);

View File

@ -1,8 +1,8 @@
<?php
namespace App\Library\OAuth;
namespace App\Services\OAuth;
use App\Library\OAuth;
use App\Services\OAuth;
class WeiBo extends OAuth
{
@ -78,9 +78,9 @@ class WeiBo extends OAuth
throw new \Exception("Fetch User Info Failed:{$response}");
}
$userInfo['id'] = $this->openId;
$userInfo['id'] = $data['id'];
$userInfo['name'] = $data['name'];
$userInfo['avatar'] = $data['avatar_large'];
$userInfo['avatar'] = $data['profile_image_url'];
return $userInfo;
}

View File

@ -1,8 +1,8 @@
<?php
namespace App\Library\OAuth;
namespace App\Services\OAuth;
use App\Library\OAuth;
use App\Services\OAuth;
class WeiXin extends OAuth
{
@ -17,8 +17,8 @@ class WeiXin extends OAuth
'appid' => $this->clientId,
'redirect_uri' => $this->redirectUri,
'state' => $this->getState(),
'scope' => 'snsapi_login',
'response_type' => 'code',
'scope' => 'snsapi_login',
];
return self::AUTHORIZE_URL . '?' . http_build_query($params);