* * @copyright Copyright 2013, Union of RAD (http://union-of-rad.org) * @license http://opensource.org/licenses/bsd-license.php The BSD License */ use lithium\core\ErrorHandler; use lithium\action\Response; use lithium\net\http\Media; use app\extensions\util\HttpUserAgentUtil; ErrorHandler::apply('lithium\\action\\Dispatcher::run', array(), function ($info, $params) { $response = new Response(array('request' => $params['request'], 'status' => $info['exception']->getCode())); // 根据抛出来的错误类型而进行处理, 这里分开发和生产环境, 方便开发环境进行异常处理 $exception = $info['exception']; $template = 'production'; $layout = 'default'; $mobile = false; if (!empty($_SERVER['HTTP_USER_AGENT']) && HttpUserAgentUtil::is_mobile($_SERVER['HTTP_USER_AGENT'])) { $mobile = true; } $environment = environment_config(); if ($environment['environment'] == 'production') { if ($mobile) { $layout = 'mobile'; $template = 'mobile'; } } else { $layout = 'error'; $template = 'development'; } if ($exception instanceof \app\extensions\core\exception\WeixinLoginException) { $template = $environment['environment'] == 'production' ? 'business/weixin_login_failed' : 'development'; }
/** * oauth2 绑定用户, 这步主要是想通过加密的token获得用户uid. */ public function bind() { $token = rawurldecode($this->request->query['token']); $weixin_user_id = EncryptUtil::decrypt($token, WeixinUsers::KEY_ENCRYPT); if (!is_numeric($weixin_user_id)) { // 解密失败 throw new DispatchException('Weixin token descrypt failed.'); } // $key = WeixinUsers::CACHE_KEY_TOKEN_PREFIX . $weixin_user_id; // $cache = CacheUtil::cache_get($key); // if (empty($cache)) { // // 该链接已过期 // throw new DispatchException('Weixin token expired.'); // } // CacheUtil::cache_delete($key); $ref_url = UrlUtil::get_safe_redirect_url($this->request->query['ref_url']); $ref_url = empty($ref_url) ? urlencode(SYS_PATH . '/mobile') : $ref_url; $url = HttpUserAgentUtil::get_weixin_oauth2_url($weixin_user_id, $ref_url); return $this->redirect($url, array('exit' => true)); }
protected function _init() { parent::_init(); // 判断其是否从 mobile 端请求过来 if (!empty($_SERVER['HTTP_USER_AGENT']) && HttpUserAgentUtil::is_mobile($_SERVER['HTTP_USER_AGENT'])) { $this->_mobile = true; } }
<?php use app\services\OauthWeixinUserService; use app\extensions\util\HttpUserAgentUtil; use lithium\action\Response; use app\services\UserService; use lithium\net\http\Router; use lithium\action\Dispatcher; /** * 拦截登录过滤器, 检测页面访问权限. */ Dispatcher::applyFilter('run', function ($self, $params, $chain) { $router = Router::parse($params['request']); if (empty($router->params)) { return $chain->next($self, $params, $chain); } else { $router = $router->params; } if (UserService::check_auth($router)) { // 如果是微信里的页面, 则需要注入当前的微信用户信息 if (HttpUserAgentUtil::is_weixin()) { OauthWeixinUserService::set_current_oauth_user(); } return $chain->next($self, $params, $chain); } else { $login_url = SYS_PATH . '/user/login?ref_url=' . urldecode(current_url()); return new Response(array('location' => $login_url)); } });