/** * Создать пользователя и подписать его на услугу * Вернуть новый счет с этим пользователем * * @return Account */ private function _makeAccountWithSubscribedUser($daysShift = 1) { $user = $this->helper->makeUser(); $date = new DateTime("{$daysShift}days"); $service = Doctrine::getTable('Service')->findOneByKeyword(Service::SERVICE_SMS); // Подписка $subscription = new ServiceSubscription(); $subscription->setUser($user); $subscription->setService($service); $subscription->setSubscribedTill($date->format('Y-m-d 00:00:00')); $subscription->save(); return $this->helper->makeAccount($user); }
/** * Авторизоваться * Проверяем 2 ситуации: * - У пользователя есть подписка на услугу iphone, и она просрочена * - У пользователя есть действующая подписка */ public function testAuthentificatedAndSubscribed() { $plan = array(array('subscribed_till' => date('Y-m-d', strtotime('- 2 days')), 'status_code' => 402, 'element' => array('selector' => 'response error', 'contents' => 'Payment required'), 'is_authenticated' => false), array('subscribed_till' => date('Y-m-d', strtotime('+ 2 days')), 'status_code' => 200, 'element' => array('selector' => 'response message', 'contents' => 'Authentificated'), 'is_authenticated' => true)); $expected = array('user_name' => "Name", 'user_login' => "Login", 'password' => "ValidPassword"); $user = $this->helper->makeUser($expected); $service = new Service(); $service->keyword = Service::SERVICE_IPHONE; $service->price = 100; $service->name = "Уникальное имя услуги " . uniqid(); $service->save(); foreach ($plan as $case) { if (!isset($subscription)) { $subscription = new ServiceSubscription(); $subscription->service_id = $service->id; $subscription->user_id = $user->getId(); } $subscription->subscribed_till = $case['subscribed_till']; $subscription->save(); $requestParams = array('login' => $expected['user_login'], 'password' => $expected['password']); $this->browser->post($this->generateUrl("auth"), $requestParams)->with("request")->begin()->isParameter("module", "myAuth")->isParameter("action", "login")->end()->with("response")->begin()->isStatusCode($case['status_code'])->checkElement($case['element']['selector'], $case['element']['contents'])->end()->with("user")->isAuthenticated($case['is_authenticated']); } }
/** * /robokassa/success * Экшн для редиректа в случае успешного прохождения платежа * * @param sfWebRequest $request */ public function executeSuccess(sfWebRequest $request) { $transaction = $this->checkSuccessAndFailParams($request); // Транзакция уже завершена, повторая попытка if ($transaction->getStatus()) { $this->forward('services', 'index'); } // Все верно, ставим флаг "оплачено" $transaction->setStatus(1); $transaction->setSuccess(1); $transaction->save(); // Создаем либо обновляем сабскрипшн $subscription = Doctrine::getTable('ServiceSubscription')->findOneByUserIdAndServiceId($transaction->getUserId(), $transaction->getServiceId()); // Если еще нет сабскрипшна на эту услугу - создаем if (!$subscription) { $subscription = new ServiceSubscription(); $subscription->setUserId($transaction->getUserId()); $subscription->setServiceId($transaction->getServiceId()); $subscription->setSubscribedTill(date('Y-m-d H:i:s', time())); } // Количество месяцев $term = (int) $request->getPostParameter("shpa", 1); // Накидываем 30 дней к услуге и умножаем на количество месяцев $subscribedTill = strtotime($subscription->getSubscribedTill()) + 3600 * 24 * 30 * $term; $subscription->setSubscribedTill(date('Y-m-d H:i:s', $subscribedTill)); $subscription->save(); $transaction->setSubscriptionId($subscription->getId()); $transaction->save(); $this->getUser()->setFlash('robokassa_status', 1); $this->forward('services', 'index'); return sfView::NONE; }