<?php /* * This file is part of the overtrue/wechat. * * (c) overtrue <i@overtrue.me> * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ /** * Guard.php. * * Part of Overtrue\WeChat. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. * * @author mingyoung <mingyoungcheung@gmail.com> * @author lixiao <leonlx126@gmail.com> * @copyright 2016 * * @see https://github.com/overtrue * @see http://overtrue.me */ namespace EasyWeChat\OpenPlatform; use EasyWeChat\Server\Guard as ServerGuard; use EasyWeChat\Support\Collection; use EasyWeChat\Support\Log; use Symfony\Component\HttpFoundation\Response; class Guard extends ServerGuard { const EVENT_AUTHORIZED = 'authorized'; const EVENT_UNAUTHORIZED = 'unauthorized'; const EVENT_UPDATE_AUTHORIZED = 'updateauthorized'; const EVENT_COMPONENT_VERIFY_TICKET = 'component_verify_ticket'; /** * Event handlers. * * @var \EasyWeChat\Support\Collection */ protected $handlers; /** * Set handlers. * * @param array $handlers */ public function setHandlers(array $handlers) { $this->handlers = new Collection($handlers); return $this; } /** * Get handlers. * * @return \EasyWeChat\Support\Collection */ public function getHandlers() { return $this->handlers; } /** * Get handler. * * @param string $type * * @return \EasyWeChat\OpenPlatform\EventHandlers\EventHandler|null */ public function getHandler($type) { return $this->handlers->get($type); } /** * {@inheritdoc} */ public function serve() { $message = $this->getMessage(); // Handle Messages. if (isset($message['MsgType'])) { return parent::serve(); } Log::debug('OpenPlatform Request received:', [ 'Method' => $this->request->getMethod(), 'URI' => $this->request->getRequestUri(), 'Query' => $this->request->getQueryString(), 'Protocal' => $this->request->server->get('SERVER_PROTOCOL'), 'Content' => $this->request->getContent(), ]); // If sees the `auth_code` query parameter in the url, that is, // authorization is successful and it calls back, meanwhile, an // `authorized` event, which also includes the auth code, is sent // from WeChat, and that event will be handled. if ($this->request->get('auth_code')) { return new Response(self::SUCCESS_EMPTY_RESPONSE); } $this->handleEventMessage($message); return new Response(self::SUCCESS_EMPTY_RESPONSE); } /** * Handle event message. * * @param array $message */ protected function handleEventMessage(array $message) { Log::debug('OpenPlatform Event Message detail:', $message); $message = new Collection($message); $infoType = $message->get('InfoType'); if ($handler = $this->getHandler($infoType)) { $handler->handle($message); } else { Log::notice("No existing handler for '{$infoType}'."); } if ($messageHandler = $this->getMessageHandler()) { call_user_func_array($messageHandler, [$message]); } } }